2012-03-28 7 views
0

ローカルサイズの値に2を掛けて増やすと、globalsize/localsizeは整数ですが、エラーが発生します。私は問題が何であるか把握できませんでした。OpenCLのNDRangeKernel関数のローカルサイズエラー

Kernel: 
    __kernel void add(__global float *a, 
        __global float *b, 
        __global float *answer, 
        __local float *shared, 
        __local float *result) 
    { 
     int gid = get_global_id(0); 
     int lid = get_local_id(0); 
     int lsize = get_local_size(0); 

     float tempa, tempb; 
     shared[lid] = a[gid]; 
     shared[lid + lsize] = b[gid]; 
     barrier(CLK_LOCAL_MEM_FENCE); 

     for(int k = 0; k < lsize; k++){ 
     tempa = shared[lid + k]; 
     tempb = shared[lid + lsize + k]; 
     result[lid + k] = tempa + tempb; 
     } 
     barrier(CLK_LOCAL_MEM_FENCE); 

     answer[gid] = result[lid]; 
    } 

ローカルサイズは2^nです。 n < 5の場合はプログラムが動作し、そうでない場合はクラッシュします。 Cで ホスト・コード:

size_t global_work_size = n; //n = 1000000 
size_t local_work_size = 32; 
size_t sharedSize = (2 * local_work_size) * sizeof(float); 
size_t resultSize = local_work_size * sizeof(float); 

err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &cmDevBufInA); //HERE 
err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &cmDevBufInB); 
err |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &cmDevBufOut); 
err |= clSetKernelArg(kernel, 3, sharedSize, NULL); 
err |= clSetKernelArg(kernel, 4, resultSize, NULL); 
assert(err == CL_SUCCESS); 

//EXECUTION AND READ 
cl_event calculation; 


err = clEnqueueNDRangeKernel(cmd_queue, kernel, 1, NULL, &global_work_size, &local_work_size,0, NULL, &calculation); 
assert(err == CL_SUCCESS); 
clFinish(cmd_queue); 
+0

「ローカルサイズ」と言ったときに、あなたが何を参照しているかは不明です。あなたは変数 'local_work_size'を参照していますか? –

+0

はい。それぞれglobal_work_sizeはグローバルサイズです。ミスマッチのために申し訳ありません。 – Shnkc

答えて

1

'蓋+ LSIZE + K' TEMPB =共有[蓋+ LSIZE + k]の最大値は何ですか。

蓋= 31 LSIZE = 32、K = 32

しかしsharedSize =(2 * local_work_size)*はsizeof(フロート)size_tの

として割り当てられる共有;

関連する問題