[英]How does printf work on CUDA compute >= 2
在早期,不支持printf
,我们要么使用仿真器运行CUDA程序,要么来回复制变量并在主机端打印。
既然CUDA(arch 2和更高版本)支持printf
我急于想知道它是如何工作的? 我的意思是屏幕上内部的GPU printf
如何? 计算能力1的限制因素是什么?
从《 CUDA C编程指南》中 :
printf将格式化的输出从内核打印到主机端输出流。
在内核启动之前,将printf()的输出缓冲区设置为固定大小(请参阅关联的主机端API)。 它是循环的,并且如果内核执行过程中产生的输出超出缓冲区的容量,则较旧的输出将被覆盖。 仅在执行以下操作之一时才刷新:
...
在内部,printf()使用共享的数据结构,因此调用printf()可能会更改线程的执行顺序。 特别是,调用printf()的线程可能比不调用printf()的线程花费更长的执行路径,并且该路径的长度取决于printf()的参数。 但是请注意,CUDA不保证线程执行顺序,除非在显式__syncthreads()障碍处,因此无法确定执行顺序是否已被printf()或硬件中的其他调度行为修改。
以下API函数获取并设置用于将printf()参数和内部元数据传输到主机的缓冲区的大小(默认值为1 MB):
cudaDeviceGetLimit(size_t* size,cudaLimitPrintfFifoSize)
cudaDeviceSetLimit(cudaLimitPrintfFifoSize, size_t size)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.