John zaten çok iyi bir cevap yazdı , bu yüzden bu cevabı onun bir uzantısı olarak düşünün.
Şu anda farklı algoritmalar için hesaplama gölgelendiricileri ile çok çalışıyorum. Genel olarak, hesaplama gölgelendiricilerin eşdeğer piksel gölgelendiricilerinden çok daha hızlı olabileceğini ya da geri besleme tabanlı alternatifleri dönüştürdüğünü gördüm.
Kafanızı hesaplama gölgelendiricilerin çalışma şeklinin etrafına sardıktan sonra, birçok durumda daha anlamlı olurlar. Bir görüntüyü filtrelemek için piksel gölgelendiricileri kullanmak, bir çerçeve oluşturmayı, köşe göndermeyi, çoklu gölgelendirici aşamalarını vb. Kullanmayı gerektirir. Bir görüntüyü filtrelemek için neden bu gerekli olmalı? Görüntü işleme için tam ekran dörtlü oluşturmada kullanılan, kesinlikle bunları kullanmaya devam etmenin tek "geçerli" nedenidir. Bilgisayar grafikleri alanında yeni bir uzmanın, bilgisayar gölgelendiricilerini, görüntü işleme için dokulara dönüştürmekten daha doğal bir çözüm bulacağına inanıyorum.
Sorunuz özellikle görüntü filtrelemeden bahsediyor, bu yüzden diğer konularda fazla ayrıntıya girmeyeceğim. Testlerimizin bazılarında, sadece bir dönüşüm geri bildirimi ayarlamak veya bir yapıya dönüştürmek için framebuffer nesnelerini değiştirmek, 0.2ms civarında performans maliyetlerine neden olabilir. Bunun, herhangi bir görüntülemeyi hariç tuttuğunu unutmayın! Bir durumda, gölgelendiricileri hesaplamak için kullanılan aynı algoritmayı koruduk ve gözle görülür bir performans artışı gördük.
Hesaplama gölgelendiricileri kullanılırken, asıl işi yapmak için GPU'daki silikonun daha fazlası kullanılabilir. Piksel gölgelendirici rotasını kullanırken tüm bu ek adımlar gereklidir:
- Köşe düzeneği (köşe özelliklerini okuma, köşe bölenleri, tür dönüştürme, bunları vec4'e genişletme vb.)
- Köşe gölgelendiricinin ne kadar az olursa olsun programlanması gerekir
- Rasterizer, tepe çıktılarını gölgelemek ve enterpolasyon yapmak için bir piksel listesi hesaplamalıdır (muhtemelen görüntü işleme için yalnızca doku kodları)
- Tüm farklı durumlar (derinlik testi, alfa testi, makas, harmanlama) ayarlanmalı ve yönetilmelidir
Daha önce belirtilen performans avantajlarının akıllı bir sürücü tarafından reddedilebileceğini iddia edebilirsiniz. Haklısın Böyle bir sürücü derinlik testi vb. Olmadan tam ekran bir dörtlü oluşturduğunuzu tespit edebilir ve piksel gölgelendiricileri desteklemek için yapılan tüm işe yaramaz işleri atlayan bir "hızlı yol" yapılandırabilir. Bazı sürücüler bunu, bazı AAA oyunlarındaki işlem sonrası geçişlerini kendi GPU'larına göre hızlandırmak için yaparlarsa şaşırmam. Bir AAA oyunu üzerinde çalışmıyorsanız elbette böyle bir tedaviyi unutabilirsiniz.
Ancak sürücünün yapamadığı şey, hesaplama gölgelendirici boru hattının sunduğu daha iyi paralellik fırsatlarını bulmak. Gaussian filtrenin klasik örneğini alın. Hesap gölgelendiricileri kullanarak, böyle bir şey yapabilirsiniz (filtreyi ayırma veya ayırma):
- Her çalışma grubu için, kaynak görüntünün örneklemesini çalışma grubu boyutuna bölün ve sonuçları paylaşılan hafızada saklayın.
- Paylaşılan hafızaya kaydedilen örnek sonuçları kullanarak filtre çıktısını hesaplayın.
- Çıktı dokusuna yaz
1. adım buradaki anahtardır. Piksel gölgelendirici sürümünde, kaynak görüntü piksel başına birden çok kez örneklenir. Hesap gölgelendirici versiyonunda, her kaynak metin tek bir çalışma grubunda sadece bir kez okunur. Doku genellikle karo tabanlı bir önbellek kullanır, ancak bu önbellek hala paylaşılan hafızadan daha yavaştır.
Gaussian filtresi daha basit örneklerden biridir. Diğer filtreleme algoritmaları, ortak bellek kullanarak çalışma gruplarında ara sonuçları paylaşma için başka fırsatlar sunar.
Ancak bir avlanma var. Hesaplama gölgelendiricileri, çıktılarını senkronize etmek için açık bellek engelleri gerektirir. Ayrıca hatalı bellek erişimine karşı koruma sağlamak için daha az güvenlik önlemi vardır. Paralel programlama bilgisi iyi olan programcılar için hesaplama gölgelendiricileri daha fazla esneklik sunar. Bununla birlikte, bu esneklik, sıradan C ++ kodu gibi hesaplama gölgelendiricileri işlemenin ve yavaş veya yanlış kod yazmanın daha kolay olduğu anlamına gelir.
Referanslar
- OpenGL Hesaplama Gölgelendiricileri wiki sayfası
- DirectCompute: Optimizasyonlar ve En İyi Uygulamalar, Eric Young, NVIDIA Corporation, 2010 [pdf]
- Verimli Hesaplama Shader Proramming, Bill Bilodeau, AMD, 2011? [PPS]
- Oyun için DirectCompute - Motorunuzu Compute Shader ile güçlendirin, Layla Mah ve Stephan Hodes, AMD, 2013, [pps]
- AMD GPU'lar İçin Hesaplama Gölgelendiricisi Optimizasyonu: Paralel Azaltma, Wolfgang Engel, 2014