来自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)