让 printf 语句在 openCL 内核代码中工作
Posted
技术标签:
【中文标题】让 printf 语句在 openCL 内核代码中工作【英文标题】:Getting a printf statement to work in openCL Kernel code 【发布时间】:2012-10-20 23:17:58 【问题描述】:在下面的 sn-p 中,我尝试在代码中使用 printf()
来尝试打印出 input[i]
计算的结果,以便我可以看到它工作正常。
这并没有像我希望的那样工作,因为printf()
中的引号与内核的字符串格式混淆,因此整个程序无法编译。我尝试使用转义字符\"
,它确实允许我为内核键入字符串,但编译时会给我预期的表达式和缺少字符的错误。
有谁知道如何解决这个问题?这是检查内核代码结果的最佳方式吗?
const char *KernelSource = "\n"
"__kernel void relax( \n"
" __global double* input, \n"
" __global double* output, \n"
" __global int N) \n"
" \n"
" int i = get_global_id(0); \n"
" if(i > 0 && i < N-1) \n"
" input[i] = 0.25*input[i-1]+0.5*input[i]+0.25*input[i+1]; \n"
" printf("input[%d] %f \n", i, input[i] )\n"
" \n"
" \n"
"\n";
【问题讨论】:
您能提供更多细节吗?你为什么要把这个函数构建成一个字符串?当你转义字符串时,你会得到什么错误? 您是在内核 printf 支持的 OpenCL 平台上执行此操作吗?它不是标准的一部分,并非所有供应商都支持它。 是的,我刚刚使用 nos 的答案来转义 \n,现在它不起作用,因为它无法识别 printf。我现在不知道如何在没有 printf 的情况下打印输出。 您使用的是什么设备?如果您使用的是 CPU,这是可能的,但如果您使用的是 GPU,则这是不可能的。 【参考方案1】:您需要转义引号,并且需要为格式字符串中的\n
转义\
。
" printf(\"input[%d] %f \\n\", i, input[i] )\n"
【讨论】:
不,就像我说的,我试过了。我收到了上面所说的错误消息。 @Chucky 如果您从某个地方收到错误消息,请复制/粘贴该错误消息并显示给我们,并告诉我们生成它的工具。 我不确定是否接受您的回答,因为我仍然无法识别内核代码中的 printf()。不过,您的建议首先得到了认可! @Chucky OpenCL 教程,opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201 展示了如何传达结果。这很重要,您必须将数据传回您的应用程序并拥有应用程序,例如打印它。不过,您最好在单独的文件中指定 opencl 代码,而不是在主机 C 程序中指定为字符串。以上是关于让 printf 语句在 openCL 内核代码中工作的主要内容,如果未能解决你的问题,请参考以下文章
OpenCL 在内存和性能方面,在内核代码中使用用户定义函数的效率如何
如何在 OpenCL 内核中更新 OpenCL-OpenGL 共享缓冲区数据?