Zero-Copy u. DxCompute
Zero-Copy u. DxCompute
Hallo zusammen,
es gibt in CUDA bzw. OpenCl ein nettes Feature welches sich zero-copy nennt. Wenn ich alles richtig verstanden habe kann ich so Speicherbereiche definieren welche im Hauptspeicher liegen aber von der GPU aus abfragbar sind (Read-Only würde mir sogar reichen). Kann man dieses Verfahren irgendwie unter DirectCompute verwenden (Dx11).
Was ich genau machen möchte:
1.) Großen Speicherbereich im Hauptspeicher (z.B. 10GB)
2.) Aus meinen Shadern greife ich darauf zu und packe die benötigten Daten in meinen GPU Speicher
Vielen Dank,
Manuel
es gibt in CUDA bzw. OpenCl ein nettes Feature welches sich zero-copy nennt. Wenn ich alles richtig verstanden habe kann ich so Speicherbereiche definieren welche im Hauptspeicher liegen aber von der GPU aus abfragbar sind (Read-Only würde mir sogar reichen). Kann man dieses Verfahren irgendwie unter DirectCompute verwenden (Dx11).
Was ich genau machen möchte:
1.) Großen Speicherbereich im Hauptspeicher (z.B. 10GB)
2.) Aus meinen Shadern greife ich darauf zu und packe die benötigten Daten in meinen GPU Speicher
Vielen Dank,
Manuel
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Zero-Copy u. DxCompute
Ohne Kopie geht es meines Wissens nicht, am nächsten kommst du wohl mit händischer Aktualisierung dynamischer Puffer.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
- Krishty
- Establishment
- Beiträge: 8343
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Zero-Copy u. DxCompute
Jetzt habe ich wieder Sehnsucht nach Sparse Virtual Textures. Toll. Danke.
Mit OpenGL kannst du das als AMD-Erweiterung nutzen; der Treiber kümmert sich in diesem Fall um das Paging. Das ist aber wahrscheinlich, was du mit OpenCL meintest?
Und wo wir gerade beim Thema sind: Wann wird Direct3D voll virtualisierte Ressourcen unterstützen? Pläne, Kommentare, Hinweise? Anyone? eXile?
Mit OpenGL kannst du das als AMD-Erweiterung nutzen; der Treiber kümmert sich in diesem Fall um das Paging. Das ist aber wahrscheinlich, was du mit OpenCL meintest?
Und wo wir gerade beim Thema sind: Wann wird Direct3D voll virtualisierte Ressourcen unterstützen? Pläne, Kommentare, Hinweise? Anyone? eXile?
- dot
- Establishment
- Beiträge: 1746
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Zero-Copy u. DxCompute
IIRC is das für WDDM 2.x geplant (das und vollwertiges Preemptive Multitasking), ich hab nur leider den Link zum entsprechenden Talk nimmer..
Re: Zero-Copy u. DxCompute
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
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.
Im Jahre 2014 werde ich diesen Post zitieren und über meine Naivität lachen.
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.
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.
In der Tat! Hier der Link.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 Präsentation finden sich keine Zeitangaben. Aber man kann wohl eine ungefähre Schätzung abgeben. Der Chef von Nvidia hat gesagt:Krishty hat geschrieben:Und wo wir gerade beim Thema sind: Wann wird Direct3D voll virtualisierte Ressourcen unterstützen? Pläne, Kommentare, Hinweise? Anyone? eXile?
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.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.
Im Jahre 2014 werde ich diesen Post zitieren und über meine Naivität lachen.
- Lynxeye
- Establishment
- Beiträge: 145
- Registriert: 27.02.2009, 16:50
- Echter Name: Lucas
- Wohnort: Hildesheim
- Kontaktdaten:
Re: Zero-Copy u. DxCompute
Unabhängig davon, ob die aktuellen Runtimes dies tun oder unterstützen, denn davon habe ich keine Ahnung: wieso sollte ein Kernel, welcher auf einer dedizierten GPU ausgeführt wird nicht auf Sysram Puffern arbeiten können? Der Device-Pointer welchen du erhältst ist genau das: eine virtuelle Speicheradresse im Adressraum der GPU, welche nach der virt->phys Übersetzung genauso gut auf eine PCI Busadresse zeigen kann wie auf eine VRAM Adresse. Ich muss also nicht zwangsläufig die Daten kopieren, um von der GPU auf diese zugreifen zu können. Das es bei Aufgaben, deren Geschwindigkeit maßgeblich von der verfügbaren Speicherbandbreite abhängt, trotzdem sinnvoll ist die Daten im Hintergrund in den VRAM zu schieben, während man die GPU mit etwas anderem beschäftigt, steht außer frage.eXile hat geschrieben: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.
Re: Zero-Copy u. DxCompute
Erst mal danke für all die interessanten Antworten. Mir geht es eigentlich erst in zweiter Linie um Performanz. Wichtig ist mir vielmehr das die GPU direkt Bedarf an bestimmten Ressourcen anmelden und ich so auf nahezu beliebig große Datenmengen zugreifen kann ohne irgendwelchen schweinkram wie multipass machen muss. Die Gigavoxel Engine und ich denke auch die neue Unreal Engine haben ja eine GPU Datenloader so was möchte ich auch haben und brauche für einen sinnvolle Architektur eben diesen Zugriff.
- Krishty
- Establishment
- Beiträge: 8343
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Zero-Copy u. DxCompute
Ebenfalls danke für die Antworten … dann setze ich mich mal in meine Zeitmaschine. Ach nein – bis 2014 bin ich eh durch genug anderes Zeug ausgelastet :(
Re: Zero-Copy u. DxCompute
GigaVoxels sind, wie der Name schon vermuten lässt, eine Adaption von MegaTextures für dreidimensionale Texturen. Crassin hat dazu einen sehr interessanten Tech Report und eine noch viel interessantere Dissertation verfasst:MadMax hat geschrieben:Die Gigavoxel Engine und ich denke auch die neue Unreal Engine haben ja eine GPU Datenloader so was möchte ich auch haben und brauche für einen sinnvolle Architektur eben diesen Zugriff.
@techreport{Crassin08,
author = {Cyril Crassin and Fabrice Neyret and Sylvain Lefebvre},
title = {{Interactive GigaVoxels}},
number = {RR-6567},
institution = {INRIA},
year = {2008}
}
@phdthesis{Crassin11,
author = {Cyril Crassin},
title = {{GigaVoxels: A Voxel-Based Rendering Pipeline For Efficient Exploration Of Large And Detailed Scenes}},
school = {University of Grenoble},
year = {2011}
}
Was dort passiert, ist nichts anderes als Virtual Texturing mit 3D-Texturen. Die Texturdaten stehen der GPU also nicht vollumfänglich zur Verfügung, sondern werden über einen Sichtbarkeitstest in einem ersten Pass zusammengesammelt und asynchron gestreamt. Dazu kommt eine Indirection Texture, die praktisch als Page Table fungiert, und dann erstellst du einen Cache im VRAM, wo du die benötigten Texturchunks reinladen kannst. Genau das gleiche, was die von Krishty angesprochene AMD-Erweiterung AMD_sparse_texture bieten soll, nur bei GigaVoxels eben noch als Softwareimplementierung. Da ist noch gar keine CUDA Magic involviert.