2012-04-08 77 views
2

因此,当我打电话给我的内核时,我仍然遇到奇怪的错误;规定的最大内核工作组大小为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); 

叫我包括调用函数,但我不知道这是否是相关的;我的直觉是,它在内核代码中强制限制。有任何想法吗?先谢谢您的帮助!

+0

你应该表现出的源代码的其余部分通过CL_DEVICE_MAX_WORK_ITEM_SIZES得到工作组的每个维度的最大数量 - 入队和SetArgs命令。 – 2012-04-09 07:37:42

+0

你在哪些硬件上运行代码? – virtuallinux 2012-04-09 16:45:00

回答

0

希望对于该工作组大小,本地内存avilable的数量较少。请你能显示参数吗? 。你可以尝试减少工作组的大小,从2,4,8,16,32,64,128开始等等,确保它的功率为2.

0

CL_KERNEL_WORK_GROUP_SIZE告诉你这个最大工作组大小可以达到多大特定的内核。 OpenCL的运行时间通过检查内核代码来确定。 CL_KERNEL_WORK_GROUP_SIZE将是一个小于或等于CL_DEVICE_MAX_WORK_GROUP_SIZE的数字。

2

Apple OpenCL不支持CPU上大于[1,1,1]的工作组。我不知道为什么,但这就是至少达到OSX 10.9.2的原因。尽管如此,更大的工作组在GPU上还不错。

+0

虽然这是一个OSX的东西。在Linux上,在CPU上运行时,较大的工作组大小是可以的。在linux上,同样的cl代码对我来说也快3.5倍。 OSX OpenCL是否因cpu而被破坏? – Bram 2015-01-29 21:49:01

0

answer of Tomi以来已经过去了一段时间,似乎苹果在这方面已经变得稍微灵活了。在我的OS X 10.12.3(仍然是OpenCL 1.2)上,可以在第一维中使用高达CL_DEVICE_MAX_WORK_GROUP_SIZE

根据该规范,还可以根据documentation