在早期printf
不受支持,我们要么使用模拟器运行CUDA程序,要么来回复制变量并在主机端打印。
现在CUDA(2号及更高版本)支持printf
我很想知道这是如何工作的?我的意思是屏幕上的GPU printf
内部如何?计算能力1的限制因素是什么?
答案 0 :(得分:3)
printf将内核的格式化输出打印到主机端输出流。
在内核启动之前,printf()的输出缓冲区设置为固定大小(请参阅关联的主机端API)。它是循环的,如果在内核执行期间产生的输出多于缓冲区中的输出,则会覆盖旧的输出。只有在执行其中一个操作时才会刷新它:
...
内部printf()使用共享数据结构,因此调用printf()可能会改变线程的执行顺序。特别是,调用printf()的线程可能需要比不调用printf()的线程更长的执行路径,并且该路径长度取决于printf()的参数。但请注意,除了显式__syncthreads()障碍外,CUDA不保证线程执行顺序,因此无法判断执行顺序是否已被printf()或硬件中的其他调度行为修改。
以下API函数获取并设置用于将printf()参数和内部元数据传输到主机的缓冲区大小(默认值为1兆字节):
cudaDeviceGetLimit(size_t* size,cudaLimitPrintfFifoSize)
cudaDeviceSetLimit(cudaLimitPrintfFifoSize, size_t size)