2012-04-08 17 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 

カーネルの短所呼び出しは関数呼び出しを含めることになりますが、関係があるかどうかはわかりません。私の直感は、それが制限を強制するカーネルコード内の何かであるということです。何か案は?助けを前にありがとう!

+0

に応じCL_DEVICE_MAX_WORK_ITEM_SIZESを通じて各次元のためのワークグループの最大数を取得することも可能です。 –

+0

具体的にどのハードウェアでコードを実行していますか? – virtuallinux

答えて

0

希望するローカルメモリの量は、そのワーキンググループサイズの方が少なくてすみます。あなたは議論を見せることができますか? 。あなたは作業グループのサイズを減らすことで試してみることができます.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

0

answer of Tomiから時間が経過しており、Appleがこの面でやや柔軟性を増しているようです。私のOS X 10.12.3(まだOpenCL 1.2)では、最初の次元でCL_DEVICE_MAX_WORK_GROUP_SIZEまで使用できます。エンキューとSetArgsコマンドを -

仕様によると、あなたがソースコードの残りの部分を表示する必要がありますdocumentation

関連する問題