Menyinkronkan permohonan OpenGL Compute Shader secara berurutan


12

Saya punya beberapa penghitung komputasi yang perlu dieksekusi dalam urutan tertentu dan yang outputnya bergantung pada input sebelumnya. Idealnya, saya tidak perlu menyalin buffer sisi klien dan melakukan semua pekerjaan saya pada GPU.

Anggap saya memiliki dua compute shader yang dikompilasi dan dihubungkan sebagai program_onedan program_two. Misalkan saya juga memiliki GL_SHADER_STORAGE_BUFFERyang berisi data yang ditulis oleh program_onedan dibaca oleh program_two. Bisakah saya melakukan hal berikut:

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);

Apakah dijamin bahwa semua doa shader komputasi pertama akan selesai sebelum doa kedua (untuk menghindari perlombaan data antara membaca dan menulis buffer)? Jika tidak, bagaimana cara menyinkronkannya?

Jawaban:


12

Tidak itu tidak dijamin, karena spesifikasi OpenGL memungkinkan dua Compute Shader berjalan secara bersamaan atau bahkan dalam urutan yang berbeda.

Anda perlu menelepon glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)sebelum yang kedua glDispatchComputeuntuk memastikan visibilitas penulisan dari program_one.


Dari artikel wiki OpenGL.org pada model memori :

[...] doa di antara tahapan dapat dilakukan dalam urutan apa pun. Ini termasuk doa yang diluncurkan oleh perintah render yang berbeda. Walaupun mungkin tidak mungkin dua vertex shader dari operasi rendering yang berbeda dapat berjalan pada saat yang sama, itu juga mungkin, sehingga OpenGL tidak memberikan jaminan .

Dari artikel wiki Opengl.org tentang Shader Storage Buffer :

SSBO membaca dan menulis menggunakan akses memori yang tidak koheren, sehingga mereka membutuhkan penghalang yang tepat, sama seperti operasi Image Load Store.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.