データ並べ替えおよび MAC の例

次の例は、実数を rva、虚数を rvb (v8int32 型) に含む 2 つのベクターを取得し、オフセットを使用して必要に応じて値をインターリーブする新しい複素ベクターを作成します。

v8cint32 cv = as_v8cint32(select16(0xaaaa, concat(rva, rvb),
		0, 0x03020100, 0x07060504,  8, 0x30201000, 0x70605040));

次の例は、v8cint32 型の cv ベクターの実数部と虚数部を抽出します。

v16int32 re_im  = shuffle16(as_v16int32(cv), 0, 0xECA86420, 0xFDB97531);  
v8int32 re = ext_w(re_im, 0);  
v8int32 im = ext_w(re_im, 1);

シャッフル組み込み関数を使用すると、ベクター内の要素の順序を変更したり、すべての要素を同じ値に設定したりできます。組み込み関数の中には、大きめのレジスタでのみ動作するものもありますが、小さめのレジスタでも簡単に使用できます。次の例は、ベクター内の 4 つの要素すべてを定数値に設定する関数のインプリメント方法を示します。

v4int32 v2 = ext_v(shuffle16(xset_v(0, v1), 0 ,0, 0), 0);

次の例は、rva の各要素と rvb の最初の要素を乗算する方法を示します。これは、ベクターと定数値を乗算するのに効率的な方法です。

v8acc80 acc = lmul8(concat(rva,undef_v8int32()),0,0x76543210,rvb,0,0x00);

次の例は、rva の各要素と rvb の対応する要素を乗算します。

acc = lmul8(concat(rva, undef_v8int32()),0,0x76543210,rvb,0,0x76543210);
acc = lmul8(upd_w(undef_v16int32(),0,rva),0,0x76543210,rvb,0,0x76543210);

次の例は、データ ストレージが行ベースである場合に、mul 組み込み関数を使用して int8 x int8 データ型の行列乗算を実行します。

//Z_{2x8} * X_{8x8} = A_{2x8}
mul16(Xbuff, 0, 0x11101110, 16, 0x3120, Zbuff, 0, 0x44440000, 2, 0x3210);
//Z_{4x8} * X_{8x4} = A_{4x4}
mul16(Xbuff, 0, 0x00000000, 8, 0x3120, Zbuff, 0, 0xCC884400, 2, 0x3210);

カーネルに複数の mul または mac 組み込み関数がある場合は、xoffsets パラメーターと zoffsets パラメーターを使用中は一定に保ち、xtsart パラメーターと zstart パラメーターを変更してください。これにより、スタック上でコンフィギュレーション レジスタがあふれ出ないようにできます。

ベクター レーンの並べ替えの詳細は、『Versal ACAP AI エンジン イントリンシクス資料』 (UG1078) を参照してください。