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

时间:2013-05-15 01:53:36

标签: performance cuda gpgpu

在命令行上超过1分钟的一段代码在NVIDIA Visual Profiler中秒内完成(运行相同< / em> .exe)。所以自然的问题是为什么?命令行是否有问题,或者Visual Profiler是否执行了不同的操作而不是在命令行上执行所有操作?

我正在使用CUBLAS,Thrust和cuRAND。

顺便说一句,最近我的机器上的编译代码明显减慢,甚至以前运行得很快的旧代码,因此我开始怀疑。

更新

  • 我已检查命令行上的计算输出和Visual Profiler 相同 - 即在两种情况下都运行了所有必需的代码。
  • 当我从命令行切换到Visual Profiler时,GPU-shark表示我的性能状态在P0处未更改
  • 然而,当使用 Visual Profiler 运行时, 0.0%报告 GPU使用率,但是 98%< / strong>在命令行时运行。
  • 此外, 内存较少用于Visual Profiler 。当运行命令行时,任务管理器指示使用650-700MB内存(第一次cudaFree(0)调用时出现峰值)。在Visual Profiler中,这个数字下降到大约100MB。

3 个答案:

答案 0 :(得分:5)

这是一个老问题,但我刚刚完成追逐相同的问题(虽然原因可能不一样)。

即:我的应用程序在NVVP下运行时每秒可实现900到1100帧(同步启动),但在分析器外部运行时可达到100到120帧。

原因似乎是我通过cout打印到控制台的状态消息。我原本打算这个只发生在每100-200帧一次。相反,它正在为每一帧打印状态消息,并且控制台IO成为瓶颈。

仅通过每100帧打印一次状态消息(尽管此处的最佳数量取决于您的应用),帧速率会跳回到与我在NVVP中看到的相匹配。当然,如果在您的情况下这种开销是不可接受的,也可以在单独的CPU线程中处理。

NVVP必须将stdout重定向到其自己的内部缓冲区,以便捕获应用程序的输出(它在控制台选项卡中显示)。看起来NVVP用于缓冲或处理该输出的机制比允许操作系统直接处理它的开销要小得多。看起来NVVP正在缓冲所有内容,并在单独的线程中显示它,或只是保存一堆输出直到达到某个阈值,当它将缓冲区添加到它自己的控制台选项卡时。

所以,我的建议是禁用任何控制台IO,看看是否或如何影响事情。

(VS2012拒绝分析我的CUDA应用程序并没有帮助。很高兴看到80%的执行时间花在了控制台IO上。)

希望这有帮助!

答案 1 :(得分:0)

这不应该发生。我从来没有见过这样的东西;可能是你设置中的东西。

答案 2 :(得分:0)

可能是探查器跳过了一些JIT-compile step。这可以解释内存使用的差异。尝试创建fat binary