通过WDDM堆栈发送GPU硬件命令有一个
fair amount of overhead.
正如您所发现的,这意味着在WDDM(仅)下,GPU命令可以“批处理”以分摊此开销.批处理过程可能(可能会)引入一些延迟,这可能是可变的,具体取决于正在发生的其他事情.
Windows下的最佳解决方案是将GPU的操作模式从WDDM切换到TCC,这可以通过nvidia-smi命令完成,但它仅支持特斯拉GPU和Quadro系列GPU的某些成员 – 即不是GeForce. (它还具有阻止设备用作Windows加速显示适配器的副作用,这可能与Quadro设备或少数特定的旧费米特斯拉GPU相关.)
AFAIK没有官方记录的方法来规避或影响驱动程序中的WDDM批处理过程,但非正式地我听说过,根据Greg @ NV在this link中发出的cuda内核调用后发出的命令是cudaEventQuery(0);这可能/应该导致WDDM批处理队列“刷新”到GPU.
正如格雷格指出的那样,广泛使用这种机制将消除摊销利益,并且可能弊大于利.
编辑:前进到2016年,对WDDM命令队列的“低影响”刷新的新建议是cudaStreamQuery(stream);
编辑2:在Windows上使用最近的驱动程序,您应该能够将Titan系列GPU置于TCC模式,假设您已经为主显示器设置了其他GPU. nvidia-smi工具允许您切换模式(使用nvidia-smi –help获取更多信息).
有关TCC驱动程序模型的其他信息可以在windows install guide中找到,包括它可以减少内核启动的延迟.