1

次のopenclコードはコンパイルに失敗します。

typedef struct {

    double d;
    double* da;
    long* la;
    uint ui;

} MyStruct;


__kernel void MyKernel (__global MyStruct*  s) {

}

エラーメッセージは次のとおりです。

line 11: error: kernel pointer arguments must point to addrSpace global, local, or constant
  __kernel void MyKernel (__global MyStruct*  s) {
                                              ^

ご覧のとおり、エラーが示すように、引数を「__global」で明確に修飾しました。何が間違っているので、どうすればこのエラーを解決できますか?

明らかに、これはカーネルのコンパイル中に発生するため、ホストコードはこれより先に進まないため、ここには投稿していません。

ありがとう。

4

1 に答える 1

2

問題は、構造体にポインターが含まれていることですが、これは許可されていません。そのようにカーネルからホストメモリを指すことはできないため、カーネル引数構造体のポインタはあまり意味がありません。可変サイズの配列はホストオブジェクトによってOpenCLにバックアップされ、cl_memそれは1つの引数全体にカウントされます。私の知る限り、可変サイズの配列はカーネル引数として直接渡すことしかできません(そしてワークユニットの数を調整することもできます)。したがって、もちろん)。

構造体にサイズ情報を入れて、スタンドアロンのカーネル引数として配列を引き出すことをお勧めします。

于 2012-09-25T00:13:30.973 に答える