Sincronizzazione delle successive invocazioni di OpenGL Compute Shader


12

Ho un paio di shader di calcolo che devono essere eseguiti in un certo ordine e le cui uscite dipendono dagli ingressi precedenti. Idealmente, non dovrò mai copiare un buffer lato client e fare tutto il mio lavoro sulla GPU.

Considera che ho due shader di calcolo compilati e collegati come program_onee program_two. Supponiamo di avere anche un file GL_SHADER_STORAGE_BUFFERcontenente i dati scritti program_onee letti da program_two. Posso semplicemente fare quanto segue:

glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

È garantito che tutte le invocazioni del primo shader di calcolo finiranno prima di qualsiasi invocazione del secondo (per evitare corse di dati tra lettura e scrittura buffer)? In caso contrario, come posso sincronizzarli?

Risposte:


12

No, non è garantito, poiché la specifica OpenGL consente a due Compute Shader di funzionare contemporaneamente o anche in un ordine diverso.

È necessario chiamare glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)prima del secondo glDispatchComputeper garantire la visibilità delle scritture da program_one.


Dall'articolo wiki OpenGL.org sul modello di memoria :

[...] le invocazioni tra le fasi possono essere eseguite in qualsiasi ordine. Questo include invocazioni lanciate da diversi comandi di rendering. Mentre è forse improbabile che due shader di vertici di diverse operazioni di rendering possano essere eseguiti contemporaneamente, è anche possibile, quindi OpenGL non offre garanzie .

Dall'articolo della wiki di Opengl.org su Shader Storage Buffer :

Le letture e le scritture SSBO utilizzano accessi di memoria incoerenti, quindi hanno bisogno delle barriere appropriate, proprio come le operazioni di Image Load Store.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.