【问题标题】:How do I get CUDA's printf to print to an arbitrary stream?如何让 CUDA 的 printf 打印到任意流?
【发布时间】:2014-05-26 17:16:29
【问题描述】:

CUDA 在内核中的printf() 打印到我的进程的标准输出流。现在,我想至少从这里开始将此打印输出重定向到任意输出流。我的意思是一个任意流,而不仅仅是一个文件描述符(正如here 所要求的那样)——我希望能够使用字符串流、日志记录基础设施等。

如果可能的话,我真的希望能够做一些事情,比如告诉单个内核将其printf() 输出发送到某个输出流。这可能吗?

【问题讨论】:

    标签: c++ cuda printf iostream io-redirection


    【解决方案1】:

    在 Windows 下,CUDA 使用标准句柄,该句柄在上下文首次初始化时处于活动状态。

    你可以

    1. 打开/创建文件或命名管道,
    2. 在程序开始时使用 SetStdHandle(STD_OUTPUT_HANDLE, handle) 并调用 cudaFree(0) 或一些类似的函数来初始化上下文。对于驱动程序 API,cuInit(0) 的位置是决定性的。之后您可以
    3. 将 SetStdHandle 重置为之前的值,如果您的剩余程序需要它。 CUDA 继续打印到您设置的流句柄。

    请注意,CUDA 命令确实是该进程的第一个命令。

    我相信它在 Linux 下的工作方式类似(可能是通过使用两个参数 dup2 来重定向标准输出)。

    【讨论】:

    • 我不是 Windows 用户,但这似乎很有用。但是 - cudaFree(0) 非常老套,而且不是官方的,恕我直言。您能根据 CUDA 驱动程序 API 说明这一点吗?是cuInit() 电话吗?一个cuPrimaryCtxRetain() 电话?
    • 这是 cuInit()。我把它放在答案中。您可以在 Linux 下通过创建一个小程序来试用它,该程序从内核中打印出一些东西(我必须小心,简约的打印内核有副作用并且没有被优化掉)。然后使用 int oldout = dup2(1); (无效)dup2(2, 1);在 cuInit(0) 和 (void)dup2(oldout, 1) 之前;在 cuInit(0) 之后与所有在 cuInit(0) 之前或之后。 dup2 命令应该将 Cuda 输出流式传输到 stderr。如果您重定向程序 2> errorlog.txt 的标准错误,您将希望看到不同之处。上述命令尚未测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2018-06-04
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多