FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (7. ベクトル命令のオペランドフォーマット)

RISC-Vベクトル拡張仕様書の読み直し。ベクトルレジスタオペランドフォーマット。

基本的にスカラレジスタとオーバラップすることはない。ただしベクトルレジスタの中でv0だけが特殊で、マスクレジスタとして扱われることに注意。

マスクレジスタはベクトルレジスタのグルーピングとは関係なく、常に1本のレジスタとして指定される。

github.com

github.com


5. ベクトル命令フォーマット

ベクトル拡張の命令は、既存の2つのメジャーオペコード(LOAD-FP、STORE-FP)と1つの新しいメジャーオペコード(OP-V)に当てはまります。

ベクトルのロードとストアは、スカラー浮動小数点のロードとストアのメジャーオペコード(LOAD-FP/STORE-FP)の中にエンコードされます。 ベクトルロード/ストアのエンコーディングは、標準的なスカラ浮動小数点ロード/ストアの12ビット即値フィールドの一部を再利用して、 さらにベクトル命令のエンコーディングを行い、ビット25には標準的なベクトルマスクビット ( Mask Encoding を参照)を格納します。

ベクトル命令は、スカラーまたはベクトルのソースオペランドを持ち、 スカラまたはベクトルの結果を生成することができ、 ほとんどのベクトル命令は、無条件またはマスクの下で条件付きで実行することができます。

ベクトルのロードとストアは、ベクトルのレジスタ要素とメモリの間でビットパタンを移動させます。 ベクトル演算命令は、ベクトルレジスタ要素に保持された値を演算します。

5.1. スカラオペランド

スカラオペランドは即値、または x レジスタ、f レジスタ、またはベクトルレジスタの要素 0 から取得することができます。 スカラの結果は x または f レジスタ、またはベクトルレジスタの要素 0 に書き込まれます。 現在の LMUL の設定に関わらず、どのベクターレジスターもスカラーを保持するために使用できます。

Note: v0.6 からの変更点として、浮動小数レジスタがベクトルレジスタをオーバーレイしなくなり、スカラーは整数または浮動小数レジスタから得られるようになりました。 f レジスタをオーバーレイしないことで、ベクトルレジスタが圧迫させないようにし、 標準的な呼び出し規則との相互作用を避け、高性能なスカラー浮動小数点の設計を簡素化し、Zfinx ISA オプションとの互換性を実現します。 f とv を重ねると、実装によってはステート・ビット数を減らせるというメリットがありますが、 高性能な設計が複雑になり、Zfinx ISAオプションとの互換性もなくなります。

5.2. ベクトルオペランド

各ベクトルオペランドは、ベクタレジスタグループ内のすべての要素のサイズと位置を決定するために使用される effective element width (EEW) と effective _LMUL (EMUL)を持っています。 デフォルトでは、ほとんどの命令のほとんどのオペランドで、EEW=SEW、EMUL=LMULとなります。

ベクトル命令の中には、ソースと書き込みベクトルオペランドの要素数が同じでも幅が異なるものがあり、 その場合、EEWとEMULはそれぞれSEWとLMULと異なりますが、EEW/EMUL = SEW/LMULとなります。 例えば、Widening演算命令の多くは、ソースグループがEEW=SEW、EMUL=LMULで、 書き込みグループがEEW=2SEW、EMUL=2LMULとなっています。 Narrowing命令は、ソースオペランドはEEW=2SEW、EMUL=2LMULですが、 書き込みレジスタはEEW=SEW、EMUL=LMULです。

ベクトルオペランドまたは演算結果は、EMULに応じて1つまたは複数のベクトルレジスタを占めることがありますが、 常にグループ内で最も低い番号のベクトルレジスタを使用して指定されます。 ベクトルレジスタグループの指定に最下位のベクトルレジスタ以外を使用するエンコーディングは予約されています。

書き込みベクトルレジスタグループは、次のいずれかが成立する場合に限り、 ソースベクトルレジスタグループとオーバーラップすることができます。

  • 書き込みレジスタのEEWとソースのEEWが等しい。
  • 書き込みレジスタのEEWがソースのEEWよりも小さく、オーバーラップする部分がソースのレジスタグループの最も低い番号の部分である(例えば、LMUL=1の場合、 vnsrl.wi v0, v0, 3 は合法だが、v1 の書き込みは合法ではない)。
  • 書き込みレジスタのEEWがソースのEEWよりも大きく、ソースのEMULが少なくとも1であり、オーバーラップが書き込みレジスタグループの最も高い番号の部分にある場合(例えば、LMUL=8の場合、 vzext.vf4 v0, v6 は合法ですが、ソースの v0 、 v2 、v4 は合法ではない)。

レジスタグループのオーバーラップ制約のために、マスク要素はEEW=1となります。

ある命令で使用される最大のベクトルレジスタグループは、8個以上のベクトル・レジスタであってはならず(すなわち、EMUL≤8)、 ベクトル命令が8個以上のベクトルレジスタグループを必要とする場合には、その命令エンコーディングは予約されます。 例えば、LMUL=8のときにWideringされたベクトルレジスタ群の結果を得るWidening演算は、EMUL=16の結果を意味するため、予約されます。

Wideningされたスカラ値(Wideningリダクション演算の結果など)は、 ベクトルレジスタの最初の要素に保持され、EMUL=1となる。

Note: 現在のリダクション演算は、入力値と出力値を単一のベクトルレジスタに保持するように定義されており、 暗黙のうちにEMULが1となるため、wide スカラリダクションの結果を保持するためにベクトルレジスタグループを使用することはできません。 この場合、スカラリダクション要素のEMULを指定する独立したパラメータが必要になります。

5.3. ベクトルマスキング

マスキングは多くのベクトル命令でサポートされています。 マスクオフされた(非アクティブな)要素の操作は、例外を発生させません。 マスクオフされた要素に対応する書き込みベクトルレジスタの要素は、vtype の vma ビットの 設定に応じて、mask-undisturbedまたはmask-agnosticのいずれかのポリシーで処理されます(セクション Tail Agnostic とVector Mask Agnostic vta と vma )。

マスクされたベクトル命令の実行を制御するために使用されるマスク値は、 常にベクトルレジスタ v0 によって提供されます。

Note: 将来のベクトル拡張は、完全なマスクレジスタ指定のためのスペースを持つ、 より長い命令エンコーディングを提供するかもしれません。 マスクド・ベクトル命令の書き込みベクタレジスタグループは、書き込みベクタレジスタにマスク値(比較など)やリダクションのスカラー結果が書き込まれていない限り、 ソースマスクレジスタ(v0)とオーバーラップすることはできません。 これらの命令エンコーディングは予約済みです。

Note: この制約は、非ゼロの vstart 値でのリスタートをサポートします。 Note: v0.8では有効だったv0を対象としたいくつかのマスクされた命令は、v1.0の新しいMLEN=1のマスク・レイアウトでは違法となります。 例えば、 vadd.vv v0, v1, v2, v0.m は、以前は LMUL=1 の場合には合法でしたが、現在は常に違法です。 作業用マスクの値を保持するために他のベクトルレジスタを使用することができ、 述語計算を行うためのマスクベクトル論理演算が提供されています。 を参照してください。

Tail Agnostic とVector Mask Agnostic vta と vma で規定されているように、マスクの書き込み値は vta の設定にかかわらず、 常に tail-agnostic として扱われます。