在Windows中运行时,CUDA性能会受损

当我在Windows 7中运行我的CUDA应用程序(与Linux相比)时,我注意到了一个巨大的性能问题。 我想我可能知道放缓的地方:无论出于何种原因,Windows Nvidia驱动程序(版本331.65)在通过运行时API调用时不会立即派发CUDA内核。 为了说明这个问题,我描述了mergeSort应用程序(来自CUDA 5.5附带的例子)。

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

linux_launch

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

windows_launch

这篇文章build议,这个问题可能与Windows驱动程序批处理内核启动有关。 有反正我可以禁用这个批处理?

我正在使用GTX 690 GPU,Windows 7和Nvidia驱动程序版本331.65。

Solutions Collecting From Web of "在Windows中运行时,CUDA性能会受损"

通过WDDM堆栈发送GPU硬件命令的开销相当大 。

正如您已经发现的,这意味着在WDDM(仅)下,GPU命令可以“批量”分摊这个开销。 批处理可能会(可能会)引入一些延迟,这可能是可变的,这取决于还在发生什么。

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

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

正如格雷格所指出的那样,广泛使用这种机制将会消除摊销的收益,并且可能会造成更多的伤害而不是好处。

编辑:前进到2016年,一个较新的建议“低影响”刷新的WDDM命令队列将cudaStreamQuery(stream);

编辑2:使用Windows上的最新驱动程序,你应该能够把泰坦家庭GPU放在TCC模式,假设你有一些其他的GPU设置为主显示。 nvidia-smi工具将允许您切换模式(使用nvidia-smi --help获取更多信息)。

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