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

标签 performance cuda gpgpu

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

我正在使用 CUBLAS、Thrust 和 cuRAND。

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

更新:

  • 我检查了 计算输出 在命令行和 Visual Profiler 是 相同 - 即在这两种情况下都运行了所有必需的代码。
  • GPU-shark 表示我的 性能状态不变当我从命令行切换到 Visual Profiler 时,在 P0。
  • 但是, GPU 使用率 报告于 0.0% 当使用 运行时视觉分析器 , 但高达 98% 逃跑时命令行 .
  • 而且,远 Visual Profiler 使用更少的内存 .当从命令行运行时,任务管理器指示使用了 650-700MB 的内存(在第一次 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/

    相关文章:

    cuda - cudaMemcpyToSymbol 的问题

    python - 安装了 beignet 以在 Intel 上使用 OpenCL,但 OpenCL 程序仅在以 root 身份运行时才有效

    OpenCL:GPU 上的单一计算设备?

    C++程序在VS2008中运行缓慢

    javascript - 打开div并关闭其他

    c++ - 从传递的 FORTRAN 数组生成 CUSP coo_matrix

    OpenCL:防止内核缓存

    performance - 为什么 listFindNoCase() 和 listFind() "much faster"不是 CF 中的简单 OR/IS?

    c# - 压缩 if-elseif-else 语句以节省比较

    python - 在启用 GPU 的 Windows 8 上安装 theano