FPGA開発日記

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

RISC-Vベクトル拡張仕様書 v1.0 を読み直す (6. ベクトルレジスタのマッピング方法)

RISC-Vベクトル拡張仕様書の読み直し。ベクトルレジスタマッピング方法について。

これはかなり難しい。つまりLMUL、SEW、VLENを定義した状態で、「ベクトルレジスタ1つ」はどこまでを含むのかという問題になる。 Groupingによりベクトルレジスタを複数扱うことになったとしても、さらにそこに新たな制約が出てくる。実装でかなり難しい部分。

github.com


4. ベクトルレジスタ状態へのベクトル要素のマッピング

以下の図は、現在のSEWおよびLMULの設定と、実装のVLENに応じて、 異なる幅の要素がどのようにベクトルレジスタのバイトに詰め込まれるかを示しています。 要素は、最下位バイトが最下位ビットになるように各ベクトルレジスタに詰め込まれます。

4.1. LMUL = 1 時のマッピング

LMUL=1の場合、要素はベクトルレジスタの最下位ビットから最上位ビットの順に単純にパックされます。

Note: 読みやすさを向上させるために、ベクトルレジスタのレイアウトは、 バイトアドレスが右から左に向かって増加するように並べられています。 要素内のビットはリトルエンディアン形式で番号付けされており、 右から左へのビットインデックスの増加は大きさの増加に対応します。

// LMUL=1 examples.
LMUL=1の例

The element index is given in hexadecimal and is shown placed at the
least-significant byte of the stored element.

要素のインデックスは16進数で与えられ、
格納された要素の最下位バイトに配置されて表示されます。

 VLEN=32b

 Byte         3 2 1 0

 SEW=8b       3 2 1 0
 SEW=16b        1   0
 SEW=32b            0

 VLEN=64b

 Byte        7 6 5 4 3 2 1 0

 SEW=8b      7 6 5 4 3 2 1 0
 SEW=16b       3   2   1   0
 SEW=32b           1       0
 SEW=64b                   0

 VLEN=128b

 Byte        F E D C B A 9 8 7 6 5 4 3 2 1 0

 SEW=8b      F E D C B A 9 8 7 6 5 4 3 2 1 0
 SEW=16b       7   6   5   4   3   2   1   0
 SEW=32b           3       2       1       0
 SEW=64b                   1               0
 SEW=128b                                  0

 VLEN=256b

 Byte     1F1E1D1C1B1A19181716151413121110 F E D C B A 9 8 7 6 5 4 3 2 1 0

 SEW=8b   1F1E1D1C1B1A19181716151413121110 F E D C B A 9 8 7 6 5 4 3 2 1 0
 SEW=16b     F   E   D   C   B   A   9   8   7   6   5   4   3   2   1   0
 SEW=32b         7       6       5       4       3       2       1       0
 SEW=64b                 3               2               1               0
 SEW=128b                                1                               0

4.2. LMUL < 1の場合のマッピング

LMUL < 1 の場合、ベクトルレジスタの最初の LMUL*VLEN/SEW 要素のみが使用される。 ベクトルレジスタ内の残りのスペースはテールの一部として扱われるため、 vtaの設定に従わなければなりません。

 // Example, VLEN=128b, LMUL=1/4
 VLEN=128b, LMUL=1/4の例

 Byte        F E D C B A 9 8 7 6 5 4 3 2 1 0

 SEW=8b      - - - - - - - - - - - - 3 2 1 0
 SEW=16b       -   -   -   -   -   -   1   0
 SEW=32b           -       -       -       0

4.3. LMUL > 1 のマッピング

ベクトルレジスタがグループ化されると、ベクトルレジスタグループの要素は、構成するベクトルレジスタ間でストライプされます。 要素は、グループ内の各ベクトルレジスタに要素順に連続して詰められ、 各ベクトルレジスタが満たされると、グループ内の次の最高番号(訳注:ここが上手く訳せない)のベクトルレジスタに移動します。

// LMUL > 1 examples

LMUL > 1の例

 VLEN=32b, SEW=8b, LMUL=2

 Byte         3 2 1 0
 v2*n         3 2 1 0
 v2*n+1       7 6 5 4

 VLEN=32b, SEW=16b, LMUL=2

 Byte         3 2 1 0
 v2*n           1   0
 v2*n+1         3   2

 VLEN=32b, SEW=16b, LMUL=4

 Byte         3 2 1 0
 v4*n           1   0
 v4*n+1         3   2
 v4*n+2         5   4
 v4*n+3         7   6

 VLEN=32b, SEW=32b, LMUL=4

 Byte         3 2 1 0
 v4*n               0
 v4*n+1             1
 v4*n+2             2
 v4*n+3             3

 VLEN=64b, SEW=32b, LMUL=2

 Byte         7 6 5 4 3 2 1 0
 v2*n               1       0
 v2*n+1             3       2

 VLEN=64b, SEW=32b, LMUL=4

 Byte         7 6 5 4 3 2 1 0
 v4*n               1       0
 v4*n+1             3       2
 v4*n+2             5       4
 v4*n+3             7       6

 VLEN=128b, SEW=32b, LMUL=2

 Byte        F E D C B A 9 8 7 6 5 4 3 2 1 0
 v2*n              3       2       1       0
 v2*n+1            7       6       5       4

 VLEN=128b, SEW=32b, LMUL=4

 Byte          F E D C B A 9 8 7 6 5 4 3 2 1 0
 v4*n                3       2       1       0
 v4*n+1              7       6       5       4
 v4*n+2              B       A       9       8
 v4*n+3              F       E       D       C

