ベクター データ型 - 2023.2 日本語

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

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

AI エンジン API で提供される 2 つの主なベクターのデータ型は、ベクター (aie::vector) とアキュムレータ (aie::accum) です。

ベクター

ベクターは同じデータ型の要素の集合を表し、AI エンジン アーキテクチャでサポートされる対応するベクター レジスタに透過的にマップされます。ベクターは要素のタイプと要素数でパラメーター指定され、128b/256b/512b/1024b ベクターを定義する任意の組み合わせがサポートされます。デフォルトは 512b です。

表 1. サポートされるベクターのデータ型とサイズ
ベクター型 サイズ 1
int8 16/32/64/128
int16 8/16/32/64
int32 4/8/16/32
uint8 16/32/64/128
float 4/8/16/32
cint16 4/8/16/32
cint32 2/4/8/16
cfloat 2/4/8/16
  1. 太字の数値は、AI エンジンでサポートされているデータ型のネイティブ ベクター サイズです。たとえば、aie::broadcast((cfloat){1,1})aie::broadcast<cfloat,8>((cfloat){1,1}) と同等です。ここで、<cfloat,8> の指定は、cfloat 型のネイティブ ベクター サイズであるためオプションです。

たとえば、aie::vector<int32,16> は 32 ビット整数の 16 要素ベクターです。ベクターの各要素は、レーンと呼ばれます。必要最小限のビット幅を使用すると、レジスタを効率的に使用でき、パフォーマンスを向上できます。

図 1. aie::vector<int32,16>

複素整数や複素浮動小数点データは、メンバー関数 real および imag を使用してアクセスすることで、データの実数部と虚数部を抽出できます。実数部は下位アドレスに、虚数部は上位アドレスに格納されます。次に例を示します。
cint8 ctmp={1,2};

// print real and imag values
printf("real=%d imag=%d\n",ctmp.real,ctmp.imag);

// store real and imag values
printf("ctmp mem storage=%llx\n",*(long long*)&ctmp);
cint32 ctmp2={3,4};
int32 *p_ctmp2=reinterpret_cast<int32*>(&ctmp2);

// print "real=3" and "imag=4"
printf("real=%d imag=%d\n",p_ctmp2[0],p_ctmp2[1]);

aie::vector および aie::accum には、型キャスト、データの抽出と挿入、インデックス作成を実行するメンバー関数があります。これらの操作については、この後のセクションで説明します。

アキュムレータ

アキュムレータは同じクラスの要素の集合を表し、通常乗算の結果として取得され、各アーキテクチャでサポートされる対応するアキュムレータ レジスタに透過的にマップされます。アキュムレータには一般的に多数のビットが含まれるので、中間結果が通常のベクター データ型の範囲を超える可能性がある長い演算チェーンを実行できます。アキュムレータは、要素のタイプおよび要素数でパラメーター指定されます。ネイティブ累積ビットは最小ビット数を定義し、AI エンジン API は異なるタイプをその要件をサポートする最も近いネイティブ アキュムレータ タイプにマップします。たとえば、AI エンジン アーキテクチャでは acc40acc48 にマップされます。

表 2. サポートされるアキュムレータの型とサイズ
アキュムレータ型 acc32 cacc32 acc40 cacc40 acc48 cacc48 acc56 cacc56 acc64 cacc64 acc72 cacc72 acc80 cacc80 accfloat caccfloat
ネイティブ累積ビット数 48 80 32