レジスタリネーミングとは
レジスタリネーミングは、
コンピュータのプログラムにおけるレジスタの再利用によって生じる不必要な順序依存性を解消するための技術です。プログラムは、一連の命令が値を操作する形で構成されており、各値にはレジスタという名前付きの記憶場所が割り当てられます。多くのプロセッサでは、命令をコンパクトに保つために、高速に読み書きできる少数の特別なレジスタを使用しています。
しかし、命令の種類によって処理時間が異なり、例えばメモリからのロードには時間がかかるため、
アウト・オブ・オーダー実行によって命令の実行順序がプログラムの指定順序と異なる場合があります。このとき、レジスタの再利用が原因で、本来依存関係のない命令同士が互いに待ち合わせなければならない状況が発生します。この問題を解決するのがレジスタリネーミングです。
具体的には、命令が使用するレジスタを、実際には異なる物理レジスタに動的に割り当てることで、見かけ上の依存関係を取り除き、命令の並列実行を可能にします。これにより、プログラムの実行速度を大幅に向上させることができます。
レジスタリネーミングが必要となる背景
プログラムは、一連の命令と、それらが操作する値で構成されます。各値には名前が付けられ、プロセッサはそれらの値を格納する場所としてレジスタを使用します。しかし、レジスタの数は限られているため、プログラムは同じレジスタを異なる値のために再利用することがあります。
プロセッサは、命令を効率的に実行するために
アウト・オブ・オーダー実行という手法を採用することがあります。これは、命令の依存関係を解析し、実行可能な命令を順不同で実行する技術です。しかし、レジスタの再利用によって、見かけ上の依存関係が発生し、
アウト・オブ・オーダー実行のメリットが十分に活かせない場合があります。
例えば、ある命令がレジスタに値を書き込む前に、別の命令が同じレジスタから読み込もうとする場合、後者の命令は前者の命令が完了するまで待機しなければなりません。これは、本来依存関係のない命令間でも発生する可能性があり、プログラムの実行速度を低下させる要因となります。レジスタリネーミングは、このような偽の依存関係を取り除くことで、
アウト・オブ・オーダー実行の効率を高めます。
レジスタリネーミングの仕組み
レジスタリネーミングは、命令が参照する「アーキテクチャ上のレジスタ」を、実際にデータを格納する「物理レジスタ」に動的に対応付けることで実現されます。この対応付けは、命令が実行されるたびに変化し、同じアーキテクチャ上のレジスタでも、異なるタイミングでは異なる物理レジスタが割り当てられることがあります。
レジスタリネーミングの基本的な考え方は、以下の通りです。
1.
アーキテクチャ上のレジスタ:プログラムが命令で使用するレジスタの名前。例えば、x86アーキテクチャのEAX、EBXなど。
2.
物理レジスタ:実際にデータを格納するハードウェア上のレジスタ。通常、アーキテクチャ上のレジスタよりも多い数が用意される。
3.
リネーミング:命令が参照するアーキテクチャ上のレジスタを、空いている物理レジスタに割り当てること。
4.
リマップテーブル:アーキテクチャ上のレジスタと物理レジスタの対応関係を記録するテーブル。
命令がデコードされる際、リネーミング機構はリマップテーブルを参照し、命令が参照するアーキテクチャ上のレジスタに対応する物理レジスタを割り当てます。これにより、異なる命令が同じアーキテクチャ上のレジスタを使用している場合でも、実際には異なる物理レジスタにアクセスするため、依存関係が解消されます。
レジスタリネーミングの種類
レジスタリネーミングには、大きく分けて2つの方式があります。これらの方式は、データ格納回路の構成によって区別されます。
タグインデックス付きレジスタファイル
この方式では、大きな物理レジスタファイルがあり、各物理レジスタはタグによって識別されます。リネーミング段階で、アーキテクチャ上のレジスタはタグに変換され、そのタグに対応する物理レジスタが使用されます。
命令が
実行ユニットに発行される際、ソースレジスタのタグが物理レジスタファイルに送られ、対応するレジスタの内容が
実行ユニットに渡されます。命令の実行結果は、結果を格納する物理レジスタのタグとともに発行され、後の命令がその値を必要とする際に使用されます。
予約機構
この方式では、小さなレジスタファイルが複数存在し、それぞれが個々の
実行ユニットに対応しています。命令は、デコードされると予約機構のいずれかのエントリに格納され、命令が実行される際に、対応するレジスタファイルからオペランドの値が
実行ユニットに送られます。
この方式では、各命令のオペランドがレジスタファイル内の場所に割り当てられ、
実行ユニットに命令が発行されると、対応するレジスタファイルからオペランドの値が
実行ユニットに送られます。
その他の要素
アーキテクチャ上のレジスタファイル
コミットされたマシンの状態を表し、論理レジスタ番号でインデックスされたRAMです。
Future File
最も投機的に使用されているレジスタ状態を格納し、論理レジスタ番号でインデックスされたRAMです。
History Buffer
Future Fileと組み合わせて使用され、上書きされるレジスタの古い値を格納します。
Reorder Buffer (ROB)
実行中の命令に関する情報を順番に並べたもので、History Bufferとは異なり、Future FileとRRFの間に存在します。
各方式の比較
タグインデックス付きレジスタファイルと予約機構の主な違いは、レジスタファイルの構成と、命令の実行に必要なデータの保持方法にあります。
- - タグインデックス付きレジスタファイル:大きなレジスタファイルを使用し、命令の実行に必要なデータは物理レジスタファイルに格納されます。命令の実行に必要なデータは、タグを通じて物理レジスタファイルから取得されます。
- - 予約機構:小さなレジスタファイルを複数使用し、命令の実行に必要なデータは予約機構のエントリに格納されます。命令は、予約機構からデータを取得して実行されます。
予約機構はリネームから実行までの遅延時間が短く、タグ生成と例外処理も単純です。しかし、結果を格納する場所が複数あるため、回路規模が大きくなる傾向があります。
レジスタリネーミングの歴史
初期の
アウト・オブ・オーダー実行マシンでは、レジスタリネーミングにTomasuloのアルゴリズムが使用されていました。
1990年には、POWER1がレジスタリネーミングと
アウト・オブ・オーダー実行を実装した最初の
マイクロプロセッサとなりました。
初期のマシンでは、リネーミング機構とROB/PRFを分離していませんでしたが、最近のマシンでは論理レジスタ番号でインデックスされたマップテーブルをRAMとして持っています。
まとめ
レジスタリネーミングは、
CPUの性能を最大限に引き出すための重要な技術です。命令の並列実行を促進し、プログラムの実行速度を大幅に向上させます。この技術は、現代の高性能プロセッサには欠かせないものとなっており、今後もさらなる発展が期待されます。