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

时间:2016-11-14 16:31:28

标签: opencl

我有一个变量,它是向量的向量,而在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
 }

任何人都可以帮助我吗?我错在哪里或者解决方案是什么?

1 个答案:

答案 0 :(得分:1)

你的向量你做错了多少事。

首先,(void*)&filters没有做你想做的事。 &filters不会返回指向实际数据开头的指针。为此,您必须使用filters.data()

其次,你不能在OpenCL中使用数组数组(或矢量矢量甚至更少)。在将数组传递给OpenCL内核之前,您必须自己将数组展平为1D数组。