我试图将一个char指针传递给opencl的内核函数
char *rp=(char*)malloc(something);
ciErr=clSetKernelArg(ckKernel,0,sizeof(cl_char* ),(char *)&rp)
我的内核是
__kernel void subFilter(char *rp)
{
do something
}
当我运行内核时,我正在
error -48 in clsetkernelargs 1
另外,我尝试将内核修改为
__kernel void subFilter(__global char *rp)
{
do something
}
我收到错误
error -38 in clsetkernelargs 1
表示无效的mem对象。
我只想访问内核中rp指向的内存位置。 任何帮助都会有很大的帮助。
Thnaks, PIYUSH
答案 0 :(得分:3)
您在OpenCL内核中使用的任何数组和内存对象都需要通过OpenCL API进行分配(例如,使用clCreateBuffer
)。这是因为主机和设备并不总是共享相同的物理内存。指向主机上分配的数据的指针(通过malloc
)对于离散GPU来说绝对没有任何意义。
要将一个字符数组传递给OpenCL内核,您应该写下以下内容:
char *h_rp = (char*)malloc(length);
cl_mem d_rp = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, length, h_rp, &err);
err = clSetKernelArg(ckKernel, 0, sizeof(cl_mem), &d_rp)
并在内核中使用__global
(或__constant
)限定符声明参数。然后,您可以使用clEnqueueReadBuffer
将数据复制回主机。
如果你 知道主机和设备共享相同的物理内存,那么你可以通过创建一个带有CL_MEM_ALLOC_HOST_PTR
标志的缓冲区来分配对主机和设备都可见的内存,当您希望从主机访问数据时使用clEnqueueMapMemObject
。 OpenCL 2.0的新共享虚拟内存(SVM)功能还改进了在统一内存架构上共享主机和设备之间缓冲区的方式。