FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (8. ベクトルの各要素の定義)

RISC-Vベクトル拡張仕様書の読み直し。ベクトルレジスタの要素の定義

ベクトルレジスタはマスクしたりプリスタートで実行を省略したりと、さまざまなモードがある。 それらの要素の意味を厳密に定義するのが本章の目的。

github.com

github.com


5.4. プリスタート、アクティブ、非アクティブ、ボディ、末尾要素の定義

ベクトル命令の実行時に操作される出力要素のインデックスは、3つのサブセットに分けられます。

  • プリスタート 要素は、要素のインデックスが vstart レジスタの初期値よりも小さいものです。 プリスタート要素は、例外を発生させず、書き込みベクトルレジスタも更新しません。

  • ボディ 要素は、要素のインデックスが vstart レジスタの初期値以上で、 vl の現在のベクトル長設定よりも小さいものです。ボディは2つの分離したサブセットに分割することができます。

    • ベクトル命令の実行中の アクティブ 要素は、ボディ内の要素で、 その要素位置で現在のマスクが有効になっているところです。 アクティブな要素は、例外を発生させたり、書き込みベクトルレジスタグループを更新することができます。
    • 非アクティブ 要素は、ボディ内の要素で、その要素の位置で現在のマスクが無効になっている要素です。 非アクティブな要素は, masked agnostic が指定されていない限り (vtype.vma=1), 例外を発生させず、書き込みベクトルレジスタグループを更新しません。 この場合,非アクティブな要素は 1 で上書きされる可能性があります。
  • ベクトル命令実行中の 末尾 要素は、vl で指定された現在のベクトル長設定を超えた要素です。 末尾要素は例外を発生させず、Tail Agunostics指定されていない限り (vtype.vta=1)、 書き込みベクトルレジスタグループを更新しません。 この場合、末尾要素は 1 で上書きされるか、マスクロードを除くマスク生成命令の場合は命令の結果で上書きされる可能性があります。 LMUL < 1の場合、末尾には同じベクタレジスタに保持されているVLMAX以降の要素が含まれます。

    for element index x
    prestart(x) = (0 <= x < vstart)
    body(x)     = (vstart <= x < vl)
    tail(x)     = (vl <= x < max(VLMAX,VLEN/SEW))
    mask(x)     = unmasked || v0.mask[x] == 1
    active(x)   = body(x) && mask(x)
    inactive(x) = body(x) && !mask(x)

vstart ≥ vl のとき、ボディの要素はなく、どの書き込みベクトルレジスタグループの要素も更新されず、 これは末尾要素がagnosticな値で更新されないことも含みます。

Note: 結果として、vl=0のときには、vstartにかかわらず、 書き込みベクトルレジスタグループはAgnosticな要素を含めて、いかなる要素も更新されません。 x レジスタや f レジスタを書き込む命令は、 vl =0のときも含めて、vstart ≥ vl のときにも実行されます。

Note: vslidedown や vrgather などの一部の命令は、ソースベクトルレジスタグループの vl または VLMAX を超えるインデックスを読み取ることがあります。 一般的なポリシーは、インデックスがソースベクトルレジスタグループのVLMAXよりも大きい場合、値0を返します。