17

一段在命令行上花费超过 1 分钟的代码在 NVIDIA Visual Profiler(运行相同的.exe)中只需几秒钟即可完成。所以自然的问题是为什么?命令行是否有问题,或者 Visual Profiler 是否做了一些不同的事情,并没有像在命令行上那样真正执行所有内容?

我正在使用 CUBLAS、Thrust 和 cuRAND。

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

更新:

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

3 回答 3

6

这是一个老问题,但我刚刚完成了同样的问题(尽管原因可能不一样)。

即:我的应用程序在 NVVP 下运行时每秒达到 900 到 1100 帧(同步启动),但在探查器之外运行时大约为 100-120。

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

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

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

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

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

希望这可以帮助!

于 2014-11-12T18:50:01.590 回答
0

可能是 探查器跳过了一些JIT 编译步骤。这可以解释内存使用的差异。尝试创建一个胖二进制文件

于 2013-10-18T19:19:26.697 回答
0

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

于 2013-10-08T20:03:21.077 回答