linux - 在 Windows 中运行时的 CUDA 性能损失

标签 linux windows cuda gpu

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

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

linux_launch

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

windows_launch

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/

相关文章:

python-3.x - 如何确定安装 hidapi.dll 的位置?

c# - 防止在测量阶段调用 ApplyTemplate()

CUDA C 在 double 上使用单精度触发器

linux - 如何更改公共(public) IPv4 使其独一无二

linux - 在 shell 中使用 "for"迭代文件中的行从不匹配目标

linux - DOS 上的 NASM(英特尔 8086): invalid effective address

php - htaccess 将 wordpress 重定向到 index2.php

c++ - 在 Visual Studio 2013 上的 C++ 中使用 pthread

concurrency - 并行编程入门

c++ - cudaMemcpyFromSymbol和cudaMemcpyToSymbol始终返回cudaErrorInvalidSymbol(13)错误