2

ローカル メモリに格納された構造体内のグローバル メモリへのポインタに対する OpenCL コンパイラの応答に混乱しています。最小限のテスト ケースを次に示します。

struct Helper {
    unsigned char bytes[32769];
};

struct Main {
    __global struct Helper *h;
};

void __kernel test(void)
{
    __local struct Main m;
}

これは clBuildProgram 中にエラーで失敗しますCL_BUILD_PROGRAM_FAILURE。ただし、上記のマジック番号32769をより低い番号に変更すると、プログラムをコンパイルできます。

失敗したclBuildProgram場合、 を介して利用できる出力はありませんclGetProgramBuildInfo(… CL_PROGRAM_BUILD_LOG)。システム ログにエラーは報告されません。

32k は、私のビデオ カード (AMD Radeon HD 6750M) のコンピューティング ユニットあたりのローカル メモリの量です。しかし、ご覧のとおり、この大きな構造体へのポインターを格納しています。これはグローバル メモリに格納されます。構造自体をローカル メモリに作成しようとしているわけではありません。では、なぜ構造体のサイズによって違いが生じるのでしょうか?

この失敗は、OS X 10.8 を実行している Macbook Pro で発生し、以前のバージョンの OS X でも失敗しました。ただし、NVidia グラフィックス カードを搭載した Linux マシンでは正常にコンパイルされます。

私のドライバープログラムはこちらです。(カーネルを変更した Apple のデモ プログラムです)。gcc -o test test.c -framework OpenCL を使用して OS X でコンパイルします。

4

1 に答える 1

0

AMD ハードウェア 6970 で、カーネルによって生成された ISA コードを確認しましたが、これは NOOP であり、命令のみの初期化がないため、カーネルが実行されることはないと思います。

ISA のビュー。

; --------  Disassembly --------------------

00 NOP NO_BARRIER 
END_OF_PROGRAM

イリノイ州の眺め

       ;ARGEND:__OpenCL_test_kernel
        func 1026 ; test                        ; @__OpenCL_test_kernel
        ; BB#0:                                 ; %entry
    ret_dyn
ret
endfunc ; test
于 2012-08-11T05:31:36.093 に答える