double in shader und texture
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
double in shader und texture
Hallo,
ich wollte mal fragen, ob es irgendwie möglich ist in Shadern und Texturen den Datentype double zu verwenden ? Ich bräuchte es für ein zukünftiges Projekt. Möglichst für DirectX 11 oder 12. CUDA wäre aber auch im Rahmen des Möglichen...
ich wollte mal fragen, ob es irgendwie möglich ist in Shadern und Texturen den Datentype double zu verwenden ? Ich bräuchte es für ein zukünftiges Projekt. Möglichst für DirectX 11 oder 12. CUDA wäre aber auch im Rahmen des Möglichen...
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: double in shader und texture
In HLSL (Shader Model 5) kannst du double als Datentyp nutzen. Geh sicher, bei Konstanten das Suffix L einzusetzen. Division ist leider ein optionales Feature.
Doubles in Texturen kenne ich nicht. In D3D 11 musst du wahrscheinlich zwei uint32-Texturen lesen, um daraus 64-Bit-Werte zusammenzubauen. D3D 12 kA.
Auch das Schreiben von double in Render Targets ist nicht möglich. Notfalls die Bits extrahieren und in zwei uint32-Render-Targets schreiben. Blending ist dann natürlich unmöglich.
Letztlich musst du noch prüfen, ob deine GPU double unterstützt, da es eine optionale Erweiterung ist. D3D 11 hat eine Funktion dafür: https://learn.microsoft.com/en-us/windo ... r-programs
Doubles in Texturen kenne ich nicht. In D3D 11 musst du wahrscheinlich zwei uint32-Texturen lesen, um daraus 64-Bit-Werte zusammenzubauen. D3D 12 kA.
Auch das Schreiben von double in Render Targets ist nicht möglich. Notfalls die Bits extrahieren und in zwei uint32-Render-Targets schreiben. Blending ist dann natürlich unmöglich.
Letztlich musst du noch prüfen, ob deine GPU double unterstützt, da es eine optionale Erweiterung ist. D3D 11 hat eine Funktion dafür: https://learn.microsoft.com/en-us/windo ... r-programs
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: double in shader und texture
Wie immer eine kompetente Antwort. Danke das hilft mir schon weiter. Ich werde wohl per Bit-Artithemtic mir die Datentypen zusammen basteln müssen. Da die Grafikkarten heutzutage übe eine Menge an Shadern-Einheiten verfügen, wäre der Performance-Gewinn schon auf meiner Seite.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
-
- Establishment
- Beiträge: 488
- Registriert: 01.03.2009, 19:09
Re: double in shader und texture
In Vulkan/GLSL hab ich das so geloest:
VK_FORMAT_R32G32_UINT als Textureformat und dann im shader
(un)packDouble2x32
Funktioniert im ComputeShader einwandfrei.
Bin mir sicher fuer DX12/HLSL gibt es da entsprechende Formate/Methoden. Manuelle Bitarithmetik sollte also nicht notwendig sein.
VK_FORMAT_R32G32_UINT als Textureformat und dann im shader
(un)packDouble2x32
Funktioniert im ComputeShader einwandfrei.
Bin mir sicher fuer DX12/HLSL gibt es da entsprechende Formate/Methoden. Manuelle Bitarithmetik sollte also nicht notwendig sein.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: double in shader und texture
Du hast Recht. Es gibt die asuint-Funktion und sicherlich auch eine entsprechende Gegenfunktion. Danke für den Hinweis, damit erspare ich mir die Bitarithmetik wie Du schon schreibst. Das wird aber erst nächstes Jahr wichtig.
https://learn.microsoft.com/de-de/windo ... lsl/asuint
Danke für den Hinweis.
https://learn.microsoft.com/de-de/windo ... lsl/asuint
Danke für den Hinweis.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: double in shader und texture
Können? Unter Umständen ja. Aber das willst du nicht. Außer du programmierst für eine Datacenter oder Workstation GPU. Bei Consumer GPUs werden in der Regel wenn überhaupt dann nur der Vollständigkeit halber ein paar einsame FP64 ALUs so drübergestreut. Eine RTX 4090 macht dir beispielsweise pro Clockcycle entweder 65536 float multiply-adds oder 1024 double multiply-adds… 73 TFLOPS für float vs 1 TFLOP für double… (siehe auch https://docs.nvidia.com/cuda/cuda-c-pro ... structions)
In CUDA C++ willst du z.B. bei floating-point Literalen sehr aufpassen, dass du nicht das f vergisst und den Compiler dadurch versehentlich zwingst, alle Zwischenergebnisse in double zu berechnen. Ich hatte schon Beispiele wo man aus einer 42.0 eine 42.0f macht und dann läuft auf einmal alles um ca. Faktor 100 schneller (kein Scherz)…
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: double in shader und texture
Ich will nicht, aber ich brauche für den Algorithmus diese Genauigkeit. Ist natürlich sehr schade das die Leistung dann derart in die Kniee geht.
Edit: Naja, ich kann ja auch erst mal mit float probieren. Viellicht reicht es ja doch. Aber klassischer Weise wird der Algo mit double berechnet.
Edit: Naja, ich kann ja auch erst mal mit float probieren. Viellicht reicht es ja doch. Aber klassischer Weise wird der Algo mit double berechnet.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
- TomasRiker
- Beiträge: 96
- Registriert: 18.07.2011, 11:45
- Echter Name: David Scherfgen
- Wohnort: Hildesheim
Re: double in shader und texture
Magst du vielleicht verraten, was für ein Algorithmus das ist?
PS: Es gibt etwas namens "Double Double arithmetic" - ein "Trick", um die Genauigkeit von Floating Point-Berechnungen zu verdoppeln. Das Prinzip müsste eigentlich auch mit 2x float32 funktionieren.
PS: Es gibt etwas namens "Double Double arithmetic" - ein "Trick", um die Genauigkeit von Floating Point-Berechnungen zu verdoppeln. Das Prinzip müsste eigentlich auch mit 2x float32 funktionieren.
-
- Moderator
- Beiträge: 2138
- Registriert: 25.02.2009, 13:37
Re: double in shader und texture
Ich habe in den Anfangszeiten von CUDA mal gute Erfahrung mit https://en.wikipedia.org/wiki/Kahan_summation_algorithm gemacht, falls es um Addition geht.
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: double in shader und texture
Beachte, dass die FP64 performance da in etwa gleichauf mit einer modernen CPU ist. Die GPU zu verwenden ist in der Regel mit etwas Overhead verbunden und macht den Code um einiges komplexer, ist also in der Regel erst sinnvoll, wenn ein ausreichend hoher Speedup zu erwarten ist. Sofern du also nicht mit Workstation oder Datacenter GPUs arbeitest und FP64 wirklich benötigst, bist du vermutlich besser beraten, das Ganze einfach auf der CPU zu machen…
-
- Establishment
- Beiträge: 308
- Registriert: 25.08.2019, 05:00
- Alter Benutzername: gdsWizard
- Kontaktdaten:
Re: double in shader und texture
Vielleicht hast Du Recht. Normalerweise wird das was ich da machen will auf besonderen GPU's gemacht. Mein Bruder ist in der Bildberechnung von CT's und dort haben Sie andere Grafikkarten als sie normalerweise im PC sind. Ich schreibe sowieso erst eine CPU Version. Ich weis auch gar nicht ob die Idee zielführend ist. Mein Bruder verrät nicht wie das funktioniert.dot hat geschrieben: ↑04.07.2023, 12:09
Beachte, dass die FP64 performance da in etwa gleichauf mit einer modernen CPU ist. Die GPU zu verwenden ist in der Regel mit etwas Overhead verbunden und macht den Code um einiges komplexer, ist also in der Regel erst sinnvoll wenn ein ausreichend hoher Speedup zu erwarten ist. Sofern du also nicht mit Workstation oder Datacenter GPUs arbeitest, bist du vermutlich besser beraten, das Ganze einfach auf der CPU zu machen…
@Alexander Kornrumpf:
Leider habe ich alle möglichen Berechnungen drin. Summation reicht leider nicht. Aber trotzdem Danke. Man weis ja nie ob man das mal braucht.
@TomasRiker:
Es ist ein Gradientenabstiegsverfahren mit dem ich tausende und deutlich mehr an Daten habe. Deshalb brauche ich diese Genauigkeit.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com