我按照示例here创建了一个可变长度的本地内存数组。 内核签名是这样的:
__kernel void foo(__global float4* ex_buffer,
int ex_int,
__local void *local_var)
然后我调用clSetKernelArg
获取本地内存内核参数,如下所示:
clSetKernelArg(*kern, 2, sizeof(char) * MaxSharedMem, NULL)
通过查询MaxSharedMem
设置CL_DEVICE_LOCAL_MEM_SIZE
的位置。
然后在内核中我将分配的本地内存分成几个数组和其他数据结构,并按我认为合适的方式使用它们。所有这一切都适用于AMD(gpu和cpu)和英特尔设备。但是,在Nvidia上,当我将此内核排入队列然后在队列上运行CL_INVALID_COMMAND_QUEUE
时,我收到错误clFinish
。
这是一个生成上述错误的简单内核(本地工作大小为32):
__kernel
void s_Kernel(const unsigned int N, __local void *shared_mem_block )
{
const ushort thread_id = get_local_id(0);
__local double *foo = shared_mem_block;
__local ushort *bar = (__local ushort *) &(foo[1000]);
foo[thread_id] = 0.;
bar[thread_id] = 0;
}
如果我静态地在本地内存中分配相同的数组和数据结构,内核运行正常。有人可以提供这种行为和/或解决方法的解释吗?
答案 0 :(得分:2)