0

OpenCL は初めてで、問題があります。私のプログラムでは、2 次元配列が必要です。1 次元配列をグラフィック カードにコピーしました。1 次元配列は必要ないので、すべての必要な値を初期化するメソッドを作成しました。2 次元配列は __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;

すべてのスレッドで再形成された配列にアクセスするにはどうすればよいですか?

ありがとうグレシエン

4

2 に答える 2

0

キャストについてはわかりませんが、配列全体にポインターを割り当てることはできません。これを行う必要があります:

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 など

于 2012-06-15T16:46:15.470 に答える
0

データを明示的に記録する必要はありません。1D バッファとして扱うだけです。をカーネル引数として渡し、row_widthで適切なインデックスを計算できますindex = y * row_width + x

于 2012-06-15T19:49:29.567 に答える