让 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 内核中更新 OpenCL-OpenGL 共享缓冲区数据?

将 c++ 库包含到 openCL 内核中?

OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

OpenCL 内核中的组内同步,在本地内存上使用自旋锁