1 puan yazan GN⁺ 2025-02-10 | 1 yorum | WhatsApp'ta paylaş

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

 
GN⁺ 2025-02-10
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

    • Üretilen makine kodu gösterilerek "optimize edilmiş" sürümün aslında özgün sürümden çok daha yavaş çalıştığı ortaya konuyor, ancak kötü sürümün daha kötü olduğunu kanıtlamıyor
  • Bazı durumlarda if'in gerçekten dallanmayı zorladığını anlamanın iyi bir yolu olmasını isterdim

    • İnsanların daha pahalı mix/lerp'leri kullanmasının nedeni, küçük bir ek yük olsa bile dallanma oluşturmaktan çekinmeleri
    • v = x > y ? a : b; ifadesinin gerçekten çalışması güzel, ancak if'in bazen dallanma olup bazen olmaması endişe verici
  • Bu makale de ilgili: GPU'da dallanma yazımıyla ilgili kötü tavsiyeleri düzeltiyor

    • Geçmişte dallanmadan kaçınan optimizasyonlar işe yarıyordu, ancak artık bunu yapmamak gerekiyor
    • İşlemciler ve derleyiciler değiştiği için, birden fazla varyant sunup çalışma zamanında en hızlı olanı seçmek iyi olur
  • Derleyicinin neden 'optimize edilmiş' sürümün eşdeğer olduğunu fark etmediğini merak ediyorum

    • step()'i anlayıp step()=0.0 ve step()==1.0 durumlarını ayrı ayrı optimize edebilmesi gerekirdi
  • Bu soruna ben de takıldım. Claude/ChatGPT de bunu optimizasyon olarak öneriyor ama performans düşüşüne yol açıyor

    • Inigo'ya teşekkürler
  • 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

    • Koşuldan sonra kaç işlemin dallanmaya yol açtığını, derleyicinin hangi işlemleri atlayabildiğini anlamak zor
    • Kazara performans düşüşlerini görmek için bir performans test paketi kullanmak gerekip gerekmediğini düşünüyorum
  • mix işlevinin bir varyantının vektörler üzerinde nasıl çalıştığını açıklıyor