0

如果我在内核中使用屏障(无论 ifCLK_LOCAL_MEM_FENCE或),它会导致错误。全局工作大小为 512,本地工作大小为 128,必须计算 65536 个项目,我的设备的最大工作组大小为 1024,我只使用一维。对于 Java 绑定,我使用 JOCL。内核非常简单:CLK_GLOBAL_MEM_FENCECL_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]

我做错了什么?

4

1 回答 1

6

这是某些 OpenCL 平台上的预期行为。例如,在我的 Apple 系统上,CPU 设备的最大工作组大小为 1024。但是,如果内核内部有屏障,则该特定内核的最大工作组大小会减少到 1。

您可以使用带参数的clGetKernelWorkGroupInfo函数查询特定内核的最大工作组大小。CL_KERNEL_WORK_GROUP_SIZE返回的值不会大于clGetDeviceInfoand返回的值CL_DEVICE_MAX_WORK_GROUP_SIZE,但允许小于(在这种情况下)。

于 2014-10-09T14:10:24.300 回答