为什么CUDA代码在NVIDIA Visual Profiler中运行得更快?

18
一段代码在命令行上需要超过1分钟的时间,但在NVIDIA Visual Profiler中仅需几秒钟(运行相同的.exe文件)。因此,自然而然的问题是为什么?是命令行有问题,还是Visual Profiler做了一些不同的事情,并没有真正执行所有命令行上的内容?
我正在使用CUBLAS、Thrust和cuRAND。
顺便提一句,在我的机器上,即使是以前运行迅速的旧代码,最近也明显变慢了,因此我开始怀疑。
更新:
- 我已经检查了命令行和Visual Profiler上的计算输出是相同的——也就是说,在两种情况下都执行了所需的所有代码。 - 当我从命令行切换到Visual Profiler时,GPU-shark表明我的性能状态保持不变,仍然是P0。 - 但是,当使用Visual Profiler运行时,GPU利用率报告为0.0%,而在命令行下运行时,它可以高达98%。 - 此外,使用Visual Profiler使用的内存要少得多。当在命令行下运行时,任务管理器显示使用了650-700MB的内存(在第一个cudaFree(0)调用处会出现峰值)。在Visual Profiler中,这个数字降低到约100MB左右。

2
好的,实际上,涉及到的代码片段是一个跨越15个相互依赖的文件的项目,所以可能超出了这个问题的范围。我只是想知道是否有其他人遇到过Visual Profiler现象,并对此有解释。 - mchen
12
CUDA性能分析工具(Nsight VSE、Visual Profiler、nvprof和CUDA命令行分析器)将GPU设置为最高的P-State以确保结果一致。这不应该导致超过几个百分点的差异。更可能的原因是在使用分析工具运行应用程序时出现了错误。请确认您的应用程序可以正确地运行并且没有发生任何错误。 - Greg Smith
3
什么是P状态? - mchen
1
@MiloChen: 恭喜您成为[SO]上最受关注、无人回答的CUDA问题的所有者。您是否解决了这个问题?您还在继续努力吗?如果能够解决该问题,这将是一个好消息,可以让它从未回答的问题列表中消失。 - talonmies
2
如果代码在工具中运行速度比GPU使用率低10倍,我唯一合理的想法是在工具下运行时使用了某种仿真模式。对于这种特定的工作负载,运行在CPU上可以获得更好的性能——这并不罕见,因为大部分缓存都会自动发生在CPU端,而在CUDA和OpenCL等环境中需要显式思考和显式工作。我建议您查看各种构建选项和工具设置,看看是否有关于仿真模式的任何说明。 - Alexey Alexandrov
显示剩余15条评论
3个回答

7
这是一个老问题,但我刚刚解决了同样的问题(尽管原因可能不同)。
也就是说:当在NVVP下运行时,我的应用程序每秒可以实现900到1100帧(同步启动),但在分析器外运行时只有大约100-120帧。
原因似乎是我通过cout将状态消息打印到控制台。我本打算每100-200帧才打印一次状态消息。但实际上,它为每个帧打印一次状态消息,导致控制台IO成为瓶颈。
通过仅在每100帧打印一次状态消息(虽然最佳数字取决于您的应用程序),帧速率恢复到与我在NVVP中看到的一样。当然,如果这种开销在您的情况下无法接受,也可以在单独的CPU线程中处理。
NVVP必须将stdout重定向到其自己的内部缓冲区,以捕获应用程序的输出(它显示在其控制台选项卡中)。看起来NVVP用于缓冲或处理该输出的机制比允许操作系统直接处理它的机制具有显着更少的开销。看起来NVVP正在缓冲所有内容,并在单独的线程中显示它,或者只是保存一堆输出,直到达到某个阈值时,将该缓冲区添加到其自己的控制台选项卡中。
因此,我的建议是禁用任何控制台IO,并查看它是否影响事情。
(VS2012拒绝对我的CUDA应用程序进行分析并没有帮助。能够看到80%的执行时间用于控制台IO会很好。)
希望这可以帮助!

0

0

这不应该发生。我从未见过类似的情况,可能是你的设置中出了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接