ベクター レジスタ - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

すべてのベクター組み込み関数には、AI エンジン ベクター レジスタにオペランドが存在している必要があります。次の表に、ベクター レジスタのセットと、小さなレジスタを組み合わせて大きなレジスタを形成する方法を示します。

表 1. ベクトル レジスタ
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);

ベクター ベースの組み込み関数の詳細は、ベクター レジスタ レーンの並べ替え を参照してください。