インテルのみ表示可能 — GUID: mwh1391807954523
Ixiasoft
インテルのみ表示可能 — GUID: mwh1391807954523
Ixiasoft
5.8. __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パラメーターへのポインターに置き換えることが可能です。その後、次の方法でホスト・アプリケーションを修正する必要があります。
- グローバルメモリーのポインターに関連付けられたcl_memメモリー・オブジェクトを作成します。
- カーネルを実行する前に、clEnqueueWriteBufferで定数データをcl_memオブジェクトにロードします。
- clSetKernelArg関数で、cl_memオブジェクトをカーネルに引数として渡します。
constant変数が複合型の場合は、次の表で示されているようにtypedef引数を使用し簡潔にします。
元のソースコードの構成 | 以下のような構文に書き換え |
---|---|
__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 } |