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);
「ローカルサイズ」と言ったときに、あなたが何を参照しているかは不明です。あなたは変数 'local_work_size'を参照していますか? –
はい。それぞれglobal_work_sizeはグローバルサイズです。ミスマッチのために申し訳ありません。 – Shnkc