Я понимаю, что этот вопрос может показаться несколько необоснованным, но если кто-то знает что-либо теоретическое/имеет практический опыт в этой теме, было бы здорово, если бы вы его разделили.
Я пытаюсь оптимизировать один из моих старых шейдеров, который использует много текстурных поисков.
У меня есть диффузные, нормальные, зеркальные карты для каждой из трех возможных плоскостей отображения, а для некоторых лиц, которые находятся рядом с пользователем, мне также приходится применять методы сопоставления, которые также приносят много текстурных поисков (например, parallax occlusion mapping
).
Профилирование показало, что поиск текстур является узким местом шейдера, и я готов удалить некоторые из них. Для некоторых случаев входных параметров я уже знаю, что часть текстурных запросов не нужна, а решение очевидное должно делать что-то вроде (псевдокода):
if (part_actually_needed) {
perform lookups;
perform other steps specific for THIS PART;
}
// All other parts.
Теперь - вот вопрос.
Я точно не помню (почему я сказал, что вопрос может быть необоснованным), но в некоторых документах, которые я недавно прочитал (к сожалению, не могу вспомнить имя), что-то похожее на следующее: заявил:
Показатель представленности техника зависит от того, насколько эффективны УСЛОВИЕ НА ОСНОВЕ ОБОРУДОВАНИЯ BRANCHING.
Я вспомнил такое выражение прямо перед тем, как начать рефакторинг большого количества шейдеров и реализовать эту оптимизацию на основе if
, о которой я говорил.
Итак - прямо перед тем, как я начну это делать - кто-то знает что-то об эффективности ветвления в шейдерах? Почему ветвление может привести к серьезным нарушениям производительности в шейдерах?
И возможно ли, что я мог бы только ухудшить фактическую производительность при ветвлении на основе if
?
Вы можете сказать - попробовать и посмотреть. Да, это то, что я собираюсь делать, если никто здесь не помогает мне:)
Но все же, что в случае if
может быть эффективным для нового GPU, может стать кошмаром для немного более старых. И такая проблема очень трудно прогнозировать, если у вас нет большого количества графических процессоров (это не мое дело)
Итак, если кто-то знает что-то об этом или имеет опыт сравнения для этих типов шейдеров, я был бы очень признателен за вашу помощь.
Немногие оставшиеся мозговые клетки, которые на самом деле работают, продолжают говорить мне, что ветвление на графическом процессоре может быть далеко не столь эффективным, как ветвление для процессора (что обычно имеет чрезвычайно эффективные способы предсказаний ветвей и устранение промахов в кеше) просто потому, что это графический процессор (или это может быть трудно/невозможно реализовать на графическом процессоре).
К сожалению, я не уверен, что это утверждение имеет что-то общее с реальной ситуацией...