Speicher, der non-pageable im RAM ist und einen Device-Pointer für den VRAM hat (das, was man in CUDA-Sprache zero-copy nennt) muss in der Regel sehr wohl kopiert werden: Immer dann, wenn man eine dedizierte GPU hat, müssen die Daten vom RAM in den VRAM kopiert werden. Nur wenn man eine integrierte GPU hat, müssen keine Daten kopiert werden, weil sie ja bereits im gleichen Speicher liegen. Das zero-copy besagt nur, dass kein explizites
memcpy durchgeführt wird; CUDA wird im Hintergrund aber sehr wohl kopieren.
Der Sinn dahinter ist, dass man dadurch die Kopierlatenzen verstecken kann: Man nimmt an, dass der Kernel sehr rechenaufwändig ist; wenn der Kernel
- auf einer dedizierten GPU eine Page-Fault verursacht, werden die Daten auf die GPU kopiert. In der Regel rechnen andere Kernels noch rum, während ein paar Kernels auf die Speichertransfers warten. Darum laufen ein paar Berechnungen parallel zu ein paar Speichertransfers ab. Problematisch wird es, wenn die Berechnungen so schnell zu Ende sind, dass die Speichertransfers noch nicht abgeschlossen sind. Dann kann man kaum etwas verstecken.
- auf einer integrierten GPU eine Page-Fault verursacht, ist irgendwas kaputt, weil die Daten ja im RAM gehalten werden und dort als non-pageable gekenntzeichnet sind, also auch immer im RAM gehalten werden müssen. Hier muss nichts kopiert werden, Kopierlatenz ist Null.
Wie du siehst, bringt das nur richtig viel mit integrierten GPUs. Wenn dir im Vorfeld klar ist, dass alle deine Daten in den VRAM passen und deine Kernel sehr schnell bis moderat schnell sind, ist Kopieren-Berechnen-Kopieren fast immer schneller. Erst wenn die Kernels extrem lange rumrechnen und die Daten nicht komplett in den VRAM passen, könnte es etwas bringen.
Oder kurz: Das gibt es nicht in DirectCompute, weil integrierte GPUs das Schmuddelkind der Computergraphik sind, um das sich niemand kümmert; und die DirectCompute-Shader in der Regel eh nicht länger als zwei Sekunden dauern sollten, weil einem sonst der Watchdog um die Ohren fliegt.
dot hat geschrieben:IIRC is das für WDDM 2.x geplant (das und vollwertiges Preemptive Multitasking), ich hab nur leider den Link zum entsprechenden Talk nimmer..
In der Tat!
Hier der Link.
Krishty hat geschrieben:Und wo wir gerade beim Thema sind: Wann wird Direct3D voll virtualisierte Ressourcen unterstützen? Pläne, Kommentare, Hinweise? Anyone? eXile?
In der Präsentation finden sich keine Zeitangaben. Aber man kann wohl eine ungefähre Schätzung abgeben. Der Chef von Nvidia hat gesagt:
Jen-Hsun Huang hat geschrieben:Between now and Maxwell, we will introduce virtual memory, pre-emption, enhance the ability of the GPU to autonomously process, so that it's non-blocking of the CPU, not waiting for the CPU, relies less on the transfer overheads that we see today. These will take GPU computing to the next level, along with a very large speed up in performance.
Wenn du mich fragst, kommen diese Features mit Maxwell. Und Maxwell kommt 2014. Normalerweise sprechen sich Microsoft und die IHVs sich halbwegs ab (wenn man mal von der völlig lahmarschigen Implementierung von Direct3D 11 erst bei Fermi absieht); meine Antwort auf deine Frage wäre also ca. Mitte 2014. Wie du siehst, ist das alles sehr vage.
Im Jahre 2014 werde ich diesen Post zitieren und über meine Naivität lachen.