我无法将向量类型 (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, ?, ?, ? )
问号通常 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