我有一个变量,它是向量的向量,而在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
}
任何人都可以帮助我吗?我错在哪里或者解决方案是什么?
答案 0 :(得分:1)
你的向量你做错了多少事。
首先,(void*)&filters
没有做你想做的事。 &filters
不会返回指向实际数据开头的指针。为此,您必须使用filters.data()
。
其次,你不能在OpenCL中使用数组数组(或矢量矢量甚至更少)。在将数组传递给OpenCL内核之前,您必须自己将数组展平为1D数组。