【问题标题】:How does printf work on CUDA compute >= 2printf 如何在 CUDA 计算 >= 2 上工作
【发布时间】:2015-03-31 04:21:14
【问题描述】:

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

现在 CUDA(arch 2 和更高版本)支持 printf 我很想知道它是如何工作的?我的意思是 GPU printfs 在屏幕上的内部情况如何?计算能力 1 的限制因素是什么?

【问题讨论】:

  • 据我所知printf() 需要 ABI。 sm_1x 设备没有 ABI,原因之一可能是设备上缺少带有通用指针的平面地址空间(sm_1x 仅支持共享、全局、常量等地址空间的地址空间特定指针)。当前设备端printf() 输出到GPU 全局内存中的环形缓冲区,其内容在内核完成后传输到主机。环形缓冲区显然会溢出;据我所知,大小是用户可配置的,请查看编程指南。
  • 您可以使用cudaDeviceSetLimit (cudaLimitPrintfFifoSize, sizeInBytes) 设置设备大小printf() 的环形缓冲区大小。请参阅 [CUDA 运行时 API 文档](docs.nvidia.com/cuda/cuda-runtime-api/…)
  • 设备端printf()的操作在section B.17. of the CUDA C Programming Guide中有详细描述

标签: c cuda printf gpu


【解决方案1】:

来自CUDA C Programming Guide

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

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

...

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

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

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

【讨论】:

    猜你喜欢
    • 2021-02-25
    • 2017-02-01
    • 2017-07-20
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    相关资源
    最近更新 更多