【发布时间】:2012-10-18 13:36:11
【问题描述】:
我在将向量类型 (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 *),则此错误消失,但随后我在__dynamic_cast 中的clSetKernelArg() 中收到EXC_BAD_ACCESS 错误。
我的设备是:
Apple Macbook Pro(2009 年中)
OSX 10.8 山狮
NVIDIA GeForce 9400M
OpenCL 1.0
CLH 1.0
【问题讨论】:
-
我不明白,你想传递一个向量还是向量数组? 'kernel void kernelFunction(constant uint8 *vectorPtr)' 请删除 *.
-
只有一个向量。
clSetKernelArg()的最后一个参数是const void *类型。 -
cl_uint8 dataVector = { 1, 2, 3, 4, 5, 6, 7, 8 };clSetKernelArg(kernel, 0, sizeof(cl_uint8), &dataVector);和kernel void kernelFunction(constant uint8 vectorPtr) -
哇。我曾认为所有内核函数参数都必须是指针,但显然不是。您的代码运行良好!编辑你的答案,我会标记为正确?
标签: c vector parameter-passing opencl