XCode预编译的OpenCL在不同的Mac OS版本和交替的CPU / GPU上崩溃

时间:2014-11-02 22:25:35

标签: xcode opencl

我有一个非常奇怪的问题:

我的一个项目使用OpenCL,并在XCode中使用以下选项进行编译:

OPENCL_ARCHS : i386 x86_64 gpu_32 gpu_64
OPENCL_COMPILER_VERSION : CL1.2

但是,当我在10.8.5下运行时,它在使用CL_DEVICE_TYPE_GPU时崩溃,当它是10.9.5时,它在CL_DEVICE_TYPE_CPU上崩溃。但另一种方式分别是工作。

我正在尝试的是运行一个空的测试内核:

kernel void InitBlocks(global float* pointless) {

}

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    gcdQueue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_XPU, NULL);
    cl_ndrange range = {
        1,
        {0, 0, 0},
        {1, 0, 0},
        {1, 0, 0}
    };
    dispatch_sync(gcdQueue, ^{
        InitBlocks_kernel(&range, Nil);
    });
}

每当我传递参数时,它都没有关系,稍后运行内核或实际在里面进行一些计算。它总是在调用中崩溃:

// Block function
void (^InitBlocks_kernel)(const cl_ndrange *ndrange, cl_float* unneccessary) =
^(const cl_ndrange *ndrange, cl_float* unneccessary) {
  int err = 0;
  cl_kernel k = bmap.map[0].kernel;
  if (!k) {
    initBlocks();
    k = bmap.map[0].kernel;
  }
  if (!k)
    gcl_log_fatal("kernel InitBlocks does not exist for device");
  kargs_struct kargs;
  gclCreateArgsAPPLE(k, &kargs);
  err |= gclSetKernelArgMemAPPLE(k, 0, unneccessary, &kargs);
  gcl_log_cl_fatal(err, "setting argument for InitBlocks failed");
  err = gclExecKernelAPPLE(k, ndrange, &kargs);
  gcl_log_cl_fatal(err, "Executing InitBlocks failed"); // <---- Here, err = -45
  gclDeleteArgsAPPLE(k, &kargs);
};

我认为这意味着它无法加载特定目标设备/平台的机器代码。

但我知道它可以在CPU和GPU上运行,因为我在具有两个不同Mac OS X版本(启动选项)的相同硬件上进行了测试。每个版本仅支持一个目标设备。我究竟做错了什么?这是我的源代码还是编译器选项?

希望我提供了足够的信息,有人对此有所了解......

1 个答案:

答案 0 :(得分:2)

这是一个已知问题w /预编译+自动Xcode集成的东西。 Apple似乎并不关心如何解决这个问题,他们自己的示例代码也崩溃了。解决方法是在运行时编译源代码。