Linux 在Windows中运行时CUDA性能损失

Linux 在Windows中运行时CUDA性能损失,linux,windows,cuda,gpu,Linux,Windows,Cuda,Gpu,我注意到,当我在Windows7(与Linux相比)中运行CUDA应用程序时,性能受到了很大的影响。我想我可能知道减速发生在哪里:无论出于何种原因,Windows Nvidia驱动程序(版本331.65)在通过运行时API调用时不会立即调度CUDA内核。 为了说明这个问题,我分析了mergeSort应用程序(来自CUDA 5.5附带的示例) 首先考虑在Linux中运行时的内核启动时间: 接下来,考虑在Windows中运行时的启动时间: 这表明问题可能与windows驱动程序批处理内核启动有关

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

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

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

这表明问题可能与windows驱动程序批处理内核启动有关。我是否可以禁用此批处理

<>我用GTX 690 GPU、Windows 7和英伟达驱动程序331.65版本运行。

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

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

AFAIK说,目前还没有官方文档记录的方法来规避或影响驱动程序中的WDDM批处理过程,但据我所知,这是非正式的Greg@NVcuda内核调用后要发出的命令为
cudaEventQuery(0)这可能/应该导致WDDM批处理队列“刷新”到GPU

正如格雷格指出的,这种机制的广泛使用将抵消摊销收益,而且可能弊大于利

编辑:展望2016年,对WDDM命令队列进行“低影响”刷新的较新建议是
cudaStreamQuery(stream)

EDIT2:在windows上使用最新的驱动程序,您应该能够将Titan系列GPU置于TCC模式,前提是您为主显示设置了其他GPU。
nvidia smi
工具将允许您切换模式(有关更多信息,请使用
nvidia smi--help

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


关于TCC支持的声明是一般性的。并非所有Quadro GPU都受支持。在特定GPU上支持TCC(或不支持TCC)的最终决定因素是
nvidia smi
工具。这里没有什么可以解释为在您的特定GPU上支持TCC的保证。

< P>即使这个问题已经活跃了将近3年,我仍然认为有必要提供我的发现。

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


这表明问题可能来自VisualStudio

通常,在Windows中第一次启动内核可能比第二次/第三次花费更多的时间。。。天哪,我想我应该买一台特斯拉,因为我只想用GPU进行CUDA处理(而不是图形)。我之所以得到GTX 690,是因为就美元/处理能力比而言,它似乎是一个更好的交易……如果你是喜欢冒险的人,那么可以通过在你的卡上闪烁另一个BIOS来解决NVIDIA对GeForce硬件的破坏(在费米硬件上是可能的,但我还没有检查开普勒).GTX690基于两个GK104 GPU,AFAIK没有“禁用”DP单元。@RobertCrovella:Oops。。。我认为GTX680和GTX690使用的是GK110。看起来现在的高端GTX7xx卡使用的是带有禁用双精度单位的完整GK110。@rmccabe3701:对于CUDA,我会选择Titan而不是GTX690,因为这两种卡的价格差不多,Titan具有完整的双精度浮点性能。GTX690的DP装置很少。此外,Titan是一款CC 3.5设备,支持动态并行(从内核中启动内核)。GTX690是不支持该支持的CC 3.0设备。在这种情况下,请检查VS Studio解决方案传递给nvcc的命令行参数。这里没有魔法。。。