我在将向量类型 (uint8) 参数从 C 中的主机代码传递到 OpenCL 内核函数时遇到问题。
在主机中,我将数据存储在数组中:
cl_uint dataArr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
(我的真实数据不仅仅是 [1, 8];这只是为了便于解释。)
然后,我将数据传输到缓冲区以传递给内核:
cl_mem kernelInputData = clCreateBuffer(context,
CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uint)*8, dataArr, NULL);
接下来,我将此缓冲区传递到内核中:
clSetKernelArg(kernel, 0, sizeof(cl_mem), &kernelInputData);
内核函数的签名看起来像这样:
kernel void kernelFunction(constant uint8 *vectorPtr)
但是,内核似乎没有从指向的指针获取正确的输入数据kernelInputData
。当我从内核内部传回值时,我看到vectorPtr
指向具有这种结构的东西:( 1, 2, 3, 4, 5, ?, ?, ? )
问号在哪里usually 4293848814
但是有时0
。不管怎样,都不是他们应该的样子。
我究竟做错了什么?
EDIT:
我已在主机端从使用数组切换为 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
within clSetKernelArg()
.
我的设备是:
Apple Macbook Pro(2009 年中)
OSX 10.8 山狮
NVIDIA GeForce 9400M
OpenCL 1.0
CLH 1.0