重要: コードで
hls::vector
オブジェクトを使用するには、次のようにヘッダー ファイル hls_vector.h を含めます。ベクター アプリケーションの例は、GitHub の Vitis-HLS-Introductory-Examples/Modeling を参照してください。ベクター データ型の使用方法
ベクター データ型を使用すると、SIMD 型のベクター演算を簡単に記述および合成できます。AMD Vitis™ HLS ベクター データ型は、次のように定義します。ここで、T
はほとんどの算術演算子が定義されたプリミティブまたはユーザー定義型です。N
は 0 より大きい整数です。ベクター型変数を宣言したら、ほかのプリミティブ型変数と同様に使用して算術演算およびロジック演算を実行できます。
#include <hls_vector.h>
hls::vector<T,N> aVec;
ヒント:
T
のビット幅と N
が 2 のべき乗である場合に最高のパフォーマンスが達成されます。メモリのレイアウト
hls::vector<T,N>
として定義されてたベクター型では、ストレージはサイズ sizeof(T)*N
の連続したものとなり、割り当てられるサイズが sizeof(T)*N
以上になるように、最大の 2 のべき乗に揃えられます。特に、N
および sizeof(T)
が 2 のべき乗の場合、vector<T, N>
はその合計サイズに揃えられます。これは、ほとんどのアーキテクチャでのベクター インプリメンテーションに一致します。
ヒント:
sizeof(T)*N
が 2 のべき乗の整数である場合、割り当てられるサイズはちょうど sizeof(T)*N
になります。それ以外の場合は、割り当てられるサイズはアライメントを可能にするためそれより大きくなります。次の例に、上記のようにそれ自体を揃えるベクター クラスの定義を示します。
constexpr size_t gp2(size_t N)
{
return (N > 0 && N % 2 == 0) ? 2 * gp2(N / 2) : 1;
}
template<typename T, size_t N> class alignas(gp2(sizeof(T) * N)) vector
{
std::array<T, N> data;
};
次は、異なるアライメントの例です。
hls::vector<char,8> char8Vec; // aligns on 8 Bytes boundary
hls::vector<int,8> int8Vec; // aligns on 32 byte boundary
要件および依存性
Vitis HLS ベクター型には、C++ 14 以降のサポートが必要です。標準ヘッダーに次の依存性があります。
-
<array>
-
std::array<T, N>
-
-
<cassert>
-
assert
-
-
<initializer_list>
-
std::initializer_list<T>
-
サポートされる演算子
- 初期化:
hls::vector<int, 4> x; // uninitialized hls::vector<int, 4> y = 10; // scalar initialized: all elements set to 10 hls::vector<int, 4> z = {0, 1, 2, 3}; // initializer list (must have 4 elements) hls::vector<ap_int, 4> a; // uninitialized arbitrary precision data type
- アクセス:operator[] を使用すると、標準配列と同様、ベクターの個々の要素にアクセスできます。
x[i] = ...; // set the element at index i ... = x[i]; // value of the element at index i
- 算術演算:
T
の対応する演算に依存して、再帰的に定義されます。表 1. 算術演算 演算 インプレース 論理式 リダクション (左たたみ込み) 加算 +=
+
reduce_add
減算 -=
-
非結合 乗算 *=
*
reduce_mult
除算 /=
/
非結合 剰余 %=
%
非結合 ビット単位 AND (bitwise_and) &=
&
reduce_and
Bitwise OR |=
|
reduce_or
ビット単位 XOR ^=
^
reduce_xor
Shift Left <<=
<<
非結合 右シフト >>=
>>
非結合 前置インクリメント ++x
none 単項演算子 前置デクリメント --x
none 単項演算子 後置インクリメント x++
none 単項演算子 後置デクリメント x--
none 単項演算子 - 比較:
ベクターの辞書式順 (ブール値を返す):
表 2. 演算 演算 論理式 小なり <
小なりイコール <=
等価 ==
不等価 !=
大なりイコール >=
大なり >