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

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

5.2.9. メモリー属性の指定

OpenCLカーネルの配列宣言に、メモリー属性を適用することができます。
int __attribute__((max_concurrency(k)) local_A[M];

このkは符号なしであり、0以上の値を取ることができます。kの値は配列への最大同時アクセス数です。 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは、配列のコピーをk個作成します。k=0は、スループットを最大化するために、オフライン・コンパイラーが配列への最大同時アクセス数を最小16までの範囲で選択することを示します。これは、メモリー属性を適用しないデフォルトの動作です。

次の例は、外側のループが4つのローカル配列を宣言しています。

for (int i = 0; i < N; i++) {
  int local_A[M];
  int local_B[M];
  int local_C[M];
  int local_D[M];

  // Step 1
  for (int j = 0; j < M; j++) {
 local_A[j ] = initA();
  }

  // Step 2
  for (int j = 0; j < M; j++) {
 local_B[j] = initB(local_A[j]);
  }

  // Step 3
  for (int j = 0; j < M; j++) {
 local_C[j] = initC(local_B[j]);
  }

  // Step 4
  for (int j = 0; j < M; j++) {
 local_D[j] = initD(local_C[j]);
  }
}

この例において、外側のループは4つのステップを含み、各ステップは内側のループに対応しています。ステップ1では、最初のローカル配列local_Aが初期化されます。ステップ2では、local_Aの読み取りが行われますが、書き込みはされません。これは、外側のループでのlocal_Aの最後の使用になります。同様にlocal_Bは、ステップ2で最初に使用され初期化されます。ステップ3ではlocal_Bを読み取りますが、書き込みはされません。そしてこれが最後のlocal_Bの使用になります。同様にlocal_Cは、ステップ3と4でのみで使用されます。 インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは、16個のコピーを作成し各配列をプライベート化します。このコピーは、外側のループでの16の並行処理をサポートするのに十分ですが、これらのローカル配列の実際の範囲は外側のループ全体に及ばないため、外側のループのスループットを最大化するために16のコピーすべては必要ありません。これは、コピーを作成するために消費される領域が必要以上に大きいことを意味します。この場合、max_concurrency属性を適用し、ローカル配列のコピー数を制御すると、外側のループのスループットを維持しながら、使用される領域を減らすことができます。