Ich versuche, eine globale verknüpfte Liste für Vorwärts + Shading zu machen, aber es gibt einigeOpenGL Compute Shader Synchronisation zwischen den Gruppen
Schwierigkeiten bei der Umsetzung.
Für jede Gruppe im Compute-Shader gibt es eine gemeinsame Variable: ein lokales Index-Array, und dieses Array hat eine variable Länge (die Kapazität ist konstant, der Inhalt jedoch nicht). Hier ist das Beispiel:
Shared Int-Array [1024]; // die Deklaration in GLSL
gemeinsame int-Länge; // Es ist auch eine gemeinsame Variable in der Arbeitsgruppe.
Gruppe 0: Länge = 4, array = 3, 5, 7, 1, -1, -1, -1, -1 .... (-1 = nicht gültig)
Gruppe 1: length = 2, array = 1, 6, -1, -1, -1 ....
Gruppe 2: Länge = 1, Array = 8, -1, -1, -1, -1 .. ..
Jetzt möchte ich diese Indizes zu einem globalen Index-Array zusammenführen. ein Shader-Speicherpufferobjekt. Die Reihenfolge basiert auf Gruppenindex:
globaler Index-Array: 3, 5, 7, 1, 1, 6, 8, -1, -1, -1 ......
Die Schwierigkeit Ich weiß nicht, wie ich zwischen verschiedenen Gruppen synchronisieren soll. Seit barrier() in OpenGL garantiert nur die Synchronisation in der gleichen Gruppe.
Und ich fand die in einem anderen Beitrag, dass OpenGL nicht die Synchronisation zwischen verschiedenen Gruppen unterstützt.
OpenGL Compute shader sync different work groups
Also, meine Frage ist. Gibt es überhaupt etwas, um mein Ziel zu erreichen?
Zum Beispiel, kann ich ein Shader Storage Buffer Object deklarieren, wie zum Beispiel die letzte Gruppen-ID, die die Aktualisierung beendet hat, und den Offset des globalen Indexarrays?
Beispiel:
unit latestGroupIDUpdated = -1; // a SSBO
unit globalIdxOffset = 0; // a SSBO
in each group:
while(myGroupId - 1 != latestGroupIDUpdated)
{ //keep waiting }
// my previous group has updated the global list
globalIdxOffset+= myArrayLength;
latestGroupIDUpdated = myGroupId;
//now start appending the local index array into global index array
Wird dieser Versuch funktioniert? Oder wird es scheitern und warum?
Wenn es scheitern wird, welche Art von Ansatz wird empfohlen?
Wenn Sie "Gruppe" sagen, meinen Sie "Arbeitsgruppe", oder? Wenn dies der Fall ist, können Arbeitsgruppen keine unterschiedlichen "Längen" haben. Wenn Sie "Länge" angeben, beziehen Sie sich auf die Anzahl der Aufrufe pro Gruppe. –
ja, Gruppe bedeutet Arbeitsgruppe –
Und die verschiedenen Längen? –