インテル® FPGA SDK for OpenCL™プロ・エディション: プログラミング・ガイド

ID 683846
日付 4/01/2019
Public
ドキュメント目次

5.9.1. ホストとカーネルにおける構造体データ型のデータレイアウトの一致

OpenCL™カーネルで構造体データ型 (struct) を引数として使用する場合、ホスト・アプリケーションとカーネルコードにおいてメンバーのデータ型を一致させ、データメンバーのアライメントを揃えてください。

メンバーのデータ型を一致させるには、カーネルコードのデータ型に対応するデータ型のcl_バージョンをホスト・アプリケーションで使用します。データ型のcl_バージョンは、opencl.hヘッダーファイルにあります。例えばカーネルコードにfloat4型のデータメンバーがある場合、ホスト・アプリケーションにおいて宣言する対応するデータメンバーは、cl_float4です。

ホストとカーネル・アプリケーションにおける構造と、structデータメンバーのアライメントを揃えます。異なるホスト・コンパイラー間においては変動性があるため、アライメントは慎重に管理してください。

例えば構造体に、float4のOpenCLデータ型がある場合、これらのデータアイテムのアライメントはOpenCL Specificationを満たす必要があります (float4に対しては16バイトのアライメント)。

インテル® FPGA SDK for OpenCL™オフライン・コンパイラーがOpenCLカーネルをコンパイルする際は、次の規則が適用されます。

  1. 組み込みのスカラー型とベクトル型のアラインメントは、OpenCL Specification version 1.0のSection 6.1.5で説明されている規則に従います。

    オフライン・コンパイラーは通常、サイズに基づいてデータ型のアライメントを行います。ただし、コンパイラーは3要素ベクトルの値を、4要素ベクトルと同じ方法でアライメントします。

  2. 配列はその要素の1つと同じアラインメントを有します。
  3. struct (またはunion) は、そのデータメンバーのいずれかに必要な最大アライメントと同じアライメントを有します。

    以下に例を示します。

    struct my_struct
    {
        char data[3];
        float4 f4;
        int index;
    };

    データ型がfloat4であるため、オフライン・コンパイラーは上記のstruct要素を16バイトの境界でアライメントします。その結果、dataindexもまた16バイトのアライメント境界を有します。

  4. オフライン・コンパイラーはstructのデータメンバーを並び替えません。
  5. オフライン・コンパイラーは通常、各データメンバーのアライメント要件を満たすため、structのデータメンバー間に最小限のデータ構造パディングを挿入します。
    1. OpenCLカーネルコードでは、packed属性をstruct宣言に適用することで、データのパッキングを指定することができます (すなわち、データ構造パディングを挿入しない)。データのパッキングを課す場合は、データメンバーのアラインメントがOpenCLのアラインメント要件を満たしていることを確認してください。 インテル® FPGA SDK for OpenCL™ は、このアライメント要件を強制しません。ホスト・コンパイラーがカーネル属性に配慮し、適切なアライメントを設定していることを確認してください。
    2. OpenCLカーネルコードでは、aligned(N) 属性をデータメンバーに適用し、データ構造パディングの量を指定することができます。ここでNは、パディングの量を表します。SDKはこのアライメント要件を強制しません。ホスト・コンパイラーがカーネル属性に配慮し、適切なアライメントを設定していることを確認してください。

      Windowsシステムにおいて、Microsoft Visual Studioコンパイラーの一部のバージョンでは、デフォルトで構造体データ型をパッキングします。データのパッキングが不要な場合は、データ構造パディングの量を次のように指定してください。

      struct my_struct
      {
          __declspec(align(16)) char data[3];
      
          /*Note that cl_float4 is the only known float4 definition on the host*/
          __declspec(align(16)) cl_float4 f4;
          
          __declspec(align(16)) int index;
      };
      
      ヒント: データ構造パディングを追加することに代わり、char型またはchar配列のダミーのstructメンバーを挿入する方法もあります。