printf 在 CUDA 计算上如何工作 >= 2

Bib*_*rak 1 c printf cuda gpu

早期printf不支持,我们要么使用模拟器运行 CUDA 程序,要么来回复制变量并在主机端打印。

既然 CUDA(arch 2 及更高版本)支持,printf我很想知道这是如何工作的?我的意思printf是屏幕上的GPU 内部如何?计算能力 1 的限制因素是什么?

Alb*_*ert 5

来自CUDA C 编程指南

printf 将格式化输出从内核打印到主机端输出流。

printf() 的输出缓冲区在内核启动之前设置为固定大小(请参阅关联的主机端 API)。它是循环的,如果内核执行期间产生的输出多于缓冲区所能容纳的输出,则旧输出将被覆盖。只有在执行以下操作之一时才会刷新它:

...

printf() 在内部使用共享数据结构,因此调用 printf() 可能会更改线程的执行顺序。特别是,调用 printf() 的线程可能比不调用 printf() 的线程占用更长的执行路径,并且该路径长度取决于 printf() 的参数。但是请注意,除了显式 __syncthreads() 屏障外,CUDA 不保证线程执行顺序,因此无法判断执行顺序是否已被 printf() 或硬件中的其他调度行为修改。

以下 API 函数获取和设置用于将 printf() 参数和内部元数据传输到主机的缓冲区大小(默认为 1 兆字节):

  • cudaDeviceGetLimit(size_t* size,cudaLimitPrintfFifoSize)
  • cudaDeviceSetLimit(cudaLimitPrintfFifoSize, size_t size)