【问题标题】:OpenCL global arrayOpenCL 全局数组
【发布时间】:2012-06-16 03:49:29
【问题描述】:

我是 OpenCL 新手,但遇到了问题。 在我的程序中,我需要一个二维数组。我将一维数组复制到显卡。 因为我不需要一维数组,所以我编写了一个方法来初始化所有需要的值。二维数组应该是 __global --- 我只对这个数组进行了读取操作。

这是我的代码

typedef struct{
    unsigned char r;
    unsigned char g;
    unsigned char b;
    unsigned char a;
} ColorRGBA;

__constant ColorRGBA array[4096];

__kernel void marchingCubes(__global unsigned char* output)
{
    // DO SOMETHING WITH array

}


__kernel void initValues(__global unsigned char* input){
    // FILL array MAKE 1-dimensional to 2-dimensional (4096,4)
    array = (ColorRGBA*) input;
}

编译 OpenCL 程序时,出现以下错误:

:28:8: error: array type 'ColorRGBA __attribute__((address_space(2))) [4096]' is not assignable
        array = (ColorRGBA*) input;

如何在每个线程中访问重构后的数组?

谢谢 格列西恩

【问题讨论】:

    标签: arrays parallel-processing opencl global


    【解决方案1】:

    我不确定您的演员阵容,但您不能将指针分配给整个数组。你应该这样做:

    for (int x = 0; x < size_of_input; ++x)
      {
        array[x].r = input[x];
        array[x].g = input[x];
        array[x].b = input[x];
        array[x].a = input[x];
      }
    

    您需要传入函数输入数组的大小。

    这假设您的输入像素在整个数组中都按该顺序排列。 RGBARGBARGBA等

    【讨论】:

    • 输入是一个长度数组:16384 个无符号字符。我想将其转换为形状数组(4096,4)并将其存储在全局数组中。如果我使用你的方式,它不会创建一个 shape(0,x,​​y) 的数组吗?
    • @glethien 我对我的答案进行了一些修改,如果这就是你要找的,请告诉我?
    • 不是真的....在python中我这样做: self.grid = numpy.load("./testData.npy") self.grid = self.grid.reshape((4096 ,4)) 在原始输入中,每个 4 块是一个 ColorRGBA
    • @glethen,你不能这样做,因为它是强类型的,Python 不太关心类型。这是我知道的唯一方法。
    【解决方案2】:

    我不会费心明确记录您的数据 - 只需将其作为一维缓冲区处理即可。您可以将row_width 作为内核参数传递,然后使用index = y * row_width + x 计算适当的索引。

    【讨论】:

    • 我以一种肮脏的方式解决了它,但它对我有用。由于我是 stackOverflow 的新手,所以我无法发布我的问题的答案...
    • 好吧,一旦你有能力自我回答,就继续参与并重新审视这个问题。很高兴您找到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多