L'invio di comandi hardware GPU attraverso lo stack WDDM comporta un notevole sovraccarico.
Come hai scoperto, ciò significa che sotto WDDM (solo) i comandi GPU possono essere "raggruppati" per ammortizzare questo sovraccarico. Il processo di batching potrebbe (probabilmente lo farà) introdurre una certa latenza, che può essere variabile, a seconda di cos'altro sta accadendo.
La soluzione migliore sotto Windows è cambiare la modalità operativa della GPU da WDDM a TCC, operazione che può essere eseguita tramite nvidia-smi
comando, ma è supportato solo su GPU Tesla e su alcuni membri della famiglia di GPU Quadro, ovvero non su GeForce. (Ha anche l'effetto collaterale di impedire l'utilizzo del dispositivo come scheda video accelerata di Windows, il che potrebbe essere rilevante per un dispositivo Quadro o per alcune specifiche GPU Fermi Tesla meno recenti.)
AFAIK non esiste un metodo ufficialmente documentato per aggirare o influenzare il processo di batch WDDM nel driver, ma ufficiosamente ho sentito, secondo [email protected] in questo link il comando da emettere dopo la chiamata del kernel cuda è cudaEventQuery(0);
che potrebbe/dovrebbe causare lo "scaricamento" della coda batch WDDM nella GPU.
Come sottolinea Greg, l'uso estensivo di questo meccanismo annullerà il beneficio dell'ammortamento e potrebbe fare più male che bene.
MODIFICA: andando avanti fino al 2016, una raccomandazione più recente per uno svuotamento "a basso impatto" della coda dei comandi WDDM sarebbe cudaStreamQuery(stream);
EDIT2: Utilizzando i driver recenti su Windows, dovresti essere in grado di posizionare le GPU della famiglia Titan in modalità TCC, supponendo che tu abbia un'altra GPU configurata per la visualizzazione principale. Il nvidia-smi
ti permetterà di cambiare modalità (usando nvidia-smi --help
per maggiori informazioni).
Ulteriori informazioni sul modello di driver TCC sono disponibili nella guida all'installazione di Windows, incluso il fatto che potrebbe ridurre la latenza dei lanci del kernel.
L'affermazione sul supporto TCC è generale. Non tutte le GPU Quadro sono supportate. Il determinante finale del supporto per TCC (o meno) su una particolare GPU è il nvidia-smi
attrezzo. Nulla qui deve essere interpretato come una garanzia di supporto per TCC sulla tua particolare GPU.