Una condizione costante è più costosa della commutazione degli shader?


14

In generale, ramificarsi negli shader non è una buona idea. Ma ora ho uno shader con una condizione costante rispetto all'intero call call. Quindi il ramo che viene eseguito è sempre lo stesso per un richiamo.

Questo tipo di ramificazione è ancora più costoso che avere più shader senza questi rami e passare da uno all'altro?



Come la risposta spiega sulla mia domanda, i frammenti vengono raggruppati in "orditi" o "fronti d'onda" e se tutti i frammenti di un tale gruppo usano lo stesso ramo, viene eseguito solo quel ramo.
Martin Ender,

Ma che dire di shader diversi dal frammento?
nikitablack,


1
Sospetto che questo non sia un duplicato, ma deve essere modificato per chiarire ciò che viene chiesto prima che possa essere determinato. Qualche codice di esempio o una spiegazione delle due opzioni confrontate sarebbe di grande aiuto.
trichoplax,

Risposte:


13

Sull'hardware moderno se tutte le invocazioni in un gruppo seguono lo stesso percorso, il percorso non utilizzato non viene valutato.

nello pseudo codice:

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

diventa

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

Dove anyInvocationARBsarà vero se qualsiasi invocazione dello shader avrà true as cond(dall'estensione opengl ARB_shader_group_vote ).

Se cond è derivabile solo dalle uniformi, il driver può ottimizzare e valutare la condizione prima di avviare il rendering e sostituire if con un goto con il ramo corretto. OpenGL ha una funzione chiamata subroutine uniformi che la rende esplicita.


4
Questo è vero, ma è non è l'unica cosa che devi prendere in considerazione per le prestazioni. Le GPU pianificano ancora staticamente le risorse per shader, quindi potrebbero essere risorse come se si stessero eseguendo entrambi i rami, il che potrebbe danneggiare l'occupazione.
John Calsbeek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.