4

少し前に OpenCL の基本を学び始め、Appleの「基本的なプログラミング サンプル」を試してみることにしました。CPU では問題なく動作しますが、GPU をターゲット デバイスとして選択すると、エラー = -45 が発生します。

err = gclExecKernelAPPLE(k, ndrange, &kargs);

このエラー コードは に変換されCL_INVALID_PROGRAM_EXECUTABLEます。サンプルコードを修正するにはどうすればよいですか?

自動的に生成されkernel.cl.cたコードは次のようになります (+ インクルードが一番上にあります):

static void initBlocks(void);

// Initialize static data structures
static block_kernel_pair pair_map[1] = {
    { NULL, NULL }
};

static block_kernel_map bmap = { 0, 1, initBlocks, pair_map };

// Block function
void (^square_kernel)(const cl_ndrange *ndrange, cl_float* input, cl_float* output) =
^(const cl_ndrange *ndrange, cl_float* input, cl_float* output) {
    int err = 0;
    cl_kernel k = bmap.map[0].kernel;
    if (!k) {
        initBlocks();
        k = bmap.map[0].kernel;
    }
    if (!k)
        gcl_log_fatal("kernel square does not exist for device");
    kargs_struct kargs;
    gclCreateArgsAPPLE(k, &kargs);
    err |= gclSetKernelArgMemAPPLE(k, 0, input, &kargs);
    err |= gclSetKernelArgMemAPPLE(k, 1, output, &kargs);
    gcl_log_cl_fatal(err, "setting argument for square failed");

    err = gclExecKernelAPPLE(k, ndrange, &kargs);

    gcl_log_cl_fatal(err, "Executing square failed");
    gclDeleteArgsAPPLE(k, &kargs);
};

// Initialization functions
static void initBlocks(void) {
    const char* build_opts = " -cl-std=CL1.1";
    static dispatch_once_t once;
    dispatch_once(&once,
    ^{ int err = gclBuildProgramBinaryAPPLE("OpenCL/kernel.cl", "", &bmap, build_opts);
        if (!err) {
            assert(bmap.map[0].block_ptr == square_kernel && "mismatch block");
            bmap.map[0].kernel = clCreateKernel(bmap.program, "square", &err);
        }
    });
}

__attribute__((constructor))
static void RegisterMap(void) {
    gclRegisterBlockKernelMap(&bmap);
    bmap.map[0].block_ptr = square_kernel;
}
4

1 に答える 1

1

10.7.3 で実行しているときに同じ問題が発生しましたが、10.7.5 のマシンでは問題なく動作しました。CVMCompilerアプリを呼び出すたびに、プロセスがクラッシュしていることに気付きました。

スタック トレースを調べたところ、ビットコードを解析してネイティブ コードにコンパイルしようとしたときにクラッシュしていることに気付きました。ビットコードの解析に失敗したためgclExecKernelAPPLE()、実行するコンパイル済みプログラムが生成されなかったため、エラーが発生しました。

10.7.5 または実際には 10.8 にアップグレードしてみてください。問題は解決するはずです。(これをテストしたところ、実際に問題が解決しました。)

于 2013-02-21T05:42:59.617 に答える