レジスタ・ファイルのサイズを削減するための手法の論文「HAIR」を読んでいる。その内容を簡単にまとめようと思う。
HAIRのレジスタ・ファイルの構成について
まず、この論文では汎用レジスタの構成について、読み込みポート・書き込みポートの多さが問題となる。
ベースラインのアーキテクチャでは、以下の図のように16読み込みポートと7つの書き込みポートを持っている。レジスタ・ファイルの面積と動作速度はこのポート数の累乗に比例するため、ポート数を削減するのは非常に重要な議論となる。
HAIRのアーキテクチャの前に、その前身であるHPAとSRAのアーキテクチャについて説明する必要があるだろう。
- SRA (Sequential Register Access)
- HPA (Half Price Architecture)
まず、SRAについて。SRAは命令が2つのオペランドを読み込む動作を、シーケンシャルに実行する。このために1つの命令で2サイクルかけて発行が行われる。1サイクルまでは、1つ目の入力オペランドを読むために疑似move uopが発行され、その結果をALU/AGUの出力にラッチする。次のサイクルで、2入力目のuopsが発行され、レジスタ・ファイルからレジスタを読み出し、1サイクル前に取得した値と組み合わせて演算器に渡される。
このSRAアーキテクチャは、1パイプラインあたりに使用するレジスタの数を半減させることができる一方で、容易に想像できるように、命令のレイテンシが1サイクル増加するため、性能に大きな影響を与える。
そこで、HPAというアーキテクチャが提案されている。HPAはSRAにより性能低下が発生する状況を避けるために、2つ目のソースオペランドが準備完了した直後に、もう一つのオペランドがバイパスロジックから取得できるようにスケジュールを調整する。これにより、1つはレジスタオペランドから、1つはバイパスロジックから読み込めるようにする。もしこれが不可能な場合、SRAモードとなって命令が発行される。
以下のように、SRA・HPAはそれぞれ完全にレジスタ・ポートを持っている場合に比べて性能は低下する。HPAのほうがSRAよりも性能低下率が小さい。
HAIRのレジスタ読み込みのマイクロ・アーキテクチャでは、レジスタ・ファイルを偶数と奇数の物理レジスタ・バンクに分ける。2つの読み込みレジスタのアドレスが同じパリティを持っている場合、バンクの競合が発生してSRAモードになる。可能な限り、このSRAモードになることを避ける必要がある。
このために、HAIRではパリティ・テーブルの導入を提案している。
- パリティテーブルの導入: パリティテーブルは、各命令にパリティビットを提供し、バンクの競合が発生した場合にパリティビットを修正して競合を解消する。このテーブルはPCベースの単純なハッシュ関数で、パリティビットは命令キャッシュアクセスと並行して読み取られる。
index = (PC ^ (PC>>L)) % (1<<L)
# なおLはパリティ・テーブルのサイズ
- パリティテーブルの更新: パリティテーブルは、バンクの競合が検出された場合に更新される。競合するμopが検出された場合、待機ビットと呼ばれる競合物理レジスタ番号(CPRN):8-bit、およびROBポインタ(RP):9-bit が使用される。競合が検出されると、CPRNは選択された入力の物理レジスタに設定され、待機ビットがセットされ、RPは競合するμopのROBエントリを指す。リタイア時にCPRNがリタイアμopの宛先物理レジスタと一致する場合、対応するパリティビットが反転される。
- パリティテーブルのエリアとハードウェアコスト: パリティテーブルは、基本IRFの約半分以下のビット数を持ち、読み取りポートが1つだけ必要である。これにより、パリティテーブルはエリアとエネルギー消費の両方でIRFよりもはるかに小さい。
- ブランチ予測の誤り: バンクの競合が検出された場合に待機ビットやCPRNとRPレジスタがセットされるが、予測された分岐が誤っていた場合、間違ったパスのパリティテーブル更新が発生する可能性がある。ただし、このような誤ったパス更新はパリティテーブルの動作に大きな問題を引き起こすとは考えられない。