所以当我调用我的内核时,我一直遇到奇怪的错误;规定的最大内核工作组大小为1,而我的设备(我的Macbook)的工作组大小明显高于此。内核将代码限制为单个工作组的原因可能是什么?这是我的一个内核:
__kernel
void termination_kernel(const int Elements,
__global float* c_I,
__global float* c_Ihat,
__global float* c_rI,
__local float* s_a)
{
const int bdim = 128;
int n = get_global_id(0);
const int tx = get_local_id(0); // thread index in thread-block (0-indexed)
const int bx = get_group_id(0); // block index (0-indexed)
const int gx = get_num_groups(0);
// is thread in range for the addition
float d = 0.f;
while(n < Elements){
d += pow(c_I[n] - c_Ihat[n], 2);
n += gx * bdim;
}
// assume bx power of 2
int alive = bdim / 2;
s_a[tx] = d;
barrier(CLK_LOCAL_MEM_FENCE);
while(alive > 1){
if(tx < alive)
s_a[tx] += s_a[tx + alive];
alive /= 2;
barrier(CLK_LOCAL_MEM_FENCE);
}
if(tx == 0)
c_rI[bx] = s_a[0] + s_a[1];
}
,返回的错误是
OpenCL Error (via pfn_notify): [CL_INVALID_WORK_GROUP_SIZE] : OpenCL Error : clEnqueueNDRangeKernel
failed: total work group size (128) is greater than the device can support (1)
OpenCL Error: 'clEnqueueNDRangeKernel(queue, kernel_N, dim, NULL, global_N, local_N, 0, NULL, NULL)'
我知道它说限制在设备上,但调试显示
CL_DEVICE_MAX_WORK_GROUP_SIZE = 1024
和
CL_KERNEL_WORK_GROUP_SIZE = 1
内核构造由
调用 char *KernelSource_T = readSource("Includes/termination_kernel.cl");
cl_program program_T = clCreateProgramWithSource(context, 1, (const char **) &KernelSource_T, NULL, &err);
clBuildProgram(program_T, 1, &device, flags, NULL, NULL);
cl_kernel kernel_T = clCreateKernel(program_T, "termination_kernel", &err);
我会包含调用函数,但我不确定它是否相关;我的直觉是内核代码中强制限制的东西。有任何想法吗?在此先感谢您的帮助!
答案 0 :(得分:3)
Apple OpenCL不支持CPU上大于[1,1,1]的工作组。我不知道为什么,但至少它是如何至少取决于OSX 10.9.2。但是,更大的工作组在GPU上很好。
答案 1 :(得分:1)
CL_KERNEL_WORK_GROUP_SIZE告诉您此特定内核的最大工作组大小有多大。 OpenCL的运行时通过检查内核代码来确定。 CL_KERNEL_WORK_GROUP_SIZE将是一个小于或等于CL_DEVICE_MAX_WORK_GROUP_SIZE的数字。
答案 2 :(得分:0)
希望可用的本地内存量少于该工作组的大小。请问你能证明这些论点吗? 。您可以尝试通过减少工作组大小,从2,4,8,16,32,64,128开始,以确保它的功率为2.
答案 3 :(得分:0)
自answer of Tomi以来已经过去了一段时间,似乎Apple在这方面变得更加灵活。在我的OS X 10.12.3(仍然是OpenCL 1.2)中,可以在第一维中使用最多CL_DEVICE_MAX_WORK_GROUP_SIZE
。
根据规范,根据documentation
,还可以通过CL_DEVICE_MAX_WORK_ITEM_SIZES
获取每个维度的最大工作组数量