C++ 指针指向 openCL 2.1 中的指针

C++ pointer to pointer in openCL 2.1

所以现在我正在尝试使用共享虚拟内存将指针的指针传递给 OpenCL 2.1 内核,根据我的阅读,这应该是可能的,但是当我尝试构建内核时,我得到了以下错误:

kernel parameter cannot be declared as a pointer to a pointer

        __kernel void MyKernel(__global float** doubleP) {
                                                 ^
    1 error generated.
    
    error: Clang front-end compilation failed!
    Frontend phase failed compilation.
    Error: Compiling CL to IR

那么将指针作为内核参数传递给指针的正确方法是什么

可能您的编译器默认为 OpenCL 1.2,这是不允许的。来自 OpenCL 1.2 restrictions:“程序中 __kernel 函数的参数不能声明为指向指针的指针”。

在OpenCL 2.1中,理论上应该是可以的。但是,最好还是使用线性化的一维数组,因为这样可以 快得多 coalesced memory access。要线性化 2D 索引,您可以使用:

uint __attribute__((always_inline)) index(const uint x, const uint y) {
    return n = x+y*size_x;
}
uint2 __attribute__((always_inline)) position(const uint n) {
    uint2 r;
    r.x = n%size_x;
    r.y = n/size_x;
}
// to access the 1D linearized array, use "float value = array[index(x, y)];"

您可以任意将其扩展到更高的维度。最好将索引转换移动到 OpenCL C 中的一个小内联函数中。数组大小应该不是问题,您可以在任何设备上为单个数组分配总视频内存的 1/4,并且现在大多数 GPU 都支持数组大小全部可用视频内存。