Семантика барьера () в вычислительном шейдере opengl

Допустим, у меня есть вычислительный шейдер opengl, написанный на GLSL, работающий на NVidia Geforce 970.

В начале шейдера при однократном вызове выполняется запись в «буферный объект хранилища шейдеров» (SSBO).

Затем я создаю подходящий барьер, например memoryBarrier () в моем GLSL.

Затем я читаю из памяти, записанной на первом шаге, при каждом вызове.

Будет ли эта первая запись видна для всех вызовов в текущей вычислительной операции?

На странице https://www.khronos.org/opengl/wiki/Memory_Model#Ensuring_visibility, Хронос говорит:

«Используйте согласованный и соответствующий вызов memoryBarrier * или groupMemoryBarrier, если вы используете такой механизм, как барьер, для синхронизации между вызовами».

Я почти уверен, что таким образом можно синхронизироваться в рабочей группе. Но работает ли это для всех вызовов в каждой рабочей группе во всей вычислительной операции?

Я не уверен, как планируется весь набор рабочих групп. Я ожидал, что они, возможно, будут работать последовательно, что сделает синхронизацию, о которой я спрашиваю, невозможной?


person avl_sweden    schedule 23.11.2017    source источник


Ответы (1)


Но работает ли это для всех вызовов в каждой рабочей группе во всей вычислительной операции?

Нет. область barrier явно находится в пределах рабочей группы. И вы не можете видеть операции, которые, как вы еще не уверены, произошли. Порядок выполнения рабочих групп по отношению друг к другу не определен, поэтому вы не знаете, выполнилась ли еще одна рабочая группа.

То, что вы хотите, на самом деле невозможно. Вместо этого вам нужно изменить способ работы шейдеров, чтобы рабочие группы не зависели друг от друга. В этом случае вы можете попросить каждую рабочую группу выполнить это вычисление. И вместо того, чтобы сохранять его в глобальной памяти через SSBO, сохраните результат в переменной shared.

Да, вы будете вычислять одно и то же значение в каждой группе. Но это даст лучшую производительность, чем когда все эти рабочие группы будут ждать одну рабочую группу. Тем более, что на самом деле это не то, что вы можете сделать.

person Nicol Bolas    schedule 23.11.2017