Giriş
- Bu yazı, GPU'daki dallanmayla ilgili yanlış kanıları düzeltmeyi amaçlıyor.
- Bazı eğitim siteleri yanlış bilgi yaydığı için bunu düzeltmek istiyor.
Sorun
- GPU kodunda koşullu yürütmeyi uygulayan üçlü operatörü kullanan bir kod örneği sunuyor.
- Bazı kişiler bunu aritmetik işlemlerle değiştiren bir "optimizasyon" öneriyor, ancak bu yanlış bir anlayış.
- Üçlü operatör koşullu taşıma gerçekleştirir ve bu basit bit işlemleriyle uygulanır.
- GPU kodunda gerçek dallanma olur, ancak küçük register taşımalarda kullanılmaz.
Yanlış optimizasyonun sorunları
- Önerilen optimizasyon gerçekte özgün koddan daha yavaş çalışır.
step()fonksiyonu üçlü operatörle uygulandığından, gereksiz çarpma ve toplama işlemleri ekler.- Özgün kodda değer koşula göre doğrudan taşınır.
Makine kodu analizi
- AMD ve Microsoft derleyicilerinin makine kodu üzerinden GPU'nun dallanma yapmadığı doğrulanabilir.
- Karşılaştırma işlemleri ve bit maskeleri kullanılarak koşullu taşıma gerçekleştirilir.
Sonuç
-
step()fonksiyonunu kullanan optimizasyon önerisi yanlış bilgidir ve düzeltilmelidir. -
Bu yanlış bilgi 20 yılı aşkın süredir yayılıyor ve düzeltilmesi gerekiyor.
-
Inigo Quilez - 1994'ten beri bilgisayar grafikleri öğreniyor.
1 yorum
Hacker News yorumu
TFA'nın sonucunun doğru olduğundan eminim, ancak yalnızca daha iyi sürümün değil, her iki sürümün de üretilen kodu sunulsaydı iddia daha güçlü olurdu
Bazı durumlarda
if'in gerçekten dallanmayı zorladığını anlamanın iyi bir yolu olmasını isterdimmix/lerp'leri kullanmasının nedeni, küçük bir ek yük olsa bile dallanma oluşturmaktan çekinmeleriv = x > y ? a : b;ifadesinin gerçekten çalışması güzel, ancakif'in bazen dallanma olup bazen olmaması endişe vericiBu makale de ilgili: GPU'da dallanma yazımıyla ilgili kötü tavsiyeleri düzeltiyor
Derleyicinin neden 'optimize edilmiş' sürümün eşdeğer olduğunu fark etmediğini merak ediyorum
step()'i anlayıpstep()=0.0vestep()==1.0durumlarını ayrı ayrı optimize edebilmesi gerekirdiBu soruna ben de takıldım. Claude/ChatGPT de bunu optimizasyon olarak öneriyor ama performans düşüşüne yol açıyor
OpenGL işlevlerinin GPU'nun temel işlevlerini çağırmak yerine emüle edilip edilmediğini nasıl anlayabileceğimizi merak ediyorum
Kod yazarken koşullu dallanma olmayacağından emin olmak için deneyim gerekiyor
mixişlevinin bir varyantının vektörler üzerinde nasıl çalıştığını açıklıyor