Какую производительность условные и неиспользуемые сэмплеры/текстуры добавляют к пиксельным шейдерам SM2/3?

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

Я понятия не имею, насколько сильно повлияют на производительность эти две вещи, но особенно с учетом того, что мы поддерживаем SM2.0 на интегрированных графических чипах, неэффективность является проблемой. Итак, означает ли передача текстуры и ее неиспользование каких-либо дополнительных накладных расходов? И действительно ли использование if просто добавляет пару инструкций или может радикально повлиять на вещи из-за остановок и т. д., например, при оптимизации ЦП?


person Mr. Boy    schedule 17.03.2011    source источник


Ответы (1)


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

Теперь есть три способа обработки ветвления:

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

Второй метод заключается в том, что шейдер может оценить обе стороны ветви, а затем выбрать правильный результат на основе условия, и все это без фактического ветвления (он делает это арифметически). Лучше всего, когда код в ветке небольшой.

И, наконец, он может использовать инструкции ветвления. Во-первых, инструкции ветвления имеют скромные затраты на подсчет команд. А еще есть трубопровод. У x86 длинный последовательный конвейер, который легко застопорить. GPU имеет совершенно другой параллельный конвейер.

GPU оценивает группы фрагментов (пикселей) параллельно, выполняя программу фрагмента один раз для нескольких фрагментов за раз. Если все фрагменты в группе занимают одну и ту же ветвь, то у вас есть только стоимость выполнения этой ветви. Если они принимают две (или более) ветки, то шейдер должен выполняться несколько раз для этой группы фрагментов, чтобы покрыть все ветки.

Поскольку группы фрагментов имеют расположение на экране, полезно, если ваши ветки имеют одинаковое расположение на экране. Смотрите эту схему:


(источник: nvidia .com)

Теперь компилятор шейдера, как правило, очень хорошо выбирает, какой из двух последних методов использовать (для первого метода компилятор будет встроен за вас, но вам придется самостоятельно создавать несколько версий шейдера). Но если вы оптимизируете производительность, может быть полезно увидеть фактический вывод компилятора. С этой целью используйте fxc.exe в утилитах DirectX SDK с параметром /Fc <file>, чтобы получить разборку скомпилированного шейдера.

(Поскольку это совет по производительности: не забывайте всегда измерять свою производительность, выяснять, в какие пределы вы попадаете, а затем беспокоиться об ее оптимизации. Нет смысла оптимизировать ветки шейдера, например, если вы привязаны к выборке текстур.)

Дополнительная ссылка: GPU Gems 2: Глава 34. Идиомы управления потоком графического процессора.

person Andrew Russell    schedule 19.03.2011
comment
Поскольку аппаратное обеспечение SM2 явно упоминается в вопросе, позвольте мне немного пояснить этот в остальном отличный ответ: аппаратное обеспечение SM2 всегда будет выполнять инструкции обеих ветвей оператора if, за которыми следует условное перемещение. Это независимо от каких-либо условий или закономерностей, поскольку это все, на что способно аппаратное обеспечение. Для аппаратного обеспечения SM3 основную роль играют паттерны ветвления принятые/не принятые, фактические ветвления дешевы (2-3 цикла), но производительность равна самой медленной комбинации ветвлений в варпе. - person Damon; 25.04.2011