在 OpenCL 内核中传递矢量值

passing values of vector in the OpenCL kernel

我创建了一个包含一些值的向量。然后为该向量创建一个 cl_buffer 并使用内核参数将其传递给 OpenCL 内核。像这样:

在主机代码中:

std::vector<cl_double> inp;
inp.resize(1024);
for( int i = 0; i<1024;i++)
{
  inp[i] = i;
}
        filter_kernel = cl::Buffer(context,CL_MEM_READ_ONLY|CL_MEM_USE_HOST_PTR,sizeof(cl_double)*inp.size(),(void*)&inp[0],&err); // also tried (void*)inp.data()

kernel.setArg(0, filter_kernel);

在内核代码中:

__kernel void test(__global double* inp)
 {
   for(int m = 0;m<10;m++)
   {
    printf("inp values are : %d \n",inp[m]);
   }
 }

这只是一个示例,展示了我如何在我的程序中将向量中的值传递给 OpenCL 内核。它有什么问题吗?当我打印这些值时,我每次都会得到一些随机的垃圾值。

我使用的是 MacOS 系统 Xcode。设备是 Intel 高清显卡 4000

如果您正在使用 CL_MEM_USE_HOST_PTR,则需要映射内存区域以便设备可以看到它。检查 https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clEnqueueMapBuffer.html . Also I would recommned reading the Intel tutorial on the subject.

另外 HD 4000 不应该有双重支持。您确定代码在 GPU 上是 运行 而不是 CPU 吗?

我只是在整理答案,因为所有要点(在评论中)使它协同工作。

1) 将数据类型从 double 更改为 float,因为 Intel 不能正确使用 double 并给出错误的结果。

2) 另一个错误是大小,在缓冲区和读取缓冲区期间传递大小时,它应该是 inp*sizeof(float) 因为我们现在使用的是 float 而不是 double!