苹果OpenCL的基本编程示例无法在GPU上运行



我不久前开始学习OpenCL的一些基础知识,并决定尝试一下苹果公司的"基本编程示例"。我在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;
}

我在10.7.3下运行时也遇到了同样的问题,而10.7.5上的机器运行良好。我注意到每次调用我的应用程序后,CVMCompiler进程都会崩溃。

在检查堆栈跟踪时,我注意到它在试图解析位代码以编译为本机代码时崩溃了。由于位代码解析失败,因此gclExecKernelAPPLE()没有可执行的编译程序,因此出现错误。

试着升级到10.7.5,或者10.8,问题应该会消失。(我刚刚测试了这个,它确实解决了问题。)

最新更新