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
您正在定义大小为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)
| 归档时间: |
|
| 查看次数: |
7182 次 |
| 最近记录: |