GPU'da arama tabloları kullanılırken en uygun bellek erişimi?


9

Ben bir lisans projesi için GPU üzerinde izosurface algoritmaları araştırıyorum (özellikle gerçek değerli alanlar yerine sadece ikili giriş / çıkış voksel verilere konsantre). Bu yüzden OpenFrameworks'te çalışan ve çalışan eski eski küplerin bir CPU uygulaması var ve şimdi GLSL hesaplama gölgelendiricilerine taşımaya çalışıyorum ve dalmadan önce tuzakları düşünüyoruz. Sadece dikey ve parça gölgelendiriciler yazdım bu yüzden hepsi benim için yeni.

İlk sorunum, bir çalışma tablosunda düzinelerce veya yüzlerce iş parçacığında etkili bir şekilde arama tablosu nasıl kullanılır? Bir GPU'nun farklı görevler için farklı bellek türlerine sahip olduğunu anlıyorum, ancak her birinin nasıl çalıştığından veya hangi türden kullanılacağından tam olarak emin değilim.

Paul Bourke'nin klasik copypasta tablosu 256 * 16 dizisidir, bu nedenle skaler bayt tipi kullanılıyorsa, bu muhtemelen bir 4kb dokuya veya SSBO'ya paketlenebilir.

Soru, farklı iş parçacıklarının birbirlerini açmalarını nasıl durduracağıdır? Her çalışma grubundaki birçok küp potansiyel olarak aynı yapılandırmaya sahip olabilir, bu nedenle aynı zamanda arabellekteki aynı konuma erişmeye çalışır. Bununla başa çıkmak için bir geçici çözüm veya optimizasyon var mı?


Bu salt okunur bir arama tablosuysa, yalnızca bir arabellek / doku kullanabilirsiniz. Normal doku biçimlerinden birine paketleyebilir veya özel bir biçime sahip olmak için DX11 / OpenGL'nin daha yeni özelliklerinden bazılarını kullanabilirsiniz. DX11 arazisinde İHA veya OpenGL arazisinde bir doku / shader_image_load_store.
RichieSams

Buna ek olarak, bu sunuma bir göz atın: cvg.ethz.ch/teaching/2011spring/gpgpu/cuda_memory.pdf CUDA için, ancak size altta yatan donanımda neler olduğu hakkında daha iyi bir fikir
vermeli

Tam bir cevap değil, daha az kullandığınız bellek miktarı daha iyidir, çünkü önbelleklere sığması ve daha az önbellek kaybına sahip olması daha olasıdır. Bir eğri üzerindeki noktaları dokulara dönüştürdüğünüz gibi enterpolasyonlu değerleriniz varsa, bunu daha az belleğe sahip daha kaliteli eğri arama tabloları almanın bir yolu olarak kontrol edebilirsiniz: blog.demofox.org/2016/02/22/…
Alan Wolfe

Yanıtlar:


6

GPU hesaplama gölgelendiricisi için bir arama tablosu koymak için en iyi yer, arama tablosunun boyutuna ve erişim sıklığına / tutarlılığına bağlıdır. Sizin durumunuzda (4kb'den bahsetmiştiniz), paylaşılan yerel bellek muhtemelen en iyisidir (aynı belleğe başka amaçlar için bu belleğe ihtiyacınız olmadığını varsayarsak). Bu bellek farklı API'lerde farklı adlara sahiptir, ancak aynı mimari şeydir ve aynı performans yönergelerini izler:

  • CUDA: iş parçacığı grubu paylaşılan belleği
  • DirectCompute: grup paylaşımlı bellek
  • OpenCL: yerel bellek
  • Metal: iş parçacığı grubu belleği
  • OpenGL: paylaşılan hafıza

Arama tablosunu, genel bellekte salt okunur bir arabellek olarak depolamak, üzerinde çalıştığınız GPU'nun önbellek boyutlarına bağlı olarak da iyi performans gösterebilir.

Bunun salt okunur bir arama tablosu olduğunu varsayıyorum. Okuma yazma arama tablosu tamamen farklı bir canavardır ve orada iyi seçenekleriniz yoktur.


Ayrıca, salt okunur bir ara belleğin, 4kb salt okunur verilerin paylaşılan yerel bellekte depolanmasından daha iyi olacağı durumlar da vardır. Örneğin, yerel bellekte saklamak, her evre grubu için verilerinizin benzersiz bir kopyası olduğu anlamına gelebilir. Arabellek önbelleğe sığarsa, salt okunur erişim kalıpları için önbelleğin yerel bellekten daha iyi performans göstermesi mümkündür.
John Calsbeek

Geri bildiriminiz için teşekkürler çocuklar. Şimdilik bunu kullandığım projeyi bitirdim ve sadece güzel çalışan bir r8ui salt okunur tampon dokusu kullanarak yaraladım :)
russ
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.