Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

17.11.2015, 10:39

Wie hast du die FFT in CUDA implementiert? Brauchst du double wirklich? double ist ein unglaublicher Performancekiller auf der GPU...

12

17.11.2015, 12:10

Allerdings. Falls überhaupt vorhanden, hat double precision auf consumer-Karten einen Bruchteil der Performance von single (Maxwell: 1/32). Ist für Tessendorf o.ä. auch nicht nötig. Mehr Kopfzerbrechen macht mir aber die CPU-GPU-Kopiererei. Die ist auch unnötig. Du hast ein Start-Spektrum, das man einmal auf die GPU lädt. Die Animation (Zeitabhängigkeit), die iFFT und das displacement des Höhenfeldes können alles auf der GPU geschehen. Ich kenne mich mit CUDA nicht aus, aber ein Interop sollte möglich sein (Puffer/Texturen können von CUDA und DirectX benutzt werden), zumindest habe ich das mit OpenCL auch schon hingekriegt.

Edit: Es ist tatsächlich schwierig brauchbare HLSL-FFTs zu finden. Am ehesten sei das Beispiel im alten June 2010 SDK erwähnt (unter Samples\C++\Direct3D10\GPUSpectrogram\GPUSpectrogram.fx)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »unbird« (17.11.2015, 12:15)


13

17.11.2015, 13:01

Als Cuda FFT habe ich die bereits implementierte cufft benutzt.
Die Auswirkung zwischen single und double hab ich noch nicht getestet, eine Optimierung dahingehend ist aber natürlich noch geplant.
Ich hätte auch nicht gedacht, dass der Geschwindigkeitsverlust bei einer GPU soviel größer ist, als bei der CPU, dann ließe sich da ja noch einiges rausholen.
Was das weitere Berechnen auf der Grafikkarte angeht, muss ich mich wohl mal weiter einlesen, der Ansatz ist auf jeden Fall sehr interessant.
Ich danke euch auf jeden Fall schon mal für die Hilfe. :)

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

14

17.11.2015, 13:57

Die FT im Allgemeinen ist ja nur ne Summe Sinüsse. Wenn die Frequenzbereich-Daten ein bissl sparse oder rotationsinvariant sind, könntest Du die paar hundert resultierenden Sinüsse einfach pro Vertex im VertexShader machen und Dir den kompletten FFT-Rassel ersparen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

15

23.11.2015, 09:11

Hallo, ich wollte euch nur mal den aktuellen Stand durchgeben:

Wenn ich die FFT in Single Präzision in Cuda berechne, komme ich auf eine Geschwindigkeit, die knapp über der CPU Implementierung liegt,
berechne ich alles auf der Grafikkarte (ok, momentan ist noch ein Kopiervorgang von GPU auf CPU enthalten) komme ich auf diese Werte für die komplette Höhenfeldberechnung:

Size: 512x512, gemittelt aus 100 Durchläufen
CPU: 13,12 fps
GPU: 116,41 fps

Size: 1024x1024
CPU: 2,88 fps
GPU: 30,39 fps

Man sieht, es lohnt sich doch sehr. :)
Nun muss ich nur mal schauen, ob ich aus dem x3d-Shader direkt auf den Grafikkartenspeicher zugreifen kann, um mir den letzten Kopiervorgang auch noch zu sparen.
Ich danke euch erstmal sehr für die Hilfe!

Gruß!

Werbeanzeige