4.4. 混合幅演算でのマッピングについて

ベクトルISAは、明示的な追加再配置命令を必要とせずに、混合幅の演算をサポートするように設計されています。 異なる精度のベクトルを操作する場合、推奨されるソフトウェア戦略は、vtype を動的に変更して、 SEW/LMULを一定に保つことです(したがって、VLMAXも一定になります)。

次の例では、VLEN=128bの実装において、4つの異なるパックエレメント幅(8b、16b、32b、64b)を示しています。 ベクトルレジスタのグループ化係数(LMUL)は、各グループが同じ数のベクトル要素(この例ではVLMAX=8)を保持できるように、 相対的な要素サイズによって増加し、ストリップマイニングコードを簡素化します。

Example VLEN=128b, with SEW/LMUL=16

Byte      F E D C B A 9 8 7 6 5 4 3 2 1 0
vn        - - - - - - - - 7 6 5 4 3 2 1 0  SEW=8b, LMUL=1/2

vn          7   6   5   4   3   2   1   0  SEW=16b, LMUL=1

v2*n            3       2       1       0  SEW=32b, LMUL=2
v2*n+1          7       6       5       4

v4*n                    1               0  SEW=64b, LMUL=4
v4*n+1                  3               2
v4*n+2                  5               4
v4*n+3                  7               6

次の表は、幅が混在しているループで考えられる一定のSEW/LMULの動作点を示しています。 各列は一定のSEW/LMUL動作点を表しています。 表のエントリは、その行のデータ幅に対して、その列のSEW/LMUL値をもたらすLMUL値です。 各列のデータ幅のLMUL設定は、同じ列のLMUL設定を持つ他のデータ幅と、すべてが同じVLMAXになるように整列できることを示しています。

4.5. LMUL > 1 かつ ELEN > VLEN のマッピング

より大きなSEWをサポートするためにベクトルレジスタがグループ化され、ELEN > VLENとなった場合、 グループ内のベクトルレジスタは連結されて1つのバイト配列となり、 グループ内で最も番号の低いレジスタが、メモリレイアウトから最も低いアドレスのバイトを保持します。

 LMUL > 1 ELEN>VLEN, examples

 VLEN=32b, SEW=64b, LMUL=2

 Byte         3 2 1 0
 v2*n               0
 v2*n+1

 VLEN=32b, SEW=64b, LMUL=4

 Byte         3 2 1 0
 v4*n               0
 v4*n+1
 v4*n+2             1
 v4*n+3

 VLEN=32b, SEW=64b, LMUL=8

 Byte         3 2 1 0
 v8*n               0
 v8*n+1
 v8*n+2             1
 v8*n+3
 v8*n+4             2
 v8*n+5
 v8*n+6             3
 v8*n+7

4.6. マスクレジスタのレイアウト

ベクトルマスクは、SEWやLMULに関係なく、1つのベクトルレジスタのみを占有します。 各要素には、マスクベクタレジスタに1つのマスクビットが割り当てられます。

Note: 初期のデザイン(0.9以前)では、マスク値あたりのビット数(MLEN)が変化していました。 0.9デザインでは、MLEN=1です。

4.6.1. マスク要素の場所

要素 i のマスクビットは、SEWやLMULとは関係なく、マスクレジスタのビット i に配置されます。

 VLEN=32b

          Byte    3   2   1   0
 LMUL=1,SEW=8b
                  3   2   1   0  Element
                [03][02][01][00] Mask bit position in decimal

 LMUL=2,SEW=16b
                      1       0
                    [01]    [00]
                      3       2
                    [03]    [02]

 LMUL=4,SEW=32b               0
                            [00]
                              1
                            [01]
                              2
                            [02]
                              3
                            [03]
 LMUL=2,SEW=8b
                  3   2   1   0
                [03][02][01][00]
                  7   6   5   4
                [07][06][05][04]

 LMUL=8,SEW=32b
                              0
                            [00]
                              1
                            [01]
                              2
                            [02]
                              3
                            [03]
                              4
                            [04]
                              5
                            [05]
                              6
                            [06]
                              7
                            [07]

 LMUL=8,SEW=8b
                  3   2   1   0
                [03][02][01][00]
                  7   6   5   4
                [07][06][05][04]
                  B   A   9   8
                [11][10][09][08]
                  F   E   D   C
                [15][14][13][12]
                 13  12  11  10
                [19][18][17][16]
                 17  16  15  14
                [23][22][21][20]
                 1B  1A  19  18
                [27][26][25][24]
                 1F  1E  1D  1C
                [31][30][29][28]