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

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

5.8. __constantアドレス空間修飾子の宣言

__constantアドレス空間修飾子をカーネルに含める際には、いくつかの考慮すべき制限と回避策があります。

関数スコープ__constant変数

インテル® FPGA SDK for OpenCL™オフライン・コンパイラーは、関数スコープの__constant変数をサポートしません。関数スコープの__constant変数は、ファイルスコープのconstant変数に置き換えてください。また、関数スコープの__constant変数を、ホストがカーネルに渡す__constantバッファーに置き換えることも可能です。

ファイルスコープ__constant変数

ホストが常に同じ定数データをカーネルに渡す場合、そのデータを初期化されたconstantファイルスコープ配列としてカーネルファイルで宣言することを検討ください。初期化されたconstantファイルスコープ配列宣言は、データを格納するためのROMをハードウェアに直接作成します。このROMは、NDRangeのすべてのワークアイテムが利用可能です。

以下に例を示します。

__constant int my_array[8] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7};

__kernel void my_kernel (__global int * my_buffer)
{
   size_t gid = get_global_id(0);
   my_buffer[gid] += my_array[gid % 8];
}

この場合、ファイルスコープの定数データはカーネルの呼び出しにわたって変化しないため、オフライン・コンパイラーはmy_arrayの値をROMに設定します。

ホストから__constantパラメーターへのポインター

カーネルの呼び出しにわたってデータが固定されていない場合、ファイルスコープの定数データを、カーネルコードの__constantパラメーターへのポインターに置き換えることが可能です。その後、次の方法でホスト・アプリケーションを修正する必要があります。

  1. グローバルメモリーのポインターに関連付けられたcl_memメモリー・オブジェクトを作成します。
  2. カーネルを実行する前に、clEnqueueWriteBufferで定数データをcl_memオブジェクトにロードします。
  3. clSetKernelArg関数で、cl_memオブジェクトをカーネルに引数として渡します。

constant変数が複合型の場合は、次の表で示されているようにtypedef引数を使用し簡潔にします。

表 2.  ファイルスコープ__constant変数と__constantパラメーターへのポインターの置き換え
元のソースコードの構成 以下のような構文に書き換え
__constant int Payoff[2][2] = {{ 1, 3}, {5, 3}};
__kernel void original(__global int * A)
{
   *A = Payoff[1][2];
   // and so on
}
__kernel void modified(__global int * A,
__constant Payoff_type * PayoffPtr )
{
   *A = (PayoffPtr)[1][2];
   // and so on
}
重要: ホスト・アプリケーションとカーネルでは同じ型定義を使用してください。