構造体のパディングとアライメント - 2023.2 日本語

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

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

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. パッキングされた構造体のインプリメンテーション
ヒント: これは、AGGREGATE プラグマまたは指示子の compact=bit オプションを使用しても実行できます。