我刚刚开始学习一些关于OpenCL的基础知识,并决定从Apple获得"Basic programming sample"。我在CPU上运行正常,但是当我选择GPU作为目标设备时,我从
得到err = -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;
}
答案 0 :(得分:1)
我在10.7.3下运行时看到同样的问题,而10.7.5上的机器工作正常。我注意到每次调用我的应用程序后CVMCompiler
进程都崩溃了。
检查堆栈跟踪,我注意到在尝试解析bitcode以编译为本机代码时崩溃了。由于bitcode的解析失败,因此没有生成gclExecKernelAPPLE()
的编译程序,因此错误。
尝试升级到10.7.5,或者确实是10.8,问题应该消失。 (我刚试过这个,确实解决了这个问题。)