如果我在内核中使用屏障(无论 ifCLK_LOCAL_MEM_FENCE
或),它会导致错误。全局工作大小为 512,本地工作大小为 128,必须计算 65536 个项目,我的设备的最大工作组大小为 1024,我只使用一维。对于 Java 绑定,我使用 JOCL。内核非常简单:CLK_GLOBAL_MEM_FENCE
CL_INVALID_WORK_GROUP_SIZE
kernel void sum(global float *input, global float *output, const int numElements, local float *localCopy
{
localCopy[get_local_id(0)] = grid[get_global_id(0)];
barrier(CLK_LOCAL_MEM_FENCE); // or barrier(CLK_GLOBAL_MEM_FENCE)
}
我在内核上运行Intel(R) Xeon(R) CPU X5570 @ 2.93GHz
并且可以使用 OpenCL 1.2。调用方法看起来像
kernel.putArg(aCLBuffer).putArg(bCLBuffer).putArg(elementCount).putNullArg(localWorkSize);
queue.put1DRangeKernel(kernel, 0, globalWorkSize, localWorkSize);
但错误总是一样的:
[...]can not enqueue 1DRange CLKernel [...] with gwo: null gws: {512} lws: {128}
cond.: null events: null [error: CL_INVALID_WORK_GROUP_SIZE]
我做错了什么?