CUDA: Volumen - Filter

fireblade1282

Mitglied
Wer von euch kennt sich mit CUDA aus und hat mal ein paar prinzipielle Design - Tips für mein Problem?

Ich habe einen CT Datensatz von http://www.volvis.org/ geladen, und ein halbwegs vernünftiges Framework zum importieren, exportieren und slices als Bitmaps anschauen geschrieben (ist alles ima Rahmen verschiedener Untersuchungen in einer Diplomarbeit). Nun kam mir der Gedanke, dass verschiedene Bildglättungsalgorithmen, gerade in 3D Volumen, ja massiv parallelisierbar sein müssten.
Ich möchte verschiedene Bildglättungen (unter anderem Diffusionsfilter) implementieren und vergleichen. Damit ich aber einen guten Einstieg in die Thematik bekomme (CUDA kenne ich noch nicht so gut) wüsste ich gerne wie ihr einen einfachen "Box Filter" ordentlich parallel arbeiten lassen würdet.

Also das Setup:
1. Auf dem Device fliegt ein float Datensatz der größe "nx, ny, nz" herum
2. Ein neuer Datensatz wird berechnet, indem immer die 3x3 Nachbarschaft zusammenaddiert und / 27 geteilt wird...

Meine Fragen als CUDA Neuling wären hier: Wie designe ich das Ganze am besten? Die Datensätze sind ja nun nicht gerade klein, so um die 512 MB das Stück.
Sollte ein Kernel sich um einen einzelnen neuen Punkt kümmern oder sollte er eine ganze Reihe / Zeile / Slice bearbeiten? Kommt es zu unnötigen Speicherverzögerungen? Wo soll ich die Daten lagern? Im Constant/Global Mem?

Angenommen ein Kernel bearbeitet einen Pixel, dann ruft er aus dem Constant/Global Mem die Daten. Wäre es sinnvoll erst ein "benachbartes Sub-Volumenelement" in den Sharedmem zu laden, so dass sich mehrere Kernel daraus bedienen können?

Ich würde mich freuen, wenn hier ein paar nette Anregungen, Erfahrungen oder Tips zu dem Thema kommen würden!
 
Zurück