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

Xcode 苹果OpenCL的基本编程示例无法在GPU上运行,xcode,macos,osx-lion,opencl,Xcode,Macos,Osx Lion,Opencl,不久前,我开始学习OpenCL的一些基础知识,并决定尝试一下苹果的产品。我在CPU上运行正常,但当我选择GPU作为目标设备时,我从中得到err=-45 err=gclExecKernelAPPLE(k、ndrange和kargs) 此错误代码转换为CL\u无效的程序\u可执行文件。知道如何更正示例代码吗 自动生成的kernel.cl.c代码如下(+顶部包含): 我在10.7.3下运行时也看到了同样的问题,而10.7.5上的一台机器工作正常。我注意到每次调用我的应用程序后,CVMCompiler进

不久前,我开始学习OpenCL的一些基础知识,并决定尝试一下苹果的产品。我在CPU上运行正常,但当我选择GPU作为目标设备时,我从中得到err=-45

err=gclExecKernelAPPLE(k、ndrange和kargs)

此错误代码转换为
CL\u无效的程序\u可执行文件
。知道如何更正示例代码吗

自动生成的
kernel.cl.c
代码如下(+顶部包含):


我在10.7.3下运行时也看到了同样的问题,而10.7.5上的一台机器工作正常。我注意到每次调用我的应用程序后,
CVMCompiler
进程都会崩溃

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


尝试升级到10.7.5,或者实际上是10.8,问题就会消失。(我刚刚测试了这个,它确实解决了问题。)

我假设您使用GPU创建队列,但是这个GPU支持openCL吗?是的,使用GPU创建队列,是的,GPU支持openCL(ati HD6750M)。事实上,当使用非苹果方法时,它运行正常。我只是想知道为什么“官方”方式失败?如果您不通过构建选项,即build_opts=“-cl std=CL1.1”,会有什么行为?你还收到这个错误吗?@ocluser我不能跳过这个选项,xcode会自动包含它。但是有一个选择我可以改变。这是架构。默认情况下,它是一个字符串“i386 x86_64 gpu_32”。无论我在这里做什么更改,它在CPU上运行正常,但在GPU上使用-45失败。即使我只放了“GPU32”,它也会在CPU上运行,但不会在gpu上运行。这就好像选项没有传递给opencl编译器一样。也许你可以在升级后测试代码,如果它解决了问题,你可以对答案进行升级投票?否则,如果它仍然不起作用,请告诉我们。别担心,加文,我会在时间允许的情况下完全这样做。现在我太忙了,没有时间检查这是否解决了我的问题,但我一知道更多的情况就会回来。我几乎也遇到了同样的问题。我得到的错误是
-44
,它既不能在CPU上工作,也不能在GPU上工作。你的回答,加文布没有帮我(很不幸)。我使用的是OSX10.9(Mavericks)DP3,使用的是XCode5-DP1。@SergioMoura错误代码-44表示
CL\u程序无效
(根据
CL.h
)。听起来内核中有编译错误,但您仍在尝试执行它。确保检查编译和链接阶段中的返回代码,以查看根本原因。
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;
}