因此,当我打电话给我的内核时,我仍然遇到奇怪的错误;规定的最大内核工作组大小为1,而我的设备(我的Macbook)的工作组大小明显高于此值。内核将代码限制到单个工作组的可能原因是什么?这里是我的内核之一:OpenCL内核工作组大小限制
__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
内核缺点truction由
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);
叫我包括调用函数,但我不知道这是否是相关的;我的直觉是,它在内核代码中强制限制。有任何想法吗?先谢谢您的帮助!
你应该表现出的源代码的其余部分通过
CL_DEVICE_MAX_WORK_ITEM_SIZES
得到工作组的每个维度的最大数量 - 入队和SetArgs命令。 – 2012-04-09 07:37:42你在哪些硬件上运行代码? – virtuallinux 2012-04-09 16:45:00