【问题标题】:printf function doesn't work in OpenCL kernelprintf 函数在 OpenCL 内核中不起作用
【发布时间】:2011-08-12 13:09:47
【问题描述】:

您好,我正在尝试在 PS3 上调试 OpenCL 内核代码。代码如下:

#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable

int offset() {
    return 'A' - 'a';
}

__kernel void tKernel(__global unsigned char *in, __global unsigned char *out) {    
    size_t i;
    printf(“var”);
    for (i = 0; i < 10; i++)
        out[i] = in[i] + offset();
}

在 IBM OpenCL_guide.pdf 第 18 页的 4.3.3 节中,描述了使用 printf 方法调试内核。 所以我将 printf 函数添加到我的内核并尝试对其进行测试。但是 OpenCL 编译给了我这个错误:

“IBM_OpenCL_kernel.cl”,第 9.15 行:1506-766 (S) 通用字符名称“?”不在标识符的允许范围内。

我也导出了 LD_LIBRARY_PATH 变量。有人有这个问题吗?

【问题讨论】:

  • 我怀疑你的引号字符不是 ascii...

标签: debugging opencl ps3


【解决方案1】:

您的 OpenCL 实现似乎不支持 printf,或者您使用的是硬件设备而不是模拟设备。

在我看来,您根本不应该使用 printf,它还不足以解决更复杂的硬件相关问题。尝试使用附加参数 aka '__global float* output'。用if (something_happened) { output[get_global_id(0)] = the_value_you_need_to_debug; } 之类的东西在内核中填充它,这将帮助您诊断任何可能的问题,并且这种方法与平台无关

【讨论】:

    【解决方案2】:

    我不知道 IBM 的实现,但 printf() 是一个非标准的 OpenCL 函数。在 AMD 平台上,您必须通过以下方式启用扩展:

    #pragma OPENCL EXTENSION cl_amd_printf : enable
    

    在 printf() 起作用之前。也许还需要在 IBM 平台上启用扩展?

    (更新)从this page,可能使用的扩展名可能是cl_intel_printf,所以试试:

    #pragma OPENCL EXTENSION cl_intel_printf : enable
    

    【讨论】:

      【解决方案3】:

      在系统中构建时不支持 printf 功能。您只能在软件和硬件仿真中使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-20
        • 2017-05-04
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 2021-04-11
        • 2019-12-31
        • 1970-01-01
        相关资源
        最近更新 更多