2017-02-13 9 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. Если у вас есть только один параметр ядра, не должно быть 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.