【问题标题】:CUDA performance penalty when running in Windows在 Windows 中运行时的 CUDA 性能损失
【发布时间】:2013-11-25 12:03:16
【问题描述】:

当我在 Windows 7(相对于 Linux)中运行 CUDA 应用程序时,我注意到性能受到很大影响。我想我可能知道减速发生在哪里:无论出于何种原因,Windows Nvidia 驱动程序(版本 331.65)在通过运行时 API 调用时都不会立即调度 CUDA 内核。 为了说明问题,我分析了 mergeSort 应用程序(来自 CUDA 5.5 附带的示例)。

首先考虑在 Linux 中运行时的内核启动时间:

接下来,考虑在 Windows 中运行时的启动时间:

post 表明该问题可能与批处理内核启动的 Windows 驱动程序有关。无论如何我可以禁用此批处理吗?

我使用 GTX 690 GPU、Windows 7 和 Nvidia 驱动程序的 331.65 版运行。

【问题讨论】:

  • 通常情况下,第一次在 Windows 中启动内核可能会比第二次/第三次启动它花费更多的时间。

标签: linux windows cuda gpu


【解决方案1】:

在通过 WDDM 堆栈发送 GPU 硬件命令时有一个 fair amount of overhead

正如您所发现的,这意味着在 WDDM(仅)下,GPU 命令可以“批处理”以分摊此开销。批处理过程可能(可能会)引入一些延迟,这可能是可变的,具体取决于发生的其他情况。

windows下最好的解决方案是将GPU的运行模式从WDDM切换到TCC,可以通过nvidia-smi命令来完成,但仅支持Tesla GPU和Quadro系列GPU的某些成员- 即不是 GeForce。 (它还具有阻止设备用作 Windows 加速显示适配器的副作用,这可能与 Quadro 设备或一些特定的旧 Fermi Tesla GPU 有关。)

AFAIK 没有正式记录的方法来规避或影响驱动程序中的 WDDM 批处理过程,但我非正式地听说,根据 this link 中的 Greg@NV,在 cuda 内核调用后发出的命令是 @987654325 @ 这可能/应该导致 WDDM 批处理队列“刷新”到 GPU。

正如 Greg 所指出的,广泛使用这种机制会抹杀摊销收益,而且弊大于利。

编辑: 到 2016 年,对 WDDM 命令队列的“低影响”刷新的更新建议是 cudaStreamQuery(stream);

EDIT2:使用 Windows 上的最新驱动程序,您应该能够将 Titan 系列 GPU 置于 TCC 模式,假设您为主显示器设置了一些其他 GPU。 nvidia-smi 工具将允许您切换模式(使用 nvidia-smi --help 了解更多信息)。

有关 TCC 驱动程序模型的其他信息可以在 windows install guide 中找到,包括它可以减少内核启动的延迟。

关于 TCC 支持的声明是一般性的。并非所有 Quadro GPU 都受支持。在特定 GPU 上支持(或不支持)TCC 的最终决定因素是 nvidia-smi 工具。此处的任何内容都不应被解释为保证在您的特定 GPU 上支持 TCC。

【讨论】:

  • 天哪,我想我应该买一辆特斯拉,因为我只想将 GPU 用于 CUDA 处理(而不是图形)。我只买了 GTX 690,因为就 $/处理能力比而言,它似乎更划算……
  • 如果您是喜欢冒险的人,可以通过将另一个 BIOS 刷新到您的卡上来解决 NVIDIA 在这方面对 GeForce 硬件的破坏(这在 Fermi 硬件上是可能的,但我没有检查开普勒)。
  • GTX690 基于两个 GK104 GPU,AFAIK 没有“禁用”DP 单元。
  • @RobertCrovella:哎呀...我以为 GTX680 和 GTX690 使用了 GK110。看起来目前高端 GTX7xx 卡使用完整的 GK110 并禁用双精度单元。
  • @rmccabe3701:对于 CUDA,我会选择 Titan 而不是 GTX690,因为两者的成本差不多,而且 Titan 具有完整的双精度浮点性能。 GTX690 的 DP 单元很少。此外,作为 CC 3.5 设备的 Titan 支持动态并行(从内核中启动内核)。 GTX690 是一款没有该支持的 CC 3.0 设备。
【解决方案2】:

即使这个问题已经过去快 3 年了,我仍然认为有必要提供我的发现。

我遇到过同样的情况:在 Ubuntu cuda 8.0 中,相同的 cuda 程序运行了 5 毫秒,而在 Windows 10 cuda 10.1 中运行了超过 30 毫秒。两者都配备 GTX 1080Ti。 但是,在 Windows 中,当我将编译器从 VS Studio 更改为 cmd 的 nvcc 编译器时,程序突然被提升到与 Linux 相同的速度。

这表明问题可能来自 Visual Studio。

【讨论】:

  • 在这种情况下,请检查 VS Studio 解决方案传递给 nvcc 的命令行参数。这里没有魔法......
猜你喜欢
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多