2016-08-25 2 views
2

Если у вас есть вычислительный шейдер, где разные рабочие группы в одной и той же диспетчеризации помещаются в непрерывный цикл, и вы хотите сообщить им все, чтобы выйти из указанного цикла любым из них, установив флаг. Возможно ли это?OpenGL Compute shader sync различные рабочие группы

Я попытался использовать флаг в SSBO, обозначенный как согласованный, так и неустойчивый, чтобы вызвать их выход. Который иногда не работает на AMD, кажется. Когда одна из рабочих групп хочет вызвать все из них для выхода, я просто устанавливаю флаг от нуля до одного напрямую (поскольку это не имеет значения, если кто-то его устанавливает) без использования атомистики и вызова памятиBarrier() впоследствии ,

Из документации памятиBarrier() мне кажется, что это будет гарантией возможной видимости набора для других рабочих групп в рамках одной и той же отправки?

ответ

2

Из документации памятиBarrier() мне кажется, что это будет гарантировать видимость набора для других рабочих групп в рамках одной и той же отправки?

Видимость, да. Но как насчет исполнения из них?

У вас есть гарантии, что рабочая группа, которая инициирует это выключение, будет выполняться вместе с рабочими группами цикла? №

Гарантий поручительства на всех между приглашениями из разных рабочих групп. Поэтому вполне возможно, что графический процессор заполнит все свое время выполнения рабочими группами циклов. Это означает, что они будут ждать сигнала, который будет никогда не.

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

+1

Спасибо, отличный ответ! Я хочу, чтобы стандартная документация OpenGL включала это. Мне нужно было точно сказать это, чтобы быть уверенным в правильной ментальной модели для этого. – iam

+1

@iam: «* Я хочу, чтобы стандартная документация OpenGL включала это. *« It * does * include this. В стандарте OpenGL очень четко сказано: «рабочие группы выполняются полностью независимо и в неуказанном порядке». Все, что я сделал, это повторить это с большим количеством слов. –

+0

ok Я, очевидно, хотел бы, чтобы он использовал немного больше слов, как вы, чтобы я чувствовал себя более уверенно в понимании этого! :) И, если честно, может быть, это случай, когда его не совсем подтвердили/поняли другие примеры за пределами этого. – iam

Смежные вопросы