私はカーネルを呼び出すときに奇妙なエラーに走り続けます。記載されている最大のカーネルワークグループサイズは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
カーネルの短所呼び出しは関数呼び出しを含めることになりますが、関係があるかどうかはわかりません。私の直感は、それが制限を強制するカーネルコード内の何かであるということです。何か案は?助けを前にありがとう!
に応じ
CL_DEVICE_MAX_WORK_ITEM_SIZES
を通じて各次元のためのワークグループの最大数を取得することも可能です。 –具体的にどのハードウェアでコードを実行していますか? – virtuallinux