在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个浮点数[100]。是对的吗? __local float * temp刚刚在设备上使用?我可以通过使用类似的东西从内核中访问它吗?
clEnqueueReadBuffer(CmdQueue, ??, CL_TRUE, 0, 100* sizeof(cl_float),
host_temp, 0, 0, 0);
本地内存比全局内存快得多吗?你有使用本地记忆的小费吗?
答案 0 :(得分:2)
本地内存是一种非常快速的时间内存。所以,不,你无法访问或阅读它。因为它被连续覆盖。事实上,设备中没有保留内存,因此可能是(并且可能)您的2个工作组在不同时间使用相同的本地内存。如果你有100个组和2个计算单元......想象一下覆盖的次数。
如果你想阅读本地记忆的结果,你必须先将它复制到全局,然后从那里阅读。
本地内存意图是在时间中间结果和快速访问的工作项之间共享内容。之后它将被销毁。这对许多事情都很有用,一个简单的例子是过滤图像。
修改强>
您可以将本地内存视为寄存器,即HW资源。您不能将寄存器用作RAM。就像你不能使用本地内存作为全局内存一样。