Bir görüntü gölgelendirici, görüntü filtreleme için bir piksel gölgelendiriciden ne zaman daha verimlidir?


37

Bulanıklaştırma, SSAO, çiçeklenme ve benzeri gibi görüntü filtreleme işlemleri genellikle piksel gölgelendiriciler ve "topla" işlemleri kullanılarak yapılır, burada her piksel gölgelendirici çağrısı, komşu piksel değerlerine erişmek için bir dizi doku yakalar ve bir pikselin değerini hesaplar. sonuç. Bu yaklaşım, birçok fazladan alım yapılması durumunda teorik olarak verimsizdir: yakındaki gölgelendirici çağrıları, aynı dokuların çoğunu yeniden getirecektir.

Bunu yapmanın başka bir yolu da hesaplama gölgelendiricileridir. Bunlar, bir grup gölgelendirici çağırmada az miktarda belleği paylaşabilme potansiyeline sahiptir. Örneğin, her bir başvurunun bir tekli metin almasını ve paylaşılan hafızaya kaydetmesini ve ardından sonuçları oradan hesaplamasını sağlayabilirsiniz. Bu daha hızlı olabilir veya olmayabilir.

Soru, hangi şartlar altında (eğer varsa), hesaplama-gölgelendirici yöntemi aslında piksel-gölgelendirici yönteminden daha hızlı mıdır? Çekirdeğin boyutuna, ne tür bir filtreleme işlemine vb. Bağlı mı? Açıkçası cevap bir GPU modelinden diğerine değişecektir, ancak genel bir eğilim olup olmadığını duymakla ilgileniyorum.


Cevabın "her zaman" olduğunu düşünüyorum eğer shader miktarı düzgün yapılır. Bu başarmak için önemsiz değil. Bir hesaplama gölgelendirici ayrıca, görüntü işleme algoritmaları için kavramsal olarak bir piksel gölgelendiriciden daha iyi bir eşleşmedir. Bununla birlikte, bir piksel gölgelendirici, düşük performans gösteren filtrelerin yazılması için daha az boşluk sağlar.
bernie

@bernie Hesaplama gölgelendiricisinin "doğru şekilde yapılması" için neyin gerekli olduğunu açıklayabilir misiniz? Belki bir cevap yazabilirsin? Konuyla ilgili daha fazla bakış açısı almak her zaman iyidir. :)
Nathan Reed

2
Şimdi bana ne yaptırdığına bir bak! :)
bernie

Çalışmaları iş parçacıkları arasında paylaşmaya ek olarak, zaman uyumsuz hesaplama kullanma yeteneği hesaplama gölgelendiricileri kullanmak için büyük bir nedendir.
JarkkoL

Yanıtlar:


23

Hesap gölgelendiricilerin görüntü işleme için mimari bir avantajı , ROP adımını atlamalarıdır . Piksel gölgelendiricilerden yazmanın, kullanmasanız bile tüm düzenli harmanlama donanımından geçmesi olasıdır. Genel olarak, hesaplanan bilgisayar gölgelendiricileri, belleğe farklı (ve genellikle daha doğrudan) bir yoldan gider, bu nedenle, sahip olabileceğiniz bir darboğazdan kaçınabilirsiniz. Buna atfedilen oldukça büyük performans kazancı olduğunu duydum.

Hesap gölgelendiricilerin mimari bir dezavantajı GPU'nun hangi iş öğelerinin hangi piksellere emekli olduğunu artık bilmemesidir. Piksel gölgelendirme boru hattını kullanıyorsanız, GPU, işi, bellekte bitişik olan ( Z-sırası ile döşenmiş olabilir veya performans için böyle bir şey olabilir) oluşturma hedefine alan bir çözgü / dalga cephesine yazma fırsatına sahiptir. nedeniyle). Hesaplama hattı kullanıyorsanız, GPU artık en iyi gruplarda çalışmaya başlayıp daha fazla bant genişliği kullanımına yol açmayabilir.

Özel operasyonunuzun, ilgili işi aynı iplik grubuna paketleyerek yararlanabileceğiniz bir alt yapıya sahip olduğunu biliyorsanız, bu değiştirilmiş çözgü / dalgalı salmastrayı tekrar bir avantaja dönüştürebilirsiniz. Dediğiniz gibi, teoride, şerit başına bir değer örnekleyerek ve diğer grupların örneklemeden erişebilmesi için sonucu grup paylaşımlı hafızaya yerleştirerek örnekleme donanımına bir mola verebilirsiniz. Bunun bir kazanç olup olmadığı, grup paylaşım hafızanızın ne kadar pahalı olduğuna bağlıdır: en düşük seviye doku önbelleğinden daha ucuzsa, bu bir kazanç olabilir, ancak bunun garantisi yoktur. GPU'lar, oldukça yerel doku getirme işlemleriyle zaten iyi başa çıkıyor (zorunlu olarak).

İşlemde sonuçları paylaşmak istediğiniz bir ara aşama varsa, grup paylaşımlı hafıza kullanmak daha mantıklı olabilir (çünkü ara sonucunuzu hafızaya yazmadan doku örnekleme donanımına geri dönemezsiniz). Maalesef, başka bir iplik grubundan sonuçların alınmasına da bağlı olamazsınız, bu yüzden ikinci aşama kendisini sadece aynı döşemede bulunanlarla sınırlandırmak zorunda kalacaktı. Buradaki kanonik örneğin, otomatik pozlama için ekranın ortalama parlaklığını hesapladığını düşünüyorum. Ayrıca doku örneklemesini başka bir işlemle birleştirmeyi hayal edebiliyorum (üst örneklemenin, alt örneklemenin ve bulanıklaştırmanın aksine, belirli bir döşemenin dışındaki hiçbir değere bağlı olmadığını).


Karıştırma devre dışı bırakılırsa, ROP'un genel giderlere herhangi bir performans eklediğinden şüpheliyim.
GroverManheim

@GroverManheim Mimariye göre değişir! Birleşme / ROP çıktısı aşaması, karışım devre dışı bırakılsa bile sipariş garantileriyle ilgilenmek zorundadır. Tam ekranlı bir üçgen ile herhangi bir gerçek sipariş tehlikesi yoktur, ancak donanım bunu bilmiyor olabilir. Donanımda özel hızlı yollar olabilir, ancak sizin için uygun olduğunuzu bilerek…
John Calsbeek

10

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):

  1. 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.
  2. Paylaşılan hafızaya kaydedilen örnek sonuçları kullanarak filtre çıktısını hesaplayın.
  3. Çı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


3

Bu blogda tökezledim: AMD için Hesaplama Shader Optimizasyonları

Hesaplama gölgelendiricisinde hangi hilelerin yapılabileceği göz önüne alındığında (yalnızca hesaplayıcı gölgelendiricilere özgüdür) Hesaplama gölgelendiricisindeki paralel azalmanın piksel gölgelendiriciden daha hızlı olup olmadığını merak ettim. Piksel gölgelendiriciyi denemiş olup olmadığını sormak için yazar Wolf Engel'e e-posta gönderdim. Blog yazısını yazarken hesap gölgelendirici sürümünün piksel gölgelendirici sürümünden önemli ölçüde daha hızlı olduğunu evet ve geri döndü. Ayrıca bugün farklılıkların daha da büyük olduğunu ekledi. Öyleyse, görünüşe göre bilgisayar gölgelendiricisini kullanmanın büyük avantaj sağlayabileceği durumlar var.

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.