レジスタ・ファイルのサイズを削減するための手法の論文「HAIR」を読んでいる。その内容を簡単にまとめようと思う。
もうちょっとパリティの構造について例を考えながら考察したいと思う。 例えば、以下のような命令のシーケンスを考える。
ld x10, 0(x11) add x12, x10, x13
物理レジスタはフリーリストから取得するが、その時の物理レジスタ・アドレスが偶数・奇数バンクのどちらになるのかは、パリティテーブルに記録している当該PCのパリティ情報に依存する。
この時、addの使用するx10の物理レジスタ・アドレス=30、x13の物理レジスタ・アドレス=40であるとする。 こうすると、それぞれの入力レジスタのアドレスが偶数バンクとなり、コンフリクトが生じることになる。
これを検知すると、add命令はSRAモードに変更されて動作するわけだが、ROBがこのモードを検出する。
- waitビットをセットする
- CPRNにコンフリクトが生じたレジスタ・アドレス=30を記録する
- RPにコンフリクトが生じたROBのエントリIDを記録する
この時に、何をしなければならないのかというと、ld命令が物理レジスタ・アドレス=30に書き込まず、奇数物理レジスタ・アドレスに書き込めばよい。
このために、上記のld命令がリタイア時にCPRNとwaitビットをチェックする。
waitビット=1であり、かつCPRNが同一である(ld命令はx10を書き込むので物理レジスタ・アドレス=30のはずである)ならば、ld命令が属するパリティビットを反転する。
こうすることにより、次回の命令実行中にld命令は奇数バンクに書き込むことになり、add命令はバンクがぶつかることを避けることができる。
最後に、RPに相当する命令がリタイアされると、waitビットをクリアする。
さらに、add命令がwaitビットを設定する前に、ld命令がリタイアする可能性を考慮して、waitビットがクリアされるタイムアウトも考慮しておく。