Vitis HLS の構造体では、__attributes__
または #pragmas
を使用して異なるタイプのパディングおよびアライメントを設定できます。次に、これらの機能を示します。
- 分割
- デフォルトでは、コード内の内部変数としての構造体は個別の要素に分割されます。作成される要素の数とタイプは、その構造体の内容によって決まります。Vitis HLS により、構造体が分割されるか、特定の最適化条件に基づいているかが判断されます。 ヒント: AGGREGATE プラグマまたは指示子を使用すると、コードの構造体がデフォルトで分割されないようにできます。図 1. 分割された構造体
- 集約
-
インターフェイスの構造体 で説明するように、インターフェイスで構造体を集約するのは、ツールのデフォルトの動作です。Vitis HLS で構造体の要素がまとめられ、1 つのデータ ユニットに集約されます。これは、AGGREGATE プラグマまたは指示子の設定に従って実行されます。ただし、これがインターフェイスの構造体のデフォルトなので、このプラグマを指定する必要はありません。集約プロセスでは、バイト構造をデフォルトの 4 バイトのアライメントまたは指定したアライメントに揃えるため、要素がビット パディングされることがあります。 ヒント:
-Wpadded
をコンパイラ フラグとして指定すると、構造体をパディングするためビットが追加された場合に警告が表示されます。 - アライメント
- デフォルトでは、Vitis HLS で構造体の要素がパディングされ、4 バイト (32 ビット幅) に揃えられます。
__attribute__((aligned(X)))
(X はバイト境界) を使用してバイト境界を指定し、構造体の要素間にパディングを追加することもできます。重要: X は、2 のべき乗で指定する必要があります。__attribute__((aligned))
では、適用される変数のサイズは変更されませんが、構造体の要素間にパディングが挿入されることにより、構造体のメモリ レイアウトが変更される場合があります。その結果、構造のサイズは変更されません。ap_int
などのカスタム データ幅を持つ構造体内のデータ型は、2 のべき乗のサイズで割り当てられます。Vitis HLS は、データ型のサイズを 2 のべき乗に揃えるためにパディング ビットを追加します。Vitis HLS は、
bool
型もパディングして 8 ビットに揃えます。次の例では、サイズ
varA
の構造体が 5 ビットではなく 8 ビットにパディングされます。struct example { ap_int<5> varA; unsigned short int varB; unsigned short int varC; int d; };
図 2. アライメントされた構造体のインプリメンテーション使用されるパディングは、構造体の要素の順序とサイズによって異なります。次のコード例では、構造体が 4 バイトに揃えられ、Vitis HLS で最初の要素varA
の後に 2 バイトのパディングが追加され、3 番目の要素varC
の後に 2 バイトのパディングが追加されます。構造体の合計サイズは 96 ビットになります。struct data_t { short varA; int varB; short varC; };
構造体を次のように記述し直すと、パディングは必要なくなり、構造体の合計サイズは 64 ビットになります。struct data_t { short varA; short varC; int varB; };
- パッキング
-
__attribute__(packed(X))
を指定すると、Vitis HLS で構造体が各要素の実際のサイズに基づいてパックされます。次の例では、構造体のサイズは 72 ビットになります。図 3. パッキングされた構造体のインプリメンテーション