一段代码需要在命令行上超过 1 分钟 在 中完成NVIDIA Visual Profiler 中的秒数 (运行相同的 .exe)。所以自然的问题是为什么?命令行是否有问题,或者 Visual Profiler 是否做了一些不同的事情,并没有像在命令行上那样真正执行所有内容?
我正在使用 CUBLAS、Thrust 和 cuRAND。
顺便说一句,最近在我的机器上编译的代码明显变慢了,甚至是以前运行速度很快的旧代码,因此我开始怀疑了。
更新:
cudaFree(0)
调用时出现峰值)。在 Visual Profiler 中,这个数字下降到 ~100MB。 最佳答案
这是一个老问题,但我刚刚完成了同样的问题(尽管原因可能不一样)。
即:我的应用程序在 NVVP 下运行时每秒达到 900 到 1100 帧(同步启动),但在分析器之外运行时大约为 100-120。
原因似乎是我通过 cout
打印到控制台的状态消息.我原本打算每 100-200 帧只发生一次。相反,它打印每一帧的状态消息,控制台 IO 成为瓶颈。
通过仅每 100 帧打印一次状态消息(尽管此处的最佳数量取决于您的应用程序),帧速率回升到与我在 NVVP 中看到的匹配。当然,如果这种开销在您的情况下是 Not Acceptable ,这也可以在单独的 CPU 线程中处理。
NVVP 必须重定向 stdout
到它自己的内部缓冲区,以捕获应用程序的输出(它显示在其控制台选项卡中)。似乎 NVVP 用于缓冲或处理输出的机制比允许操作系统直接处理它的开销要少得多。看起来 NVVP 正在缓冲所有内容,并将其显示在单独的线程中,或者只是保存一堆输出直到达到某个阈值,然后将缓冲区添加到自己的控制台选项卡中。
所以,我的建议是禁用任何控制台 IO,看看它是否或如何影响事情。
(VS2012 拒绝分析我的 CUDA 应用程序并没有帮助。很高兴看到 80% 的执行时间都花在了控制台 IO 上。)
希望这可以帮助!
关于performance - 为什么 CUDA 代码在 NVIDIA Visual Profiler 中运行得这么快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555528/