2015-03-17 5 views
8

При использовании GLSL на современных графических процессорах (GL3.3 +), какова вероятная стоимость разветвления на униформе?Стоимость ветвления на униформах на современных графических процессорах

В моем двигателе я добираюсь до такой степени, что у меня много шейдеров. И у меня есть несколько различных пресетов качества для многих из них. Как бы то ни было, я использую форму с if() в шейдерах, чтобы выбрать разные пресеты. Тем не менее, я беспокоюсь, что я мог бы добиться большей производительности, перекомпилировав шейдеры и используя #ifdef. Проблема заключается в необходимости беспокоиться о отслеживании и перезагрузке других униформ при перекомпиляции шейдера.

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

+0

Драйвер может перекомпилировать шейдер с помощью встроенных униформ, если он видит, что стоимость разветвления в противном случае будет слишком велика. –

+0

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

+0

Итак, на практике, на современном графическом процессоре вряд ли будет меньше, чем перекомпиляция с помощью констант, либо потому, что ветви немного отличаются от тех, что находятся на процессоре, либо потому, что компилятор просто перекомпилирует шейдер автоматически. Правильно ли я понимаю? – Jagoly

ответ

5

Я признаю, что я не эксперт, но, возможно, мои предположения лучше, чем ничего.

Я бы подумал, что разветвление на униформе действительно довольно дешево. Это явно сильно отличается от ветвления по текстуре или данным атрибута, поскольку все ALU в SIMD будут следовать одному и тому же пути кода из шейдера, поэтому это «реальная» ветвь, а не маска выполнения. Я не слишком уверен в том, что процессоры шейдеров имеют пузырьки ветвей в их конвейере, но конвейер, безусловно, должен быть более мелким, чем в CPU общего назначения (особенно учитывая гораздо более низкие тактовые частоты, в которых они обычно работают).

Хотел бы я быть более полезным, и я также был бы признателен, если бы кто-то еще мог ответить более авторитетно. Однако, во-первых, я бы не стал слишком беспокоиться о ветвлении на униформе. Но, как всегда, если у вас есть такая возможность, сделайте профиль своего шейдера и посмотрите, не вызывает ли какой-либо заметной разницы.

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