在OpenCL内核中声明和定义向量的指针检查器 我有一个向量的向量,在C++中,我很容易定义和声明它,但是在OpenCL内核中,我正面临这些问题。下面是我正在尝试做的一个例子 std::vector<vector <double>> filter; for (int m= 0;m<3;m++) { const auto& w = filters[m]; -------sum operation using w }

在OpenCL内核中声明和定义向量的指针检查器 我有一个向量的向量,在C++中,我很容易定义和声明它,但是在OpenCL内核中,我正面临这些问题。下面是我正在尝试做的一个例子 std::vector<vector <double>> filter; for (int m= 0;m<3;m++) { const auto& w = filters[m]; -------sum operation using w },opencl,Opencl,在内核代码中: __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 seri

在内核代码中:

 __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
并不能实现您希望它实现的功能<代码>&过滤器不会返回指向实际数据开头的指针。为此,您必须使用
过滤器.data()


第二,你不能在OpenCL中使用数组数组(或者更少的向量向量)。在将数组传递给OpenCL内核之前,您必须将数组自身展平为1D数组。

好的,我只是在寻找在OpenCL内核中使用数组数组或向量的方法。我不知道,那是不可能的。我还有别的办法吗?因为我有多个循环,所以我几乎不能并行化我的一半循环。是否有任何方法可以在内核文件中传递向量的向量(或任何其他2D类型),并从内核文件中获取1D。不可能自动执行此操作,但所有2D数组都可以实现为1D数组,因为在计算机内存中,无论如何都是1D。您只需以不同的方式对它们进行索引。我个人认为1D阵列更易于操作。好的,谢谢。我会尽量做到这一点。在我的实际实现中,我使用了3D矢量,即矢量的矢量<代码>标准::矢量权重。然后在循环中,我得到了单独的向量,并进行了运算。你能告诉我如何把这个向量转换成一维向量吗?这应该能回答你大部分的问题。谢谢,关于向量的向量的信息。我已经将2d和#d向量更改为1D向量,以便在OpenCl内核中使用它。但在将值从主机传递到内核时,我仍然面临一些问题。你们能看到这个问题吗?
 __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
 }