Ваш код создает аргумент типа unsigned int
, а не указатель на unsigned int
.
clSetKernelArg
принимает указатель на значение аргумента , а не само значение.
Если вы хотите передать аргумент-указатель, вам нужно будет создать буфер с clCreateBuffer
(даже если там только одно значение) и вызвать clSetKernelArg
с полученным cl_mem
.
Следующий код создает буфер для 1 cl_uint
в __ global памяти и копирует в него значение my_value
. После запуска ядра оно копирует (возможно измененное) значение обратно в my_value
.
cl_uint my_value = 0;
const unsigned int count = 1;
// Allocate buffer
cl_mem hDeviceMem = clCreateBuffer(hContext, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, count * sizeof(cl_uint), &my_value, &nError);
// Set pointer to buffer as argument
clSetKernelArg(hKernel, 0, sizeof(cl_mem), &hDeviceMem);
// Run kernel
clEnqueueNDRangeKernel(...);
// Copy values back
clEnqueueReadBuffer(hCmdQueue, hDeviceMem, CL_TRUE, 0, count * sizeof(cl_uint), &my_value, 0, NULL, NULL);
Тогда ваше ядро должно выглядеть так:
__kernel void myKernel(__global unsigned int* value)
{
// read/write to *value here
}