【问题标题】:Basic programming sample of OpenCL from Apple fails to run on GPUApple 的 OpenCL 基本编程示例无法在 GPU 上运行
【发布时间】:2012-08-27 23:27:48
【问题描述】:

不久前我开始学习一些有关 OpenCL 的基础知识,并决定试试 Apple 的 "Basic programming sample"。我在 CPU 上运行正常,但是当我选择 GPU 作为目标设备时,我得到 err = -45 from

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;
}

【问题讨论】:

  • 我假设您正在使用 GPU 创建队列,但是这个 GPU 是否支持 openCL?
  • 是的,使用 gpu 创建队列,是的,gpu 支持 opencl (ati HD6750M)。事实上,它在使用非苹果方法时运行正常。我只想知道为什么“官方”的方式会失败?
  • 如果您不通过构建选项会发生什么行为,即 build_opts = "-cl-std=CL1.1"... ?你还有这个错误吗?
  • @ocluser 我不能跳过这个特定的选项,xcode 会自动包含它。但是,我可以更改一个选项。是架构。默认情况下,它是一个字符串“i386 x86_64 gpu_32”。无论我在这里进行什么更改,它在 CPU 上运行正常,但在 GPU 上以 -45 失败。即使我只放了“gpu_32”,它也可以在 CPU 上运行,但不能在 GPU 上运行。这几乎就像选项没有传递给 opencl 编译器一样。

标签: xcode macos osx-lion opencl


【解决方案1】:

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

检查堆栈跟踪时,我注意到它在尝试解析位码以编译为本机代码时崩溃。由于位码解析失败,所以没有生成的编译程序供gclExecKernelAPPLE()执行,因此报错。

尝试升级到 10.7.5,或者确实是 10.8,问题应该会消失。 (我刚刚对此进行了测试,它确实解决了问题。)

【讨论】:

  • 也许您可以在升级后测试代码,如果解决了问题,请投票赞成答案?否则,如果它仍然不起作用,请告诉我们。
  • 别担心 Gavinb 我会在时间允许的情况下做到这一点。现在我太忙了,无法检查这是否能解决我的问题,但我会在了解更多信息后立即回到这里。
  • 我遇到了几乎同样的问题。我得到的错误是-44,它在 CPU 和 GPU 上都不起作用。你的回答,gavinb 并没有帮助我(不幸的是)。我在 OS X 10.9 (Mavericks) DP3 上,使用 XCode5-DP1。
  • @SergioMoura 错误代码 -44 表示CL_INVALID_PROGRAM(根据cl.h)。听起来您的内核中存在编译错误,但您仍在尝试执行它。确保在编译和链接阶段检查返回码,以了解根本原因。
猜你喜欢
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2017-12-19
相关资源
最近更新 更多