ローカル メモリに格納された構造体内のグローバル メモリへのポインタに対する 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 でコンパイルします。