Атомные счетчики атомные. Но каждая атомарная операция является атомарной только для этой операции.
Итак, если вы хотите убедиться, что каждый шейдер получает уникальное значение из счетчика, то каждый шейдер должен получить доступ к этому счетчику только с помощью atomicCounterIncrement
(или Decrement
, но все они должны использовать то же самое).
Правильный способ сделать то, что вы предлагаете:
- проверить значение:
- если х:
atomicCounterIncrement(AC1)
, сохраняя возвращенное значение.
- Используйте сохраненное значение в качестве текселя для установки чего-либо в uimage1D_A.
- еще:
atomicCounterIncrement(AC2)
, сохраняя возвращенное значение.
- Используйте сохраненное значение для вычисления texel (imgwidth - val - 1), для которого нужно установить что-то в uimage1D_B.
Ваша стратегия "извлечения и последующего приращения" - это состояние гонки, ожидающее наступления. Неважно, если он «полностью распараллелен», потому что он сломан . Вам нужно, чтобы он работал, прежде чем задуматься, будет ли он быстрым.
Я бы настоятельно рекомендовал ознакомиться с атомарностью и многопоточностью на CPU , прежде чем пытаться заняться GPU. Это распространенная ошибка новичков при работе с атомами. Вы должны быть экспертом по многопоточности (или, по крайней мере, промежуточного уровня), если хотите успешно использовать атомарность GLSL и загрузку / хранение изображений.