2017-02-13 25 views
0

私はOpenCLカーネルに渡したい配列を持っています。私のコードの一部ですどのようにしてアレイをOpenCLカーネルに渡すのですか?

cl_mem arr_cl; 
unsigned int arr[4] = { 0 }; 

arr_cl = clCreateBuffer(ocl.context, CL_MEM_ALLOC_HOST_PTR, 4*sizeof(unsigned int), NULL, &status); 

arr = (unsigned int*)clEnqueueMapBuffer(ocl.command_queue, arr_cl, CL_TRUE, CL_MAP_READ | CL_MAP_WRITE, 0, 4*sizeof(unsigned int), 0, NULL, NULL, NULL); 

status |= clSetKernelArg(ocl.kernel, 0, sizeof(cl_mem), &(arr_cl)); 

上記のコードはコンパイルされますが、実行時にクラッシュします。私がここで間違っていることを教えてください。

私はOpenCL 2.0を使用しています。

+0

カーネル引数はインデックス= 1です。カーネルパラメータが1つしかない場合は、0にしないでください。また、少なくとも64要素の配列で試すことができますか? –

答えて

1

源:https://www.khronos.org/registry/OpenCL/sdk/2.1/docs/man/xhtml/clEnqueueMapBuffer.html

CL_MAP_READ又はCL_MAP_WRITEとCL_MAP_WRITE_INVALIDATE_REGIONは、相互に排他的 あります。

opencl version> = 1.2の場合にのみ、読み込みまたはマッピングで書き込む必要があります。

また、alloc_host_ptrをuse_host_ptrに変更する場合、配列はCL_DEVICE_MEM_BASE_ADDR_ALIGN value/queryにアライメントする必要があります。

関連する問題