【问题标题】:How to pass char pointer into opencl kernel?如何将 char 指针传递给 opencl 内核?
【发布时间】:2014-04-03 18:59:19
【问题描述】:

我正在尝试将 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

表示无效的内存对象。

我只想访问内核中 rp 指向的内存位置。 任何帮助都会有很大帮助。

感谢, 皮尤什

【问题讨论】:

    标签: opencl


    【解决方案1】:

    您在 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) 功能还改进了您可以在统一内存架构上的主机和设备之间共享缓冲区的方式。

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多