Uma condição constante é mais cara que a troca de shaders?

14

Em geral, ramificação em shaders não é uma boa ideia. Mas agora eu tenho um sombreador com uma condição constante em relação a toda a chamada de empate. Portanto, o ramo que é executado é sempre o mesmo para uma chamada de empate.

Esse tipo de ramificação é ainda mais caro do que ter vários sombreadores sem esses galhos e alternar entre eles?

nikitablack
fonte
Como a resposta explica na minha pergunta, os fragmentos são agrupados em "warps" ou "wavefronts" e se todos os fragmentos desse grupo usarem o mesmo ramo, somente esse ramo será executado.
Martin Ender
Mas e os shaders diferentes de fragmentos?
Nikitablack
1
Suspeito que isso não seja duplicado, mas precisa ser editado para deixar claro o que está sendo solicitado antes que possa ser determinado. Algum código de exemplo ou uma explicação das duas opções comparadas ajudariam muito.
Trichoplax

Respostas:

13

No hardware moderno, se todas as chamadas em um grupo seguirem o mesmo caminho, o caminho não utilizado não será avaliado.

no pseudo código:

if(cond){
   res = ...
}else{
   res = ...
}

torna-se

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

Onde anyInvocationARBserá verdadeiro se qualquer chamada do shader tiver true como cond(da extensão opengl ARB_shader_group_vote ).

Se cond é derivável apenas de uniformes, o driver pode otimizar e avaliar a condição antes de iniciar a renderização e substituir o if por um ir para a ramificação correta. O OpenGL possui um recurso chamado sub-rotinas uniformes que o torna explícito.

catraca arrepiante
fonte
4
Isso é verdade, mas é não a única coisa que você precisa considerar para o desempenho. As GPUs ainda agendam estaticamente os recursos por sombreador, portanto, isso ainda pode recursos como se você estivesse executando as duas filiais, o que pode prejudicar a ocupação.
precisa saber é o seguinte