【问题标题】:C++ pointer to pointer in openCL 2.1C++ 指针指向 openCL 2.1 中的指针
【发布时间】:2021-08-12 04:15:28
【问题描述】:

所以现在我正在尝试使用共享虚拟内存将指针的指针传递到 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 端,指针位于设备的地址空间中,而在主机端,它们位于主机的地址空间中。没有合乎逻辑的方式将它们等同起来。
  • @Mack 我正在尝试编写反向传播算法,这意味着我必须处理一些相当复杂的上标含义,因此我希望能够编写类似 P[ i ] 的东西[ j ][ k ] 而不是 P[ (i * n1)+(j * n2) + k],而且我不能使用数组,因为它们不能存储足够的数据。
  • 使用像这样的间接数组比平面数组消耗 更多 内存,因为每个间接级别都需要所有指针的内存(如果这很重要,它会更慢) .您是否尝试过使用平面阵列?您可以轻松地将索引计算抽象为宏。没有什么可以让您取消引用设备上主机内存中的指针。

标签: c++ pointers opencl


【解决方案1】:

也许您的编译器默认为 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 都支持数组大小全部可用视频内存。

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多