6

動的言語 VM 実装に関する JIT 設計を研究しています。私は 8086/8088 の頃からあまり組み立てを行っていません。ほんの少しだけです。

私が理解しているように、x86 (IA-32) アーキテクチャには、今日でも以前と同じ基本的な制限付きレジスタ セットがありますが、内部レジスタの数は大幅に増加していますが、これらの内部レジスタは一般的には利用できず、レジスタの名前変更で使用されます。他の方法では並列化できないコードの並列パイプライン化を実現します。私はこの最適化をかなりよく理解していますが、これらの最適化は全体的なスループットと並列アルゴリズムに役立ちますが、制限されたレジスターセットがまだ残っているため、x86 でレジスターが 2 倍または 4 倍になると、レジスターの流出オーバーヘッドが増加します。通常の命令ストリームでは、プッシュ/ポップ オペコードが大幅に少ない可能性があります。または、私が気付いていないこれを最適化する他のプロセッサの最適化がありますか? 基本的に私なら

研究、またはさらに良いことに、個人的な経験への言及はありますか?

編集:x86_64には16個のレジスタがあり、これはx86-32の2倍です。修正と情報に感謝します。

4

2 に答える 2

10

命令のレイテンシーによるバブルを隠すためにレジスターの名前を変更することに加えて、ほとんどのx86アーキテクチャーは、プッシュとポップをカウントし、それらの名前をレジスターに変更するのに十分スマートです。x86の命令デコーダーは実際に一種のJITコンパイルを実行し、x86命令ストリームをトレースキャッシュに格納された小さなマイクロコードプログラムに変換することを忘れないでください。このプロセスの一部には、小さなオフセットのスタック負荷をインターセプトし、それらをレジスタに変換することも含まれます。したがって、次のようなものがあります(たとえば、明らかにばかげて純粋に):

lwz eax,[ebp]
lwz ebx,[ebp+4]
add eax,[edx+0]
push eax 
lwz eax,[ebp+8]
add eax,ebx
pop ebx
add eax,ebx

次のようなものになります(内部レジスタの名前はr0..r16のようになります)。

lw r3, edx
lw r1, ebp
lw r2, ebp+4 ; the constant '4' is usually stored as an immediate operand
add r1,r2
or r4,r1,r1 ;; move r1 to r4
lw r1, ebp+8
add r1,r2
or r2,r4,r4
add r1,r2

もちろん、魔法のようにスマートなデコーダー(実際にトランジスタ数に収まるものとは異なります)は、そこで不要な動きの一部を折りたたむでしょうが、私が指摘しているのは、プッシュ/ポップとストア/ロードesp+(some small number)が実際にシャドウレジスターに変わるということです。

于 2010-03-17T07:10:58.563 に答える
4

2つのポイント:

(1)x86-64はレジスタ数を2倍の16に増やします

(2)最新のx86 CPUでは、すでにL1キャッシュにあるメモリ位置を使用する命令は、レジスタオペランドを使用した同じ操作とほぼ同じ速度であるため、L1を「レジスタメモリ」とほぼ見なすことができます。

于 2010-03-17T10:23:05.437 に答える