データ選択 - 2023.2 日本語

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

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

select 組み込み関数は、select パラメーターの値に応じて、レーンの最初のセットまたは 2 番目のセットを選択します。select のレーンに対応するビットが 0 の場合、レーンの最初のセットの値が返されます。対応するビットが 1 の場合、レーンの 2 番目のセットの値が返されます。たとえば、select16 組み込み関数には次の関数プロトタイプがあります。

v16int32 select16 (	                            unsigned int select,
	v16int32 xbuff,
	int xstart,
	unsigned int xoffsets,
	unsigned int xoffsets_hi,
	v16int32 ybuff,
	int ystart,
	unsigned int yoffsets,
	unsigned int yoffsets_hi 
)	

select の各ビット (下位から上位) に対して、レーンが xbuff (select パラメーター ビットが 0 の場合) または ybuff (select パラメーター ビットが 1 の場合) から選択されます。選択された xbuff または ybuff レーン上のデータの並べ替えは、shufflexoffsets または yoffsets の対応するビットを使用して達成されます。次に、select の疑似 C スタイルのコードを示します。

for (int i = 0; i < 16; i++){
	idx = f( xstart, xoffsets[i]); //i'th 4 bits of offsets
	idy = f( ystart, yoffsets[i]);
	o[i] = select[i] ? y[idy]:x[idx];
}

上記のコードで f がどのように機能するかに関する情報は、このセクションの最初に示されている通常のレーン選択方法の式を参照してください。

int16 型を使用する場合、select 組み込み関数に追加の xsquare パラメーターを使用すると、主なの並べ替えの後にさらに 16 ビット粒度の並べ替えを実行できます。たとえば、select32 組み込み関数には次の関数プロトタイプがあります。


v32int16 select32	(unsigned int select,
	v64int16 xbuff,
	int xstart,
	unsigned int xoffsets,
	unsigned int xoffsets_hi,
	unsigned int xsquare,
	int ystart,
	unsigned int yoffsets,
	unsigned int yoffsets_hi,
	unsigned int ysquare 
)	

次に、select の疑似 C スタイルのコードを示します。

for (int i = 0; i < 32; i++){
	idx = f( xstart, xoffsets[i], xsquare); 
	idy = f( ystart, yoffsets[i], ysquare);
	o[i] = select[i] ? y[idy]:x[idx];
}

次の例では、select32 を使用して、AB の最初の 16 要素をインターリーブしています (A が先)。

int16 A[32]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
    16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
int16 B[32]={32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
    48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63};
v32int16 *pA=(v32int16*)A;
v32int16 *pB=(v32int16*)B;
v32int16 C = select32(0xAAAAAAAA, concat(*pA,*pB),
		0, 0x03020100, 0x07060504, 0x1100,
		32, 0x03020100, 0x07060504, 0x1100);

上記のコードの出力 C は、次のとおりです。

{0,32,1,33,2,34,3,35,4,36,5,37,6,38,7,39,8,40,9,41,10,42,11,43,12,44,13,45,14,46,15,47
}

これは、shuffle32 組み込み関数を使用しても達成できます。

v32int16 C = shuffle32(concat(*pA,*pB),
	0, 0xF3F2F1F0, 0xF7F6F5F4, 0x3120);

次の図に、上記の select32 組み込み関数がどのように機能するかを示します。

図 1. int16 型のデータ選択