OpenCL には 2 つのワーク グループがあり、それぞれに 100 個のワーク アイテムがあります。だから私はこのようなことをします:
....
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&hDeviceMemInput);
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&hDeviceMemOutput);
clSetKernelArg(kernel, 2, sizeof(cl_float) * 100, NULL);
clSetKernelArg(kernel, 3, sizeof(cl_int) * 1, &mCount);
clEnqueueNDRangeKernel(CmdQueue, Kernel, 1, 0, 200, 100, 0, 0, 0);
....
OpenCL コード:
__kernel square(
__global float *input,
__global float *output,
__local float *temp,
const unsigned int count)
{
int gtid = get_global_id(0);
int ltid = get_local_id(0);
if (gtid < count)
{
temp[ltid] = input[gtid];
output[gtid] = temp[ltid] * temp[ltid];
}
}
私が理解しているように、各グループには float[100] ローカル一時変数があります。私の場合、デバイスには float[100] が 2 つあります。n 個のワーク グループがある場合、デバイスには n 個の float[100] があります。そうですか?__local float *temp はデバイスで使用されていますか? 次のようなものを使用して、カーネルからアクセスできますか?
clEnqueueReadBuffer(CmdQueue, ??, CL_TRUE, 0, 100* sizeof(cl_float),
host_temp, 0, 0, 0);
ローカル メモリはグローバル メモリよりもはるかに高速ですか? ローカルメモリを使用するためのヒントはありますか?