OpenCL内核工作组大小限制

时间:2012-04-08 19:20:45

标签: opencl

所以当我调用我的内核时,我一直遇到奇怪的错误;规定的最大内核工作组大小为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);

我会包含调用函数,但我不确定它是否相关;我的直觉是内核代码中强制限制的东西。有任何想法吗?在此先感谢您的帮助!

4 个答案:

答案 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获取每个维度的最大工作组数量