Gölgelendiricide döngü performansı


11

Bir gölgelendiriciye dinamik döngü işlevini entegre etmenin en iyi yolunun ne olduğunu merak ediyorum?

Birincisi, dinamik dizilerin mümkün olmadığı anlaşılıyor. Bu nedenle, maksimum boyut dizisi oluşturmak ve yalnızca bir kısmını doldurmak veya önceden tanımlanmış boyutlara sahip diziler tanımlamak daha mı iyi?

Peki, bu dizi üzerinde yineleme yapmanın en iyi yolu nedir?

4 ila 128 yineleme arasındaki bir şey için kaydedilmemiş bir döngü veya dinamik bir döngü kullanmak daha mı iyi? Ayrıca, önceden tanımlanmış maksimum yineleme sayısına kadar açabilmenin ve sonra böyle bir durumla durdurmanın mümkün olduğunu gördüm if (i == myCurrentMaximumIterationNumber).


2
Dizi ve döngü ile ne yapmaya çalışıyorsunuz? Soruyorum çünkü bu bir şekilde bana bir XY Sorunu gibi geliyor . GPU'da koşulları ve döngüleri kullanmanın en iyi yolu bunları kullanmaktan kaçınmak olduğundan, belki de sizin durumunuzda diziler ve döngüler kullanmak yerine daha iyi yollar vardır.
Nero

Şu anda çalışan bir ekran altı yeraltı saçılma efekti uyguluyorum. Ama performanslara göre çekirdeği kullanma şeklim hakkında bazı şüphelerim var. Ben maksimum dizi boyutu yapmak ve sadece bir bölümünü doldurmak ve şu anda kullanılan dizi içeriği ile ilgili dinamik bir yineleme dinamik bir döngü kullanmayı seçtim. Örneğin, gölgelendiricileri performanslara göre programlarken yapılacak veya bilinecek şeyler olduğunu düşünüyorum. Benim görüşüme göre döngüler, bazı kurallara ve belki de "iyi uygulamalara" uyan ortak bir performans konusudur, ancak bu konuda iyi bir cevap bulamadım.
MaT

Yanıtlar:


6

Gölgelendirici derleyicileri açma konusunda son derece agresiftir, çünkü erken HW genellikle akış kontrolüne sahip değildir ve daha yeni HW'nin maliyeti değişebilir. Aktif olarak test ettiğiniz bir kıyaslama ölçünüz ve bir dizi ilgili donanımınız varsa, neler olduğunu görmek için bir şeyler deneyin. Dinamik döngünüz geliştirici müdahalesine statik bir döngüden daha uygundur - ancak karşılaştırmalı bir testiniz yoksa bunu derleyiciye bırakmak hala iyi bir tavsiyetir. Bir ölçütle, keşif yapmaya değer (ve eğlenceli).

Bir GPU'da dinamik bir döngü ile en büyük kayıp olan BTW, bir dalga önü / çözgüdeki bireysel "iş parçacıklarının" farklı zamanlarda biteceğidir. Daha sonra duracak olan iş parçacıkları, erken bitenleri NOP'ları yürütmeye zorlar.

İç içe döngüler dikkatlice düşünülmelidir: Sıfırları kodlayan (JPEG benzeri sıkıştırma için) blok tabanlı bir entropi kod çözücü uyguladım. Doğal uygulama, çalışmaların sıkı bir iç döngüde kodunu çözmekti - bu da genellikle sadece bir ipliğin ilerleme kaydettiği anlamına geliyordu; Döngüyü düzleştirerek ve şu anda bir çalışmanın kodunu çözüp çözmediğini her bir iş parçacığında açıkça test ederek, tüm iş parçacıklarını sabit uzunluktaki döngü boyunca aktif tuttum (kod çözülmüş blokların hepsi aynı boyutta). İş parçacıkları CPU iş parçacıkları gibi olsaydı, değişiklik korkunç olurdu, ancak üzerinde çalıştığım GPU'da, performansta 6 kat bir artış elde ettim (hala korkunçtu - GPU'yu meşgul edecek yeterli blok yoktu - ama bu bir kavram kanıtıydı).

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.