Kaç adet Direct / Compute / Copy Queue anlamlı?


11

DirectX 12, grafikler ("Doğrudan" olarak adlandırılır), hesaplama veya kopyalama görevleri için komut sıralarını gösterir. Sağlanan işlevsellik açısından, her biri aşağıdakilerin süper setidir. Spesifikasyon komut sıraları cihaz tarafından eşzamanlı olarak gerçekleştirilebilir belirtir. Ancak, API herhangi bir şekilde komut kuyruklarının sayısını sınırlamaz (en azından herhangi bir sınırlamanın farkında değilim).

Görünüşe göre, farklı satıcılar bunu çok farklı ele alıyor:

  • Intel, yakın zamanda yapılan bir sunumda (slayt 23) şu anda GPU'larının Grafik ve Hesaplamayı paralel olarak işleyemediğini ve kopyalama motorunun zayıf bir verimi olduğunu belirtmektedir. Birden çok grafik / hesaplama kuyruğunun kullanılmasını öneriyorlar.
  • AMD uzun zaman önce Mantle ve mevcut gen konsollarından başlayarak kuyrukların / "asenkron gölgelendiricilerin" reklamını yapmaya başladı . Ayrıca, hesaplama ve grafik görevlerini paralel olarak yürüterek önemli performans kazanımlarını doğrulayan bazı geliştiriciler ( örnek ) de vardır.
  • Son zamanlarda Nvidia'nın donanımda eşzamansız gölgelendiriciyi desteklememesi hakkında bazı karışıklıklar var: Bir kerede ayrı Grafikler ve Hesaplama kuyruğu kullanmak, işleri daha yavaş yapıyor gibi görünüyor, bu da sürücü öykünmesini gösteriyor. Öte yandan, paralel kopyalama işlemleri CUDA tarafından çok uzun zamandır desteklenmektedir ve bu da DMA motorunun bağımsız olarak çalışabileceğini açıkça ortaya koymaktadır.

Komut Listelerini tek bir komut yerine birden çok CommandQueue'ya almanın anlamlı olup olmadığına karar vermek için çalışma zamanında karar vermenin bir yolu var mı? (eski davada fazladan mühendislik yükü olmadığı göz önüne alındığında)

Hesaplama / grafik işlemlerine paralel bellek işlemleri yapmanın ne kadar yararlı olduğunu kolayca görebilsem de, birden fazla hesaplama ve grafik işlemini paralel olarak çalıştırmanın gereksiz bir şekilde karmaşık olması beni şaşırtıyor. Bunun nasıl bir şekilde daha iyi performansa yol açabileceği de bana açık değil; birçok küçük ardışık görevin yeterli GPU yükü üretemediği patolojik durumlar hariç.


1
GPU'yu kimin yaptığını kontrol etmenin yanı sıra, şu anda bu tür bir karar çağrısı yapmanın anlamlı bir yolu olduğunu düşünmüyorum. Sonuçta "donanım aynı anda birden fazla kuyruktan komut yürütebilir" den daha fazla faktör vardır ve D3D12 bu ayrıntıları soyutlar. Aslında D3D12, kuyrukları aynı anda çalıştırabilen ve sıralı olarak yapabilecek donanımlar arasında bile ayrım yapmaz, dokümanlar sadece soyutlamalarının eşzamanlı yürütmeye izin verdiğini söyler .
MJP

1
iyi soru ! aynı zamanda hesaplama ve gölgeleme yapmak için mükemmel kazanmanın özel olacağını hissediyorum. belki hiper-iş parçacığı bir şekilde daha hızlı hale getiren aynı gerçekler sayesinde kazançlar olabilir. bazı birimler diğer kuyruk için meşgul olduğunda serpiştirme işlemleri. hesaplama aşaması tarafından kullanılmayan doku birimlerini tıkayan gölgelendiriciler gibi, kendisi de FPU veya DPU'yu tıkar.
v.oddou

Hm çok kötü. Belki de "GPU'yu kimin yaptığını kontrol etmenin yanı sıra, hayır" zaten daha fazla değilse cevap olarak sayılmaz. Tüm bu AMD pazarlama malzemelerini okuduktan sonra kafa karışıklığımla yalnız olmadığımı duyduğuma sevindim.
Wumpf

1
Bu konunun önemine (aslında önemsizliğe) biraz ağırlık kaldırmayı biliyorsunuz. PS4 SDK, sıra 0'dan başka bir sıraya yaymaya izin vermeyen bir hataya sahiptir.
v.oddou

Yanıtlar:


1

Uygulamanızı, gerçek platformu test eden bir karşılaştırma dizisiyle gönderin. (Sanırım birçok soru için olası cevap ...)

Performansın, donanımı nasıl kullandığınıza büyük ölçüde bağlı olduğundan şüpheleniyorum . Donanımın bir şekilde uygulamanızı geriye doğru göstermesi ve size ne yapmanız gerektiğini söylemesi pek mümkün olmadığından, tasarımınızda iyi görünen her şeye giderim.

"... komut kuyrukları cihaz tarafından aynı anda yürütülebilir ..."

Anahtar kelime CAN. Herhangi bir tedarikçinin bunu berbat etmesinin bir nedeni göremiyorum. Sonunda, tedarikçi değiştirmeyi düşünmemeniz için sizi yeterince iyi bir sürücü yapmaktan sorumlu olan platform sağlayıcısıdır (Intel / AMD / Nvidia). Onlar (bu arada hiçbir fonksiyonel anlam, yalnızca performans vardır) bu işlevselliği ile bir "bilgi sorunu" var ise o zaman gerektiğini de bildiklerini kullanarak çözer. Yüksek sesle ağlamak için, geri dönüş zaten uyguladıkları bir şeydir; eşzamanlı yürütme.

Donanım, geliştiriciler için olduğu gibi yeterli voodoo.


AMD'nin GCN'si, her ikisi de grafik kuyruğunda yayınlansa bile grafikleri yürütecek ve eşzamanlı olarak hesaplayacaktır, ancak genellikle birden fazla komut arabelleğinde bulunmaz (birden fazla çizim çağrısı bile kabataslak olabilir). Sürücü (veya uygulama - Bence DX12 veya Vulkan) veri bağımlılıklarını kontrol etmeli ve gerekirse beraberlik (grafik) ve gönderme (hesaplama) arasında engellemelidir. Grafiklerden (bir sonraki kare için fizik gibi) gerçekten eşzamanlı olmayan bir işleminiz varsa, birden fazla komut kuyruğu muhtemelen yararlı olacaktır, ancak bununla doğrudan bir deneyimim yok.
Daniel M Gessel
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.