Ich untersuche Isoflächenalgorithmen auf der GPU für ein Bachelor-Projekt (wobei ich mich speziell auf binäre In / Out-Voxeldaten anstatt auf reelle Felder konzentriere). Ich habe also eine CPU-Implementierung von guten alten Marschwürfeln, die in OpenFrameworks ausgeführt werden, und bin gerade dabei, sie auf GLSL-Compute-Shader zu portieren und die Fallstricke zu berücksichtigen, bevor ich eintauche. Ich habe nur Vert- und Frag-Shader geschrieben vorher ist alles neu für mich.
Mein erstes Problem ist, wie eine Nachschlagetabelle über Dutzende oder Hunderte von Threads in einer Arbeitsgruppe hinweg effizient verwendet werden kann. Ich verstehe, dass eine GPU verschiedene Arten von Speicher für verschiedene Aufgaben hat, aber nicht ganz sicher ist, wie jede funktioniert oder welcher Typ verwendet werden soll.
Die klassische Copypasta-Tabelle von Paul Bourke ist ein 256 * 16-Array. Wenn Sie also einen skalaren Bytetyp verwenden, kann dieser vermutlich in eine 4-KB-Textur oder SSBO gepackt werden.
Die Frage ist, wie man verhindert, dass sich die verschiedenen Fäden gegenseitig auslösen. Viele Cubes in jeder Arbeitsgruppe können möglicherweise dieselbe Konfiguration haben und versuchen daher, gleichzeitig auf denselben Speicherort im Puffer zuzugreifen. Gibt es eine Problemumgehung oder Optimierung, um damit umzugehen?