printf 函数在 OpenCL 内核中不起作用

问题描述 投票:0回答:4

您好,我正在尝试在 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 变量。任何人都可以遇到这个问题吗?

debugging opencl playstation3
4个回答
9
投票

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

#pragma OPENCL EXTENSION cl_amd_printf : enable

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

(更新)从此页面,可能使用的扩展名可能是 cl_intel_printf,所以请尝试:

#pragma OPENCL EXTENSION cl_intel_printf : enable

6
投票

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

在我看来,你根本不应该使用 printf,它不够锋利,无法给出更复杂的硬件相关问题的答案。尝试使用附加参数,即“__global float* 输出”。在内核中填充类似

if (something_happened) { output[get_global_id(0)] = the_value_you_need_to_debug; }
的内容,这将帮助您诊断任何可能的问题,并且这种方法与平台无关


0
投票

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


0
投票

正如您问题的评论中所指出的,您使用的双引号符号似乎无效。

你有:

printf(“var”);

您的开始双引号字符

是 unicode
\u201c

您的结尾双引号字符
是 unicode
\u201d

您应该使用
"
,即 unicode
\u0022
。试试这个:

printf("var");

我知道你的问题已有13年历史了。

© www.soinside.com 2019 - 2024. All rights reserved.