Art arda gelen OpenGL Compute Shader çağrılarını senkronize etme


12

Belirli bir sırayla yürütülmesi gereken ve çıktıları önceki girdilere bağlı olan birkaç hesaplama gölgelendiricim var. İdeal olarak, hiçbir zaman istemci tarafındaki bir tamponu kopyalamam ve GPU üzerinde tüm işlerimi yapmam gerekmeyecek.

İki hesaplama shader'lar derlenmiş ve olarak bağlantılı olması düşünün program_oneve program_two. Ayrıca, GL_SHADER_STORAGE_BUFFERtarafından yazılan program_oneve okunan verileri içeren bir tane olduğunu varsayalım program_two. Sadece aşağıdakileri yapabilir miyim:

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

İlk hesaplama gölgelendiricisinin tüm çağrılarının, ikinci çağrının çağrılmasından önce tamamlanması garanti edilir mi (okuma ve yazma arasındaki veri yarışlarından kaçınmak için buffer)? Değilse, bunları nasıl senkronize edebilirim?

Yanıtlar:


12

Hayır, garanti edilmez, çünkü OpenGL belirtimi iki Compute Shader'ın aynı anda ve hatta farklı sırada çalışmasına izin verir.

Yazarların görünürlüğünü sağlamak glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)için ikinci saniyeden önce aramalısınız .glDispatchComputeprogram_one


Bellek modelindeki OpenGL.org wiki makalesinden :

[...] aşamalar arasındaki çağrılar herhangi bir sırayla gerçekleştirilebilir. Bu, farklı oluşturma komutları tarafından başlatılan çağrıları içerir. Farklı oluşturma işlemlerinden iki köşe gölgelendiricinin aynı anda çalışması olası olmasa da, bu da mümkündür, bu nedenle OpenGL hiçbir garanti vermez .

Shader Depolama Tamponu hakkındaki Opengl.org wiki makalesinden :

SSBO'lar tutarsız bellek erişimlerini okur ve yazar, bu nedenle Image Load Store işlemleri gibi uygun engellere ihtiyaç duyarlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.