すべてのベクター組み込み関数には、AI エンジン ベクター レジスタにオペランドが存在している必要があります。次の表に、ベクター レジスタのセットと、小さなレジスタを組み合わせて大きなレジスタを形成する方法を示します。
128 ビット | 256 ビット | 512 ビット | 1024 ビット | |
---|---|---|---|---|
vrl0 | wr0 | xa | ya | N/A |
vrh0 | ||||
vrl1 | wr1 | |||
vrh1 | ||||
vrl2 | wr2 | xb | yd (msbs) | |
vrh2 | ||||
vrl3 | wr3 | |||
vrh3 | ||||
vcl0 | wc0 | xc | N/A | N/A |
vch0 | ||||
vcl1 | wc1 | |||
vch1 | ||||
vdl0 | wd0 | xd | N/A | yd (lsbs) |
vdh0 | ||||
vdl1 | wd1 | |||
vdh1 |
基本となる最下層のハードウェア レジスタは 128 ビット幅で、接頭辞 v が付いています。v レジスタを 2 つ組み合わせて 256 ビット レジスタを構成できます (接頭辞 w)。wr、wc、および wd レジスタを 2 つ組み合わせて 512 ビット レジスタ (xa、xb、xc、および xd) を構成します。xa と xb で 1024 ビット幅の ya レジスタを構成し、xd と xb で 1024 ビット幅の yd レジスタを構成します。つまり、xb レジスタは ya レジスタと yd レジスタ間で共有されます。xb には、ya レジスタと yd レジスタ両方の最上位ビット (MSB) が含まれます。
ベクター レジスタ名を chess_storage
指示子と共に使用すると、ベクター データを特定のベクター レジスタに格納できます。次に例を示します。
aie::vector<int32,8> chess_storage(wr0) bufA;
aie::vector<int32,8> chess_storage(WR) bufB;
chess_storage
指示子に大文字が使用されている場合はレジスタ ファイル (4 つの wr レジスタのいずれかなど) を意味し、小文字が使用されている場合は特定のレジスタ (上記のコード例では wr0) のみが選択されることを意味します。
ベクター レジスタは有益なリソースです。コード生成中にコンパイラで使用可能なベクター レジスタを足りなくなった場合、収まらなかったレジスタの内容はローカル メモリに格納され、必要に応じて読み出されます。これにより、クロック サイクル数が増加します。
カーネルの実行中に使用されるベクター レジスタの名前は、カーネルのマイクロコード内にベクター ロード/ストアおよびその他のベクター ベース命令に対して表示されます。このマイクロコードは、Vitis IDE の [Disassembly] ビューに表示されます。Vitis IDE の使用に関する詳細は、Vitis 統合 IDE およびレポートの使用 を参照してください。
多くの組み込み関数には特定のベクター データ型のみを使用可能ですが、ベクターからのすべての値が必要とは限りません。たとえば、一部の組み込み関数には 512 ビット ベクターのみを使用可能です。カーネル コードのデータ サイズが小さい場合、concat()
組み込み関数を使用して、この小さいサイズのデータを未定義のベクター (データ型が定義されているが初期化されていないベクター) と連結すると役立つことがあります。
たとえば、lmul8
組み込み関数には、xbuff
パラメーターに v16int32
または v32int32
ベクターのみを使用可能です。組み込み関数のプロトタイプは次のとおりです。
v8acc80 lmul8 ( aie::vector<int32,16> xbuff,
int xstart,
unsigned int xoffsets,
aie::vector<int32,8> zbuff,
int zstart,
unsigned int zoffsets
)
xbuff
パラメーターには、16 要素ベクター (v16int32) を使用する必要があります。次の例では、8 要素ベクター (aie::vector<int32,8>
) rva があります。concat()
組み込み関数は、16 要素ベクターにアップグレードするのにも使用されます。連結後、16 要素ベクターの下位半分には rva の内容が含まれます。未定義の aie::vector<int32,8>
ベクターと連結しているため、16 要素ベクターの上位半分は初期化されません。
int32 a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
aie::vector<int32,8> rva = *((aie::vector<int32,8>*)a);
acc = lmul8(concat(rva,aie::zeros<int32,8>()),0,0x76543210,rvb,0,0x76543210);
ベクター ベースの組み込み関数の詳細は、ベクター レジスタ レーンの並べ替え を参照してください。