疑似アセンブリで、高価な計算の後にレジスターを古典的に再利用することを考えてみましょう。
r2 = cos(r1)
*(r3) = r2
r2 = r5 + r6
*(r4) = r2
算術ユニットを完全に使用できるようにするために、実行ユニットは次のようにします。
r2 = cos(r1)
*(r3) = r2
並行して:
r2bis = r5 + r6
*(r4) = r2bis
ここで、r2bis は仮想化された (または名前が変更された) r2 レジスタです。
ここで、レジスターの貧弱な CPU で作業し (または、多数あるが既に使用されている)、一時的なスタックの場所にデータを配置するとします。
*(sp+C) = cos(r1)
*(r3) = *(sp+C)
*(sp+C) = r5 + r6
*(r4) = *(sp+C)
アドレスがわかっているメモリ位置 ((sp+C) は既に計算できるため) が実行ユニットによって仮想化され、同じ 2 つの実行を並行して進めることができる場合はありますか?
コンパイラーは、それほど制約されていないスタック空間 (非常に制約されたレジスター空間とは異なります) で別の場所を見つけるタスクを課される可能性があるため、このケースは非常にばかげているように見えるかもしれません。しかし、仮想化されたメモリが短期間のデータをメモリに保存する必要がある条件分岐の投機的な実行を可能にする可能性があるため、他のケースはそれほど愚かではないかもしれません。これは、Java のようにオブジェクト フィールドをレジスタに入れる簡単な方法がない言語では特に重要です。「参照」(ポインタ) エスケープを除外して、new
動的割り当てを回避し、Java を有効にする必要があります。クラスのインスタンスを C++ クラスの自動インスタンス (スタック割り当てまたはレジスタ内) に変換します。(そして、C++ でさえthis
、単純なフラット クラスの一見単純な使用法では、実際のポインターを持たないという問題があります。)