HLS ベクター ライブラリ - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語
重要: コードで 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. 演算
    演算 論理式
    小なり <
    小なりイコール <=
    等価 ==
    不等価 !=
    大なりイコール >=
    大なり >