您好,我正在尝试在 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 变量。任何人都可以遇到这个问题吗?
我不知道IBM的实现,但printf()是一个非标准的OpenCL函数。在 AMD 平台上,您必须通过以下方式启用扩展:
#pragma OPENCL EXTENSION cl_amd_printf : enable
在 printf() 起作用之前。也许还需要在 IBM 平台上启用扩展?
(更新)从此页面,可能使用的扩展名可能是 cl_intel_printf,所以请尝试:
#pragma OPENCL EXTENSION cl_intel_printf : enable
您的 OpenCL 实现似乎不支持 printf,或者您可能正在使用硬件设备而不是模拟设备。
在我看来,你根本不应该使用 printf,它不够锋利,无法给出更复杂的硬件相关问题的答案。尝试使用附加参数,即“__global float* 输出”。在内核中填充类似
if (something_happened) { output[get_global_id(0)] = the_value_you_need_to_debug; }
的内容,这将帮助您诊断任何可能的问题,并且这种方法与平台无关
系统构建时不支持printf函数。您只能在软件和硬件仿真中使用它。
正如您问题的评论中所指出的,您使用的双引号符号似乎无效。
你有:
printf(“var”);
您的开始双引号字符
“
是 unicode \u201c
。”
是 unicode \u201d
。"
,即 unicode \u0022
。试试这个:
printf("var");
我知道你的问题已有13年历史了。