Apakah kondisi konstan lebih mahal daripada mengganti shader?

14

Secara umum, bercabang di shader bukan ide yang baik. Tapi sekarang saya memiliki shader dengan kondisi yang konstan sehubungan dengan keseluruhan panggilan undian. Jadi cabang yang dieksekusi selalu sama untuk satu panggilan undian.

Apakah percabangan seperti itu masih lebih mahal daripada memiliki banyak shader tanpa cabang-cabang ini dan beralih di antara mereka?

nikitablack
sumber
Saat jawaban menjelaskan pada pertanyaan saya, fragmen dikelompokkan menjadi "warps" atau "wavefronts" dan jika semua fragmen dalam grup tersebut menggunakan cabang yang sama, hanya cabang yang dieksekusi.
Martin Ender
Tetapi bagaimana dengan shader yang berbeda dari fragmen?
nikitablack
1
Saya menduga ini bukan duplikat, tetapi perlu diedit untuk memperjelas apa yang diminta sebelum itu dapat ditentukan. Beberapa contoh kode atau penjelasan tentang dua opsi yang dibandingkan akan banyak membantu.
trichoplax

Jawaban:

13

Pada perangkat keras modern jika semua doa dalam grup mengikuti jalur yang sama maka jalur yang tidak digunakan tidak dievaluasi.

dalam kode pseudo:

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

menjadi

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

Di mana anyInvocationARBakan benar jika setiap doa shader akan memiliki true as cond(dari ekstensi terbuka ARB_shader_group_vote ).

Jika kond berasal dari seragam saja maka pengemudi dapat mengoptimalkan dan mengevaluasi kondisi sebelum memulai render dan mengganti if dengan kebagian cabang yang benar. OpenGL memiliki fitur yang disebut subrutin seragam yang membuatnya eksplisit.

aneh ratchet
sumber
4
Ini benar, tetapi itu bukan satu-satunya hal yang perlu Anda pertimbangkan untuk kinerja. GPU masih menjadwalkan sumber daya secara statis per shader, jadi ini mungkin masih sumber daya seolah-olah Anda sedang mengeksekusi kedua cabang, yang mungkin akan merusak hunian.
John Calsbeek