我很难将一个向量类型(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)
但是,运行此代码会在clSetKernelArg()
上产生一个CL_INVALID_ARG_SIZE
错误。如果我将ARG_SIZE
参数切换为sizeof(cl_uint8 *)
,则此错误消失,但是我会在clSetKernelArg()
中的__dynamic_cast
处得到一个EXC_BAD_ACCESS
错误。我的设备是:
Apple Macbook Pro(2009年中期) OSX 10.8 Mountain Lion NVIDIA GeForce 9400M OpenCL 1.0 CLH 1.0
clSetKernelArg()
的最后一个参数是类型为const void *
。 - JacobEvelyncl_uint8 dataVector = { 1, 2, 3, 4, 5, 6, 7, 8 };
clSetKernelArg(kernel, 0, sizeof(cl_uint8), &dataVector);
以及kernel void kernelFunction(constant uint8 vectorPtr)
- Alex Placet