Home > CUDA > Julia-Menge die 2.

Julia-Menge die 2.

Es ist etwas über 3 Jahre her als ich mir eine Nvidia Gforce GTX 280 zugelegt habe. Damals musste ich natürlich die Rechenpower testen und habe die Berechnung der Julia-Menge im hyperkomplexen Raum in CUDA implementiert. Die Feiertage habe ich nun genutzt um das alte Projekt wieder aufleben zu lassen und um zu schauen was sich so alles rund um CUDA getan hat.

Um das ganze auch noch interessant zu halten wollte ich das Interface und möglichst viel vom Programmablauf in C# entwickeln und über eine C-Dll die Cuda-Kernel anstoßen. Für die OpenGl Funktionen habe ich das Tao Framework benutzt.

Nachdem ich alles nach meinen Vorstellungen umgebaut habe, und einen ersten Testlauf starten konnte, musste ich feststellen, dass mein Cudakernel nach 2,85s die Arbeit einstellte und den Grafikkartentreiber neustarten ließ. Google erzählte mir etwas von einem Zeitlimit von 5s die der Kernel maximal laufen dürfte, da die Windows 7 Treiber sonst meldeten dass der Treiber nicht mehr reagiert, was den Neustart erklärte. Nach etwas mehr recherche lag der Timeout dann doch bei 2 Sekunden und ich schrieb meine Kernel so um, dass sie nur Teilbereiche berechneten und ich sie mehrmals aufrufen konnte und Sie somit einzeln schneller durch liefen.

Der nächste Testlauf lief dann sogar nur wurde nichts mehr angezeigt. Ich machte mich also ans Debuggen… oder besser gesagt ans blinde Debuggen … ohne Debugger. Zu meinem Leidwesen hatte Nvidia den CUDA Emulator nicht mehr im Programm und ich sollte mir Paralel Nsight anschauen um meinen Code direkt auf der GPU zu debuggen. Da der Debugger aber für Breakpoints die gesamte GPU anhalten musste braucht man eine 2. für die Grafikausgabe von Windows. Welche ich nicht habe. Nichtmal ein Slot auf dem Board exestiert dafür.

Nach etwas hin und her habe ich das Ganze dann irgendwann zum laufen bekommen. Die Funktionsweise ist recht simpel:

Zuerst wird in einem kantenlänge³ großen Block Voxel für Voxel die Julia Formel angewendet und das Ergebnis als Bit in einem Array gespeichert

Im 2. Schritt entscheide ich für jeden Voxel ob er teil der Oberfläche ist indem ich schaue ob der Voxel teil des Fraktals ist und ein Nachbarvoxel nicht. Die Summe der Oberflächenvoxel benötige ich um genügend Speicher für den letzten Schritt zu reservieren.

Zuletzt gehe ich dann nochmal jeden Oberflächenvoxel durch und berechne die Normale für die Lichtberechnung und erstelle die Koordinaten für ein 4-Eck und lege alles in einem Buffer ab den ich mit wenigen Befehlen durch OpenGl rendern kann.

Hier der Quellcode: http://www.3dallee.de/Qualian.zip

  1. Bisher keine Kommentare
  1. Bisher keine Trackbacks