RISC-Vのベクトル実装の論文を読んでいる。
https://dl.acm.org/doi/abs/10.1145/3575861
Vitruvius+というのはバルセロナスーパーコンピューティングセンターの開発しているRISC-Vベクトル拡張の実装で、初代Vitruviusの後継となる実装である。
ポイントだけまとめていく。
- 発行FIFOキューに格納
- キューのエントリ数はパラメータ化されている
- 発行ステージの制御ロジックは、キューの先頭にある命令が使用するリソースをチェックする
- 算術演算のデコード情報を解析し、バック・トゥ・バック実行を可能にする
- いわゆるレジスタチェイニング: オーバーラッピング
- 前の命令が終了する前に新しい命令を起動することで、ベクトル演算パイプラインをフルに活用することができる
- 図4.
- VRFからベクトルオペランドを読み込んでいる実行段階の命令をインバウンドと呼ぶ。
- すべてのベクトルソース要素の読み出しが完了すると、その命令はアウトバウンドとなる。
- 発行ステージの制御ロジックによって実現されるオーバーラップによって、この時点で別の命令がインバウンドとなり、ソースオペランドの読み取りを開始することで実行段階に入ることができる。
- 最初の命令が送信フェーズを終了し、すべての結果を書き戻すと、2番目の命令はそのデータを使用してスタートできる。
- 2番目の命令が結果の書き戻しをより速く進めることができる。
- Memory Unit
- Vitruvius+はメモリ階層にアクセスできない
- ベクタメモリ演算のメモリアクセスを実行するのはスカラコア
- ベクタロード
- LMU(Load Management Unit)がOVIから送られてくるデータを処理する。
- データはキャッシュライン粒度でベクターユニットに到達する。
- ベクトルストア
- ストアマネジメントユニット(SMU)によりクレジットシステムを通じてスカラーコアと相互作用する。
- アイテム管理ユニット(IMU)
- 図1のOVIのMASK_IDXバスのトランザクション管理を担当し、したがって、マスクおよび/またはインデックス付きベクトルメモリ操作の実行に関与する。
- ベクトルレジスタ
- 各レーンは VRF のスライスを保持する
- 5つのシングルポート2kB SRAM バンク
- インターリーブ方式
- つまり、最初の8バイトは常にレーン0に、次の8バイトは常にレーン1に、といった具合に配置される。
- マスク・レジスタは暗黙のうちにベクタ・レジスタv0となっているが、プレディケイテッド・オペレーションの実行時にバンクが競合する可能性を避けるため、マスク・レジスタはVRFから分離されている。
- FSM
- Execution Wrapper
- RVV仕様で規定されているすべての種類の演算をサポートしている。
- Ring Interconnect
- レーンの相互接続には単方向リングトポロジを使用する
- 1ホップ転送(あるレーンから直接隣接するレーンへのデータ転送)は1サイクル
- このリング型インターコネクトを利用することで、演算結果を隣接するレーンに部分的に転送することができる。
- リングインターコネクトは、オフセットが与えられたベクトルレジスタの要素を移動させるスライド演算と、1つのベクトルレジスタをインデックスのセットとして使用し、データソースとして使用するベクトルレジスタの任意の並べ換えを実現するベクトルレジスタギャザー演算を実行する。
- リオーダバッファ
- 演算命令やメモリ命令の実行はアウトオブオーダーで完了するため、ROB(Reorder Bufer)を使用して命令のコミット順序を維持する。
- インライト命令の情報を受け取りながら、図1のOVIのCOMPLETEDバスに1サイクルあたり1命令だけを完了とマークする。
- 例外が発生した場合、ROBはインタフェースの特定の信号を通じてスカラーコアにこのイベントを通知し、ベクターユニットが以前の安全な状態に戻る必要がある場合に備えて、内部でロールバックプロセスをトリガする。
- このとき、ROBはロールバックフェーズが終了するまで、フロントエンドで新しい命令が実行される可能性を排除する。