在 OpenCL 内核中声明和定义向量的指针向量

declaring and defining pointer vetors of vectors in OpenCL Kernel

我有一个变量,它是向量的向量,在 C++ 中,我很容易定义和声明它,但在 OpenCL 内核中,我遇到了问题。这是我正在尝试做的一个例子。

std::vector<vector <double>> filter;
for (int m= 0;m<3;m++)
{
   const auto& w = filters[m];
   -------sum operation using w
}

现在在这里,我可以轻松地在 w 中引用 filters[m] 的值,但我无法这样做OpenCl 内核文件。这是我尝试过的方法,但它给了我错误的输出。

在主机代码中:-

filter_dev = cl::Buffer(context,CL_MEM_READ_ONLY|CL_MEM_USE_HOST_PTR,filter_size,(void*)&filters,&err);

filter_dev_buff = cl::Buffer(context,CL_MEM_READ_WRITE,filter_size,NULL,&err);

kernel.setArg(0, filter_dev);
kernel.setArg(1, filter_dev_buff); 

在内核代码中:

 __kernel void forward_shrink(__global double* filters,__global double* weight)
{
 int i = get_global_id[0];   // I have tried to use indiviadual values of i in filters j, just to check the output, but is not giving the same values as in serial c++ implementation
 weight = &filters[i];
 ------ sum operations using weight
 }

谁能帮帮我?我哪里错了或者有什么解决办法?

你的向量有很多错误。

首先,(void*)&filters 没有按照您的意愿去做。 &filters 不是 return 指向实际数据开头的指针。为此,您必须使用 filters.data()

其次,您不能在 OpenCL 中使用数组的数组(或者更不用说向量的向量)。在将数组传递给 OpenCL 内核之前,您必须自己将数组展平为一维数组。