T-Headが提案しているRISC-VのMatrix Extensionについて、マニュアルを読みながら理解していこうと思う。
とりあえずマニュアルで、どのようなレジスタが存在しているのかを理解していく。プログラミングモデルとサンプルコードも読み進めていきたい。
行列レジスタ情報
行列レジスタ情報には、2つの読み出し専用XLENビット・レジスタがあり、これらはどの実装でも一定である。
xrlenb:各行列レジスタ行の RLEN ビットの状態を示すバイトの RLENxmlenb: 行列レジスタサイズ(バイト単位),mrows*xrlenb,mrows=RLEN/32
行列開始行
xmrstart読み書きレジスタは、行列ロード/ストア命令で実行される最初の行列行インデックスを示す。通常xmrstartは、行列ロード/ストア命令のトラップ時にのみハードウェアによって書き込まれ、レジスタの符号なし値は、再開可能なトラップが処理された後に実行が再開されるべき行を指定する。
mcfg/mcfgiを含むすべてのマトリックス命令は、xmrstart CSRをゼロにリセットする。
xmrstart CSR は、最大行インデックス(最大行より 1 つ小さい)または log2(RLEN/32) を保持するのに十分な書き込み可能ビット数のみを持つように定義されている。xmrstart CSRの上位ビットはゼロにハードワイヤリングされている(読み出しはゼロ、書き込みは無視される)。
例えば、xmrstartは0から3までの行インデックスを表す2ビットを持つ。
行列ISA
XmisaはXLENビットの読み出し専用CSRレジスタで、現在のハードウェア実装でサポートされているマトリックス命令のサブセットを指定する。
| ビット | 機能 | |
|---|---|---|
| XLEN-1:10 | 予約 | |
| 9 | MATRIX_MULT_F32F64 | オプション |
| 8 | MATRIX_MULT_F16F32 | オプション |
| 7 | MATRIX_PW_I32 | オプション |
| 6 | MATRIX_PW_I64 | オプション |
| 5 | MATRIX_MULT_F64F64 | オプション |
| 4 | MATRIX_MULT_F32F32 | オプション |
| 3 | MATRIX_MULT_F16F16 | オプション |
| 2 | MATRIX_MULT_I16I64 | オプション |
| 1 | MATRIX_MULT_I8I32 | 必須 |
| 0 | MATRIX_MULT_I4I32 | オプション |
bit[i] =1は、オプション機能がサポートされていることを示す。
MATRIX_MULT_F16F16: 行列乗算命令、ソースおよび書き込みレジスタの要素は fp16/bf16である。MATRIX_MULT_F32F32: 行列乗算命令、ソースおよび書き込みレジスタの要素は fp32である。MATRIX_MULT_F64F64: 行列乗算命令、ソースおよび書き込みレジスタの要素は fp64である。MATRIX_MULT_I8I32: 行列乗算命令、ソース・レジスタの要素は int8、書き込みレジスタの要素は int32 である。MATRIX_MULT_I16I64: 行列乗算命令で、ソース・レジスタの要素は int16、書き込みレジスタの要素は int64である。MATRIX_MULT_I4I32: 行列乗算命令で、ソース・レジスタの要素は int4、書き込みレジスタの要素は int32 であるMATRIX_PW_I32: int32ポイント演算命令MATRIX_PW_I64: int64ポイント演算命令
リセット時の行列拡張の状態
行列拡張は、リセット時に一貫した状態を持たなければならない。リセット時には CSR をゼロに設定することを推奨する。
行列コンテキスト・ステータス
行列コンテキスト・ステータス・フィールド MS は mstatus に定義され、sstatus にシャドウされる。MSフィールドは、表に示すFS/VS/XSと同じステータス・エンコーディングを使用する。
| status | ms[1:0] | 意味 |
|---|---|---|
| 0 | 2’b00 | All off |
| 1 | 2’b01 | Initial |
| 2 | 2’b10 | Clean |
| 3 | 2’b11 | Dirty |
MS が off に設定されている場合、行列命令を実行しようとしたり、マトリクス CSR にアクセスしようとすると、不正命令例外が発生する。MSがinitialまたはcleanに設定されている場合、行列の状態を変更する命令を実行すると、MSはダーティに変更されます。
実装では、初期状態のアクティビティを使用して、省電力状態の選択に影響を与えることができる。