Синхронізація послідовних викликів OpenGL Compute Shader


12

У мене є пара обчислювальних шейдерів, які потрібно виконати в певному порядку і виходи яких залежать від попередніх входів. В ідеалі мені ніколи не потрібно буде копіювати буферну сторону клієнта і виконувати всю свою роботу на GPU.

Поміркуйте, у мене складено два обчислювальні шейдери і пов'язані як program_oneі program_two. Припустимо, у мене також є GL_SHADER_STORAGE_BUFFERте, що містить дані, які записує program_oneі читає program_two. Чи можу я просто зробити наступне:

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

Чи гарантується, що всі виклики першого обчислювального шейдера завершаться перед будь-якими викликами другого (щоб уникнути перегонів даних між читанням і записом buffer)? Якщо ні, то як я їх синхронізую?

Відповіді:


12

Ні, це не гарантується, оскільки специфікація OpenGL дозволяє, щоб два обчислювальних шейдери працювали одночасно або навіть у різному порядку.

Вам потрібно зателефонувати glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)до другого, glDispatchComputeщоб забезпечити видимість записів від program_one.


З статті вікі OpenGL.org про модель пам'яті :

[...] виклики між етапами можуть виконуватися в будь-якому порядку. Це включає виклики, запущені різними командами візуалізації. Хоча це ймовірно, що два вершинні шейдери від різних операцій візуалізації можуть працювати одночасно, але OpenGL не дає жодних гарантій .

З статті Вікі на Opengl.org про буфер зберігання шейдерів :

SSBOs читає і записує некоректний доступ до пам'яті, тому їм потрібні відповідні бар'єри, як і операції з завантаженням зображень.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.