2

そのため、カーネルを呼び出すと、奇妙なエラーが発生し続けます。記載されている最大カーネル ワーク グループ サイズは 1 ですが、私のデバイス (私の Macbook) のワーク グループ サイズは明らかにそれより大きくなっています。カーネルがコードを 1 つのワーク グループに制限している原因として、どのようなことが考えられますか? これが私のカーネルの1つです:

__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

Tomiの回答から時間が経ち、Apple はこの面で少し柔軟になったようです。CL_DEVICE_MAX_WORK_GROUP_SIZE私の OS X 10.12.3 (まだ OpenCL 1.2) では、最初の次元でまで使用できます。

仕様によると、ドキュメントCL_DEVICE_MAX_WORK_ITEM_SIZESに従って、各次元のワークグループの最大数を取得することも可能です

于 2017-03-01T15:43:07.290 に答える