如何让 CUDA 的 printf 打印到任意流?

How do I get CUDA's printf to print to an arbitrary stream?

本文关键字:打印 任意流 printf CUDA      更新时间:2023-10-16

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

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

在Windows下,CUDA在首次初始化上下文时使用活动的标准句柄。

你可以

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

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

我相信它在Linux下也能类似地工作(可能是通过使用两个参数dup2重定向stdout)。