GPU'da bir derinlik arabelleğinin güncellenmesi nasıl çalışır?


10

Şu anda yazılımda bir çeşit derinlik tamponu uygulamaya çalışıyorum ve yazarken büyük bir sorunum var. Bir muteksi olmak mutlak bir aşırılıktır. Bu yüzden iş parçacığı sayısına eşit bir sayıda muteks oluşturdum. Geçerli piksel (pixel_index% mutexes_number) dayalı bir muteksi kilitliyorum ve bu daha iyi çalışıyor, ama yine de çok çok yavaş. Ve bunun gerçek bir GPU'da nasıl yapıldığını merak ediyorum? Akıllı bir algoritma veya donanım tarafından ele alınabilir mi?

Yanıtlar:


9

Son derece özel donanımlar bu işi üstlenir. Tipik bir strateji, GPU'nun rasterleştirmeyi döşemesi ve derinlik bilgilerini sıkıştırılmış biçimlerde depolamasıdır (örneğin, bir poligon bir döşemeyi tamamen kapladığında z denklemi). Bu, tüm döşemede aynı anda test yapılmasına olanak tanır; diğer serin HW hileleri, piksel gölgelendirici çalıştırılmadan önce derinlik testini içerir (koşulların izin verdiği varsayılarak - gölgelendirici bir derinlik değeri yazamaz). Yazılımda, her bir iş parçacığının bir alt kümeye "sahip olması" ve her ilkelden bağımsız olarak yürümesi veya alternatif çerçeveler veya alternatif tarama çizgileri gibi çoklu gpu stratejilerini taklit etmesi gibi benzer bir şey düşünebilirsiniz.


11

Gerçek bir GPU'da, derinlik tamponunun aynı bölgesini okumaya / yazmaya çalışan ve aralarında senkronize etmeye çalışan birden fazla çekirdeğe sahip olmak yerine, derinlik tamponu döşemelere (16 × 16 veya 32 × 32 gibi) ve her biri döşeme tek bir çekirdeğe atanır. Bu çekirdek daha sonra o döşemedeki tüm rasterleştirmeden sorumludur: o döşemeye dokunan üçgenler (bu döşemenin içinde) sahip çekirdek tarafından rasterleştirilir. Daha sonra çekirdekler arasında herhangi bir müdahale olmaz ve çerçeve tamponunun bir kısmına erişirken senkronize olmalarına gerek yoktur.

Bu, birden fazla karoya temas eden üçgenlerin birden fazla çekirdek tarafından rasterleştirilmesi gerektiği anlamına gelir. Bu nedenle, geometri işleme (köşeler ve üçgenler üzerinde işlemler) ve piksel işleme arasında bir iş yeniden dağıtım adımı vardır.

Geometri aşamasında, her çekirdek bir giriş ilkel yığınını işleyebilir; daha sonra her bir ilkel için, ilkel dokunuşların hangi karoları hızlı bir şekilde belirleyebilir (buna "kaba rasterleştirme" denir) ve ilkel olanı etkilenen karolardan birine sahip olan her çekirdek için bir kuyruğa ekleyebilir.

Daha sonra, piksel aşamasında, her çekirdek, sıradaki ilkellerin listesini okuyabilir, çekirdeğin sahip olduğu karolar için piksel kapsamını hesaplayabilir ve başka bir koordinasyona gerek kalmadan derinlik testi, piksel gölgeleme ve güncelleme işlemlerine geçebilir diğer çekirdeklerle.

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.