Hesaplama gölgelendiricileri ve boru hattı gölgelendiricileri aracılığıyla algoritmalar uygulama


10

Hem DirectX hem de OpenGL için hesaplama gölgelendiricilerinin kullanılabilirliği sayesinde, rasterleştirme hattından geçmeden birçok algoritma uygulamak ve bunun yerine sorunu çözmek için GPU'da genel amaçlı bilgi işlem kullanmak mümkündür.

Bazı algoritmalar için bu sezgisel kanonik çözüm gibi görünüyor çünkü doğal olarak rasterleştirme tabanlı değiller ve rasterleştirme tabanlı gölgelendiriciler GPU gücünü kullanmak için bir çözüm gibi görünüyordu (basit örnek: bir gürültü dokusu oluşturma. Burada dörtlü rasterleştirilmeye gerek yok ).

Her iki şekilde de uygulanabilen bir algoritma göz önüne alındığında, hesaplama gölgelendiricilerinin kullanılmasına veya normal rotaya gitmeye kıyasla genel (potansiyel) performans avantajları var mı? Dikkat etmemiz gereken dezavantajlar var mı (örneğin, çalışma zamanında gölgelendiriciden / bilgisayarlara geçiş yapmak için alışılmadık bir ek yük var mı?)

İkisi arasında seçim yaparken göz önünde bulundurulması gereken başka avantajlar veya dezavantajlar var mı?


Performans etiketi gerçekten alakalı ise, bu videoyu Marco Fratarcangeli: youtube.com/watch?v=anNClcux4JQ adlı Game Engine Gems "Cloth Simulation" makalesinden izlemeyi düşünün . Yorumları okuyabilir ve garip bir şey bulabilirsiniz: GLSL / gölgelendirici tabanlı uygulama, CUDA veya OpenCL kullanmaktan daha hızlıydı (ikincisi, o sırada zayıf sürücü desteği nedeniyle, 2010). Fark yaratan bazı düşük seviyeli farklılıklar vardır.
teodron

@teodron Kullanılabilir GPU Taşlarım yok ve kaynak kodunu bulamıyorum. Yazar aslında GLSL köşe + piksel gölgelendiricileri mi kullandı yoksa GLSL hesaplama gölgelendiricileri mi kullandı?
TravisG

Evet! CUDA'dan önce, topluluk GPGPU özelliklerini böyle uyguladı. İşte saf GLSL VEYA Cuda kullanarak bunu nasıl başarabileceğinizi görmek için OpenCloth'e bir link: code.google.com/p/opencloth/source/browse/trunk/…
teodron 28:13

Yanıtlar:


7

