当我在 Windows 7(相对于 Linux)中运行我的 CUDA 应用程序时,我注意到性能受到很大影响。我想我可能知道减速发生在哪里:无论出于何种原因,Windows Nvidia 驱动程序(版本 331.65)在通过运行时 API 调用时不会立即分派(dispatch) CUDA 内核。 为了说明这个问题,我分析了 mergeSort 应用程序(来自 CUDA 5.5 附带的示例)。
首先考虑在 Linux 中运行时的内核启动时间:
接下来,考虑在 Windows 中运行时的启动时间:
这post表明问题可能与批处理内核启动的 Windows 驱动程序有关。无论如何我可以禁用这个批处理吗?
我运行的是 GTX 690 GPU、Windows 7 和 Nvidia 驱动程序版本 331.65。
最佳答案
有一个fair amount of overhead通过 WDDM 堆栈发送 GPU 硬件命令。
正如您所发现的,这意味着在 WDDM 下(仅)GPU 命令可以“分批”以分摊此开销。批处理过程可能(可能会)引入一些延迟,这可能是可变的,具体取决于其他情况。
windows下最好的解决办法是将GPU的工作模式从WDDM切换到TCC,这可以通过nvidia-smi
命令来完成,但只有Tesla GPU和某些特定的GPU支持Quadro 系列 GPU 的成员——即不是 GeForce。 (它还具有阻止设备用作 Windows 加速显示适配器的副作用,这可能与 Quadro 设备或一些特定的旧 Fermi Tesla GPU 相关。)
据我所知,没有正式记录的方法来规避或影响驱动程序中的 WDDM 批处理过程,但我非正式地听说过,根据 Greg@NV 在 this link 中的说法cuda 内核调用后发出的命令是 cudaEventQuery(0);
,它可能/应该导致 WDDM 批处理队列“刷新”到 GPU。
正如 Greg 指出的那样,广泛使用此机制会抵消摊销 yield ,弊大于利。
编辑: 到 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 的保证。
关于linux - 在 Windows 中运行时的 CUDA 性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19944429/