Ich habe folgendes Problem: Ich muss die inklusiven Scans (z.B. Präfixsummen) von Werten basierend auf einer Baumstruktur auf der GPU berechnen. Diese Scans können entweder vom Wurzelknoten (top-down) oder von den Blattknoten (bottom-up) ausgehen. Der Fall einer einfachen Kette ist einfach zu handhaben, aber die Baumstruktur macht die Parallelisierung recht schwierig, effizient zu implementieren.
Nach einem top-down inklusiven Scan würde beispielsweise (12)
(0)[op](6)[op](7)[op](8)[op](11)[op](12)
enthalten, und für einen bottom-up inklusiven Scan würde (8)
(8)[op](9)[op](10)[op](11)[op](12)
enthalten, wobei [op]
ein bestimmter binärer Operator (Matrixaddition, Multiplikation usw.) ist.
Man muss auch die folgenden Punkte berücksichtigen:
- Für ein typisches Szenario sollte die Länge der verschiedenen Äste nicht zu lang sein (~10), mit etwa 5 bis 10 Ästen, sodass dies innerhalb eines Blocks ausgeführt wird und die Arbeit zwischen den Threads aufgeteilt wird. Unterschiedliche Blöcke werden einfach unterschiedliche Werte von Knoten verarbeiten. Dies ist offensichtlich nicht optimal in Bezug auf die Auslastung, aber dies ist eine Einschränkung des Problems, die zu einem späteren Zeitpunkt angegangen wird. Im Moment werde ich mich auf Instruktionslevel-Parallelismus verlassen.
- Die Struktur des Graphen kann nicht geändert werden (sie beschreibt ein tatsächliches System) und kann daher nicht ausgeglichen werden (oder nur durch Änderung der Wurzel des Baumes, z.B. Verwendung von
(6)
als neue Wurzel). Dennoch sollte ein typischer Baum nicht zu unausgeglichen sein. - Ich verwende derzeit CUDA für GPGPU, daher bin ich offen für jede CUDA-fähige Template-Bibliothek, die dieses Problem lösen kann.
- Knotendaten befinden sich bereits im globalen Speicher und das Ergebnis wird von anderen CUDA-Kernels verwendet, daher ist das Ziel nur, dies zu erreichen, ohne dass es zu einem großen Engpass wird.
- Es gibt keinen "Zyklus", d.h. Äste können nicht im Baum fusionieren.
- Die Struktur des Baumes ist festgelegt und in einer Initialisierungsphase festgelegt.
- Eine einzige binäre Operation kann ziemlich teuer sein (z.B. Multiplikation von Polynommatrizen, d.h. jedes Element ist ein Polynom eines bestimmten Grades).
In diesem Fall, welche wäre die "beste" Datenstruktur (für die Baumstruktur) und die besten Algorithmen (für die inklusiven Scans/Präfixsummen), um dieses Problem zu lösen?