Arrays 2D数组作为OpenCL内核参数

Arrays 2D数组作为OpenCL内核参数,arrays,multidimensional-array,opencl,Arrays,Multidimensional Array,Opencl,非常直截了当的问题:如何使用2D数组作为OpenCL内核参数 常识建议使用 \uuuu内核void main(\uuu global**) 然而,编译器似乎对这个想法不太感兴趣: 内核参数不能声明为指向指针的指针 我是在监督显而易见的事情,还是说我做错了 编辑: 主机(c++)数据结构如下所示: 向量 其中元素是一个结构,包含同一数组中子节点的索引。基本指针。您需要将2D数组缩减为1D数组 主持人: 设备: kernel function(global int * array, int widt

非常直截了当的问题:如何使用2D数组作为OpenCL内核参数

常识建议使用

\uuuu内核void main(\uuu global**)

然而,编译器似乎对这个想法不太感兴趣:

内核参数不能声明为指向指针的指针

我是在监督显而易见的事情,还是说我做错了

编辑:

主机(c++)数据结构如下所示:

向量


其中元素是一个结构,包含同一数组中子节点的索引。基本指针。

您需要将2D数组缩减为1D数组

主持人:

设备:

kernel function(global int * array, int width, int height) {
    int id = get_global_id(0);
    int our_value = array[id];
    int x = id % width; //This will depend on how the memory is laid out in the 2d array. 
    int y = id / width; //If it's not row-major, then you'll need to flip these two statements.
    /*...*/
}

如果2D数组没有像我的示例所暗示的那样连续存储在内存中,则需要滚动自己的函数,以确保整个内存连续存储在单个堆分配对象中。

在opencl中不能将指针作为全局变量传递。图像/纹理是否符合您的目的?还是一维数组?我正在传递一个存储为结构数组的树数组,因此图像根本不适合我的用途。我可以考虑使用一维数组,但我不太确定这是否有效。树是否平衡?它们是否可以分别构造成一维阵列?如果您必须在大多数答案中使用不同的参数多次调用内核,但从未直接声明:
vector
在内存中没有连续的元素。我不知道这一点。我也不建议使用图像进行此类数据处理,因为访问图像通常需要一个采样器,这涉及到以一种会导致错误和难以读取代码的方式对访问进行抽象。或者,从另一个角度来看,使用示例和专用函数访问图像可以避免您必须进行难看的数学运算才能找到元素,使用单个内核支持多种不同的像素类型,允许边界、镜像或重复,如果需要,还可以访问硬件双线性插值。@Dithermaster如果处理的数据是实际的图像数据,所有这些都非常有用。但是,如果您使用的是数据结构或非图像数据(如OP所示),那么它只会增加复杂性的层次,而不会带来明显的好处。
kernel function(global int * array, int width, int height) {
    int id = get_global_id(0);
    int our_value = array[id];
    int x = id % width; //This will depend on how the memory is laid out in the 2d array. 
    int y = id / width; //If it's not row-major, then you'll need to flip these two statements.
    /*...*/
}