在 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]。如果有 n 个工作组,则设备上有 n 个 float[100]。那正确吗?__local float *temp 是否仅在设备上使用?我可以通过使用以下内容从内核中访问它:
clEnqueueReadBuffer(CmdQueue, ??, CL_TRUE, 0, 100* sizeof(cl_float),
host_temp, 0, 0, 0);
本地内存是否比全局内存快得多?你有使用本地内存的技巧吗?