FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (3. vta/vmaフィールド)

RISC-Vベクトル拡張仕様書の読み直し、次はvta / vmaについて。

これも理解するのは少し厄介。要するに無効な要素の扱いをどのようにするかということだが、 リネームするマシンとそうでないマシンで、効率よく実装するために色々と考え込まれている。


3.3.3. Tail Agnostic とVector Mask Agnostic vta と vma

これらの2つのビットは、ベクトル命令の実行中に、書き込みレジスタのTail要素および 書き込みレジスタの非アクティブなマスクオフされた要素の動作をそれぞれ変更します。 Tailセットと非アクティブセットには、Prestart, Active, Inactive, Body, and Tail Element Definitions 項で定義されているように、 ベクトル演算中に新しい結果を受け取らない要素の位置を含んでいます。

すべてのシステムは、4つのオプションすべてをサポートしなければなりません。

vta vma Tail要素 非アクティブ要素
0 0 undisturbed undisturbed
0 1 undisturbed agnostic
1 0 agnostic undisturbed
1 1 agnostic agnostic

セットがundisturbedに設定されている場合、ベクトルレジスタグループ内の対応するセットの書き込み要素は、 以前に保持していた値を保持します。 マスクの書き込み値は、vta の設定にかかわらず、 常にTail Agnosticとして扱われます。

セットがAgnosticとしてマークされている場合、任意のベクトル書き込みオペランドの書き込み要素の対応するセットは、 以前保持していた値を保持するか、1で上書きされるかのいずれかになります。 1つのベクトル命令の中で、各書き込み要素は、任意の組み合わせで、1を残したり、1で上書きしたりすることができ、 同じ入力で命令を実行したときに、1を残したり、1で上書きしたりするパターンは、常に決定している必要はありません。 また、マスクロード命令を除き、マスク結果の末尾にある任意の要素には、 マスク生成演算が vl=VLMAX で計算したであろう値を書き込むこともできます。

Note: Agnosticポリシーは、ベクトルレジスタをリネームするマシンや、 深い一時的なベクトルレジスタを持つマシンに対応するために追加されました。 Agnosticなポリシーでは、新しい物理書き込みベクトルレジスタにコピーするために、 すべての要素を古い物理書き込みベクトルレジスタから読み込まなければなりません。 これは、これらの非アクティブまたはTail値が後続の計算に必要でない場合、効率が悪くなります。

Note: マスクテールは、ビット単位で記述可能なマスクデータの管理の複雑さを軽減するために、常にAgnosticに扱われます。 マスクレジスタ値のTail Undisturbedをサポートするソフトウェアの必要性はほとんどないと思われます。 マスクを生成する命令が命令の結果を書き戻すことを許可すると、Tailをマスクアウトするロジックの必要性がなくなります。 ただし、マスクロードは、ソフトウェアの意図を超えてメモリにアクセスすることになるため、 宛先のマスクテールにメモリ値を書き込むことはできません。

Note: 上書き値として、All-0ではなくAll-1を選択したのは、 ソフトウェア開発者が書き込まれた値に依存しないようにするためです。

Note: シンプルなインオーダー実装であれば、この設定を無視して、単純にundisturbedポリシーですべてのベクター命令を実行することができます。 互換性とスレッドの移行をサポートするために、vta と vma のステートビットは vtype で提供されなければなりません。

Note: アウトオブオーダーの実装では、実装の複雑さを軽減するために、 tail-agnostic + mask-agnostic を tail-agnostic + mask-undisturbed を使って実装することを選択できます。

Note: agnosticポリシーの定義は、小さなインオーダコア上のhart(おそらくagnostic領域は邪魔されずに残る)と、 レジスタリネーミングのある大きなアウトオブオーダコア上のhart(おそらくagnostic要素を1で上書きする)の間でアプリケーションスレッドを移行することに対応するため、 緩く残されています。 途中で再起動する必要があるかもしれないので、1つのベクトル命令の中で、Agnosticなポリシーを任意に混在させることができます。 このようなポリシーの混在を許容することで、 例えば、アクティブに操作されている要素内ではundisturbedを使用し、テールの要素ではすべて1にリネームするなど、 ベクターレジスタの異なる要素に対してポリシーを変更するような実装も可能になります。

アセンブリ構文では、 vsetvli 命令に2つのフラグが追加されています。

 ta   # Tail agnostic
 tu   # Tail undisturbed
 ma   # Mask agnostic
 mu   # Mask undisturbed

 vsetvli t0, a0, e32, m4, ta, ma   # Tail agnostic, mask agnostic
 vsetvli t0, a0, e32, m4, tu, ma   # Tail undisturbed, mask agnostic
 vsetvli t0, a0, e32, m4, ta, mu   # Tail agnostic, mask undisturbed
 vsetvli t0, a0, e32, m4, tu, mu   # Tail undisturbed, mask undisturbed

Note: 短期的には後方互換性を維持し、0.9 への移行時にはソフトウェアの変更を減らすために、これらのフラグが vsetvli に指定されていない場合は、 デフォルトで mask-undisturbed/tail-undisturbed とすべきです。 しかし、これらのフラグを持たない vsetvli の使用は非推奨とし、 フラグ設定の指定が必須となるようにします。 どちらかというと、デフォルトはtail-agnostic/mask-agnosticにすべきなので、 ソフトウェアは非アクティブ要素を気にするタイミングを指定する必要がありますが、 これらのフラグが導入される前の命令の歴史的な意味を考えると、 将来のアセンブリコードでは常にフラグを要求するのが最も安全です。