Při odesílání hardwarových příkazů GPU prostřednictvím zásobníku WDDM je poměrně velká režie.
Jak jste zjistili, znamená to, že v rámci WDDM (pouze) mohou být příkazy GPU „dávkovány“ k amortizaci této režie. Dávkový proces může (pravděpodobně bude) zavádět určitou latenci, která se může měnit v závislosti na tom, co se děje.
Nejlepším řešením pod Windows je přepnout provozní režim GPU z WDDM na TCC, což lze provést pomocí nvidia-smi
příkaz, ale je podporován pouze na GPU Tesla a některých členech rodiny GPU Quadro – tedy ne GeForce. (Má to také vedlejší účinek, který brání tomu, aby bylo zařízení používáno jako grafický adaptér akcelerovaný systémem Windows, což může být relevantní pro zařízení Quadro nebo několik konkrétních starších GPU Fermi Tesla.)
AFAIK neexistuje žádná oficiálně zdokumentovaná metoda, jak obejít nebo ovlivnit dávkovací proces WDDM v ovladači, ale neoficiálně jsem slyšel, podle [email protected] v tomto odkazu, příkaz, který se má vydat po volání jádra cuda, je cudaEventQuery(0);
což může/mělo způsobit, že se dávková fronta WDDM „vyprázdní“ do GPU.
Jak zdůrazňuje Greg, rozsáhlé používání tohoto mechanismu zničí výhodu amortizace a může způsobit více škody než užitku.
UPRAVIT: do roku 2016 by novější doporučení pro „nízký dopad“ splachování fronty příkazů WDDM bylo cudaStreamQuery(stream);
EDIT2: Pomocí nejnovějších ovladačů ve Windows byste měli být schopni umístit GPU rodiny Titan do režimu TCC, za předpokladu, že máte pro primární zobrazení nastavenou jinou GPU. nvidia-smi
vám umožní přepínat režimy (pomocí nvidia-smi --help
pro více informací).
Další informace o modelu ovladače TCC lze nalézt v instalační příručce systému Windows, včetně toho, že může snížit latenci spouštění jádra.
Prohlášení o podpoře TCC je obecné. Ne všechny Quadro GPU jsou podporovány. Konečným určujícím faktorem podpory TCC (nebo ne) na konkrétním GPU je nvidia-smi
nástroj. Nic zde by nemělo být vykládáno jako záruka podpory TCC na vašem konkrétním GPU.