如何在C中将vector参数传递给OpenCL内核?

Jac*_*lyn 4 c vector parameter-passing opencl

我无法将矢量类型(uint8)参数从C中的主机代码传递给OpenCL内核函数.

在主机中我得到了数组中的数据:

cl_uint dataArr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
Run Code Online (Sandbox Code Playgroud)

(我的真实数据不仅仅是[1,8];这只是为了便于解释.)

然后我将数据传输到缓冲区以传递给内核:

cl_mem kernelInputData = clCreateBuffer(context,
    CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uint)*8, dataArr, NULL);
Run Code Online (Sandbox Code Playgroud)

接下来,我将此缓冲区传递给内核:

clSetKernelArg(kernel, 0, sizeof(cl_mem), &kernelInputData);
Run Code Online (Sandbox Code Playgroud)

内核函数的签名看起来像这样:

kernel void kernelFunction(constant uint8 *vectorPtr)
Run Code Online (Sandbox Code Playgroud)

但是,内核似乎没有从指针获取正确的输入数据kernelInputData.当我从内核中传回值时,我看到vectorPtr指向具有这种结构的东西:( 1, 2, 3, 4, 5, ?, ?, ? )问号通常 在哪里,4293848814但有时候0.无论哪种方式,不是他们应该是什么.

我究竟做错了什么?


编辑:

我已经在主机端从使用数组切换到cl_uint8.我现在有:

cl_uint8 dataVector = { 1, 2, 3, 4, 5, 6, 7, 8 };

我将这个向量传递给内核,如下所示:

clSetKernelArg(kernel, 0, sizeof(cl_uint8), &dataVector);

内核函数的签名看起来像这样:

kernel void kernelFunction(constant uint8 *vectorPtr)

但是,运行此代码会给我一个CL_INVALID_ARG_SIZE错误clSetKernelArg().如果我将ARG_SIZE参数切换到sizeof(cl_uint8 *)但是我EXC_BAD_ACCESS__dynamic_cast内部出现错误,则此错误消失clSetKernelArg().

我的设备是:

Apple Macbook Pro(2009年中)
OSX 10.8 Mountain Lion
NVIDIA GeForce 9400M
OpenCL 1.0
CLH 1.0

Ale*_*cet 8

您正在定义大小为8的cl_uint数组.cl_mem的创建和内核参数的设置是正确的.但是您的内核参数不正确:您尝试读取cl_uint8而不是cl_uint的数组.

如果要使用矢量数据类型,则必须声明:大小为1的cl_uint8 dataArr.或者,如果要使用大小为8的数组: kernel void kernelFunction(constant uint *vectorPtr, uint size):

编辑:

内核参数cl_uint8 dataVector不是指针.所以,正确的代码是:

cl_uint8 dataVector = { 1, 2, 3, 4, 5, 6, 7, 8 };
clSetKernelArg(kernel, 0, sizeof(cl_uint8), &dataVector);
Run Code Online (Sandbox Code Playgroud)

kernel void kernelFunction(constant uint8 vectorPtr)
Run Code Online (Sandbox Code Playgroud)