Eğer hesaplama shadrs / GPGPU değerlendirmesinden doğrudan faydalanacaksanız doğru cevap yoktur, bu büyük ölçüde uyguladığınız algoritmanın türüne bağlıdır, hesaplama gölgelendiricileri ve CUDA / OpenCL bazı sınırlamaların üstesinden gelmek için daha genel bir yaklaşımdır. o eski gölgelendirme dillerinin elde edeceğiniz en önemli avantajlar:

  • Uzamsal bilgilere erişme. Eski GLSL hackinde (iyi, bir hackti!) doku koordinatlarını kullandığı için komşu parçaları hakkında çok az bilgi verir. Bilgi işlem gölgeleyicileri / CUDA / OpenCL'de uzamsal bilgilere erişim çok daha esnektir, artık GPU'da sıralanmamış doku / tampon erişimi ile Histogram eşitleme gibi algoritmalar uygulayabilirsiniz .
  • Size iplik senkronizasyonu ve atomikler verir .
  • Hesaplama Alanı: Eski GLSL kesmek, tepe / parça hesaplama alanını gölgelendiricinize bağlar. Parça gölgelendirici parça sayısı ile çalışır, köşe gölgelendirici köşe sayısı ile çalışır. Bilgi işlem gölgelendiricisinde kendi alanınızı tanımlarsınız.
  • Ölçeklenebilirlik : bilgi işlem gölgelendiriciniz / CUDA / OpenCL, aynı SM'de çalıştırılması gereken eski GLSL gölgelendiricinizin aksine kullanılabilir olan GPU SM'lerin (Akış Çok İşlemcili) sayısına kadar ölçeklendirilebilir. (Nathan Reed'in yaptığı açıklamalara göre bunun doğru olmadığını ve gölgelendiricilerin hesaplama gölgelendiricileri kadar iyi ölçeklendirilmesi gerektiğini söylüyor. Dokümanları kontrol etmem gerekmesine rağmen hala emin değilim).
  • Bağlam değiştirme : Bazı bağlam geçişleri olmalı, ancak bunun uygulamaya bağlı olduğunu söyleyebilirim, bu yüzden en iyi bahis uygulamanızı profillemektir.

Eh içinde Bence belirli algoritmalar daha uygun olsa bile, hesaplama gölgelendiriciler rota gitmek isterseniz,, dikkate almak gerekir bazı noktalar vardır:

  1. Donanım ve geriye dönük uyumluluk . Hesaplama gölgelendiricileri yalnızca daha yeni bir donanımda mevcuttur ve ticari bir ürüne (örn. Oyun) gidiyorsanız, birçok kullanıcının ürününüzü çalıştıramayacağını düşünmeniz gerekir.
  2. Genellikle ekstra GPU konusunda bilgi / CPU mimarisini gerek o, paralel programlama ve çoklu kullanım (örneğin hafıza paylaşımı, hafıza tutarlılığını, iplik senkronizasyonu, atomics ve performansa 's etkisi) genellikle kullanarak gerekmez , normal gölgelendiriciler rounte.
  3. Öğrenme kaynakları , deneyimlerden, Compute shadrs, OpenCL ve CUDA (aynı zamanda OpenGL birlikte çalışabilirliği de sunar) için normal gölgelendiriciler yolundan çok daha az öğrenme kaynağı vardır.
  4. Hata ayıklama araçları , uygun hata ayıklama eksikliği ile, araç geliştirme çoğu gölgelendiriciden çok daha zor olabilir, en azından gölgelendiriciler görsel olarak hata ayıklanabilir.
  5. Hesaplama gölgelendiricilerinin diğer gölgelendiricilerde aynı algoritmadan daha iyi performans vermelerini bekliyorum; grafik oluşturma için ek adımlardan kaçınmak üzere tasarlandıkları için, 2. noktadan itibaren işleri göz önünde bulundurarak doğru yapıldıysa . Ancak iddiamı destekleyecek somut bir kanıtım yok.
  6. Bu rotaya gidiyorsanız GPGPU için CUUDA / OpenCL'yi de göz önünde bulundurmalısınız.

Asla daha az eminim gelecek için harika ve harika bir öğrenme deneyimi olacak. İyi şanslar!


Bence OP bu soruyor olabilir: neden saf GLSL gölgelendiriciler kullanarak bir sorunu CUDA kodlama vs çözmek? Kumaş simülasyonu ile ilgili bir yazarın yaptığı Program Programlama Taşları makalesi var. Ve GLSL hacky eski yolu performans açısından CUDA yolundan daha iyidir. Muhtemelen nedenini bilmiyorsanız nedenini belirtmelisiniz.
teodron

2
Ölçeklenebilirlik noktanızın doğru olduğunu düşünmüyorum - tepe ve parça gölgelendiricileri, hesaplama gölgelendiricileri kadar tüm GPU'da ölçeklendirme yeteneğine sahiptir. Gerçekte hesaplama gölgelendiricilerinin ölçeklendirilmesi daha zor olabilir, çünkü iş parçacığı grubu boyutu ve paylaşılan bellek kullanımı aynı anda kaç gölgelendirici iş parçacığının çalışabileceği konusunda ek sınırlamalar getirebilir.
Nathan Reed

2
Ayrıca, bir doku dolduruyorsanız (örn. Gürültü üretmek veya başka bir prosedür algoritması yapmak), benim deneyimime göre, her pikselde bir formülü basitçe değerlendiriyorsanız, bir parça gölgelendirici bir hesaplama gölgelendiricisinden daha hızlı olacaktır. Benim tahminim bunun nedeni, parça sırasının iç döşemeli / swizzled piksel sırasına uymasıdır, böylece bu siparişin farkında olmayan hesaplama gölgelendiricisinden daha iyi bellek konumu elde edilmesidir. Hesaplama gölgelendiricileri, yalnızca bir parça gölgelendiriciye göre işleri hızlandırmak için paylaşılan özelliklerini (ör. Paylaşılan bellek) kullanabiliyorsanız daha hızlıdır.
Nathan Reed

2
Tamam, son yorum. :) En güncel GPU'ların grafikten hesaplamaya giderken bir çeşit bağlam anahtarı veya mod anahtarı olduğunu düşünüyorum. Bu nedenle, bazı grafik gölgelendiricileri çalıştırırsanız, ardından bir hesaplama gölgelendiricisi gönderir, ardından daha fazla grafik gölgelendirici vb. Çalıştırırsanız, ileri geri geçiş yaparken bazı performans vuruşlarına girersiniz. Bu profil yapmanız gereken bir şey, ancak belirli bir durumda grafik gölgelendiricileriyle uğraşmak için başka bir neden olabilir.
Nathan Reed

@NathanReed Yorumlar için teşekkürler cevabımı güncelleyeceğim.
concept3d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.