Değişken uzunluktaki döngülerin GPU gölgelendiricileri üzerindeki etkisi


9

İşlemsel içeriği GPU'nun içinde, örneğin demossende oluşturmak popülerdir (ekranı doldurmak için tek bir dörtlü çizmek ve GPU'nun pikselleri hesaplamasına izin vermek).

Ray marching popüler:

resim açıklamasını buraya girin

Bu, GPU'nun piksel başına bilinmeyen sayıda döngü yinelemesi yürüttüğü anlamına gelir (ancak bir üst sınırınız olabilir maxIterations).

Değişken uzunlukta bir döngüye sahip olmak gölgelendirici performansını nasıl etkiler?

Basit ışın yürüyen psuedo kodunu hayal edin:

t = 0.f;
while(t < maxDist) {
    p = rayStart + rayDir * t;
    d = DistanceFunc(p);
    t += d;
    if(d < epsilon) {
       ... emit p
       return;
    }
}

Çeşitli ana akım GPU aileleri (Nvidia, ATI, PowerVR, Mali, Intel, vb.) Nasıl etkilenir? Köşe gölgelendiriciler, ama özellikle parça gölgelendiriciler?

Nasıl optimize edilebilir?


Ne yazık ki, bu sorunun burada düzgün bir şekilde cevaplanması çok zor. Her ne kadar bir cevap zaten okumaya değer bir kaynağa işaret etse de (dinamik dallanma içerir). "Konu" için +1 ..
teodron

1
@teodron yenilgi yapma! Birisinin NVidia kartlarında 8x8 bloklardaki ekran piksellerinin en derin ihtiyaçlar kadar derin yineleneceğini ve 8x8 piksellik blokların herhangi bir sırayla veya bunun gibi bir şeyle yapılabileceğini söyleyeceğini umuyordum; bu doğru değil, bu sadece insanların paylaşabileceğini umduğum bilgelik türüdür. Larrabee, hmm, linkleri oldukça dolaylıdır.
Will

Larrabee'yi tartışıyor gibi görünmüyor, ancak Stanford adamı aynı konuşmayı iki yıl sonra, 2010'da verdi ( burada görebilirsiniz ). Rakamlarından, bir while döngüsü göz önüne alındığında, hesaplarını daha erken bitiren piksellerin herhangi bir performans için telafi edip etmediğini anlamadım. CUDA'da, iplikler bir engelde bekler. Analoji olarak, gölgelendirici iplikleri ile ne olur?
teodron

@teodron evet, CUDA anlayışımı aldım ve GPU'lara başvurdum; Eminim onlar kilit adımında, ama ben chime bilgili biri istiyorum; neyse, burada ilgili bir şey williamedwardscoder.tumblr.com/post/26628848007/rod-marching
Will

Yanıtlar:


8

GDC 2012'de GPU mesafe alanı ray yürüyüşü (ve diğer konular) hakkında hoş bir konuşma yapıldı: http://directtovideo.wordpress.com/2012/03/15/get-my-slides-from-gdc2012/

Performansa gelince, en yeni (DX11 sınıfı) grafik kartları kilit adımında 32 (NVIDIA) veya 64 (AMD) "iş parçacığı" çalıştıran SIMD birimlerinde gölgelendiriciler yürütür. Bu gruplar çeşitli olarak çözgü veya dalga önleri olarak bilinir. Piksel gölgelendiriciler için, her iş parçacığı bir piksele eşittir, bu nedenle SIMD biriminin 8x4 (NVIDIA) veya 8x8 (AMD) piksel bloğu gibi bir şeyi işlemesini beklerim. Dallanma ve akış kontrolü her dalga kenarı için yapılır, bu yüzden bir dalga cephesindeki tüm ipliklerin o dalga cephesindeki en derin tek tek piksel kadar döngü yapması gerekir. SIMD şerit maskeleri, zaten bitmiş olan pikseller için yürütmeyi kapatır, ancak yine de genel dalga cephesinin akış kontrolüyle sessizce devam etmeleri gerekir. Bu, elbette, dallanma tutarlı olduğunda sistemin çok daha verimli olduğu anlamına gelir,

Deneyimlerime göre, dalga önü dalındaki tüm iplikler aynı şekilde olsa bile şube yükü hala oldukça yüksektir. Bazı durumlarda, bazı şube yükünü amorti etmek için döngüyü açarak performans artışları gördüm. Ancak, elbette her döngü yinelemesinde ne kadar iş yaptığınıza bağlıdır. Döngü gövdesinde yeterince "öğe" varsa, açma işlemi bir kazanç olmaz.



0

Dinamik dallanma ile ilgili olarak, bir ek not (açık olabilir, ancak yine de bazı insanlara dikkat çekmeye değer): açılmamış döngülerin performansını ciddi şekilde etkileyebilir (sabit sayıda yineleme yoksa bir döngüyü açamazsınız) .


-4

int s = 0;

şimdi (int k = 1; k <= n; k ++) için {s + = k;} s = n * (n + 1) / 2 ile aynı

yani genel olarak doğru değil: D


1
Kimse burada aktarmaya çalıştığınızdan veya bunun soru ile ne ilgisi olduğundan emin değil.
doppelgreener
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.