Настройка текстуры на графическом процессоре требует некоторого процессорного времени, но оно достаточно мало по сравнению с фактическим пакетная стоимость. Что еще более важно, это не должно влиять на фактическое выполнение шейдера, если шейдер никогда не ссылается на него.
Теперь есть три способа обработки ветвления:
Прежде всего, если условие ветвления всегда будет одним и тем же (если оно зависит только от констант времени компиляции), то одна сторона ветвления может быть полностью встроена. Во многих случаях может быть предпочтительнее скомпилировать несколько версий вашего шейдера, если таким образом можно исключить существенные ответвления.
Второй метод заключается в том, что шейдер может оценить обе стороны ветви, а затем выбрать правильный результат на основе условия, и все это без фактического ветвления (он делает это арифметически). Лучше всего, когда код в ветке небольшой.
И, наконец, он может использовать инструкции ветвления. Во-первых, инструкции ветвления имеют скромные затраты на подсчет команд. А еще есть трубопровод. У x86 длинный последовательный конвейер, который легко застопорить. GPU имеет совершенно другой параллельный конвейер.
GPU оценивает группы фрагментов (пикселей) параллельно, выполняя программу фрагмента один раз для нескольких фрагментов за раз. Если все фрагменты в группе занимают одну и ту же ветвь, то у вас есть только стоимость выполнения этой ветви. Если они принимают две (или более) ветки, то шейдер должен выполняться несколько раз для этой группы фрагментов, чтобы покрыть все ветки.
Поскольку группы фрагментов имеют расположение на экране, полезно, если ваши ветки имеют одинаковое расположение на экране. Смотрите эту схему:
(источник: nvidia .com)
Теперь компилятор шейдера, как правило, очень хорошо выбирает, какой из двух последних методов использовать (для первого метода компилятор будет встроен за вас, но вам придется самостоятельно создавать несколько версий шейдера). Но если вы оптимизируете производительность, может быть полезно увидеть фактический вывод компилятора. С этой целью используйте fxc.exe
в утилитах DirectX SDK с параметром /Fc <file>
, чтобы получить разборку скомпилированного шейдера.
(Поскольку это совет по производительности: не забывайте всегда измерять свою производительность, выяснять, в какие пределы вы попадаете, а затем беспокоиться об ее оптимизации. Нет смысла оптимизировать ветки шейдера, например, если вы привязаны к выборке текстур.)
Дополнительная ссылка: GPU Gems 2: Глава 34. Идиомы управления потоком графического процессора.
person
Andrew Russell
schedule
19.03.2011