2

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

4 回答 4

3

Apple OpenCL 不支持 CPU 上大于 [1, 1, 1] 的工作组。我不知道为什么,但至少在 OSX 10.9.2 之前就是这样。不过,较大的工作组在 GPU 上很好。

于 2014-08-13T13:02:38.247 回答
1

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

于 2012-11-22T02:51:36.830 回答
0

希望该工作组大小的可用本地内存量较少。请问你能证明论据吗?. 您可以尝试通过减小工作组大小,从 2、4、8、16、32、64、128 等开始,确保其为 2 的幂。

于 2012-04-10T10:19:41.283 回答
0

自托米的回答以来,时间已经过去了,苹果似乎在这方面变得更加灵活。在我的 OS X 10.12.3(仍然是 OpenCL 1.2)上,最多可以CL_DEVICE_MAX_WORK_GROUP_SIZE在第一维中使用。

根据规范,也可以通过CL_DEVICE_MAX_WORK_ITEM_SIZES根据文档获得每个维度的最大工作组数

于 2017-03-01T15:43:07.290 回答