在 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 内核之前,您必须自己将数组展平为一维数组。
我有一个变量,它是向量的向量,在 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 内核之前,您必须自己将数组展平为一维数组。