Komut Listelerini Yürütme ve Eşitleme

Microsoft Direct3D 12'de, önceki sürümlerin hemen modu artık mevcut değildir. Bunun yerine, uygulamalar komut listeleri ve paketler oluşturur ve ardından GPU komutlarının kümelerini kaydeder. Komut kuyrukları yürütülecek komut listelerini göndermek için kullanılır. Bu model, geliştiricilerin hem grafik işleme biriminin (GPU) hem de CPU'nun verimli kullanımı üzerinde daha fazla denetim sahibi olmasını sağlar.

Komut kuyruğuna genel bakış

Direct3D 12 komut kuyrukları, önceden geliştiriciye sunulmamış olan anında mod iş gönderiminin çalışma zamanını ve sürücü eşitlemesini eşzamanlılık, paralellik ve eşitlemeyi açıkça yönetmek için API'lerle değiştirir. Komut kuyrukları geliştiriciler için aşağıdaki geliştirmeleri sağlar:

  • Geliştiricilerin beklenmeyen eşitlemeden kaynaklanan yanlışlıkla verimsizlikleri önlemesine olanak tanır.
  • Geliştiricilerin gerekli eşitlemenin daha verimli ve doğru bir şekilde belirlenebileceği daha yüksek bir düzeyde eşitleme sunmasını sağlar. Bu, çalışma zamanı ve grafik sürücüsünün paralellik mühendisliğine daha az zaman ayıracağı anlamına gelir.
  • Pahalı işlemleri daha açık hale getirir.

Bu geliştirmeler aşağıdaki senaryoları etkinleştirir veya geliştirir:

  • Artan paralellik - Uygulamalar, ön plan çalışması için ayrı kuyruklara sahip olduklarında video kod çözme gibi arka plan iş yükleri için daha derin kuyruklar kullanabilir.
  • Zaman uyumsuz ve düşük öncelikli GPU çalışması - Komut kuyruğu modeli, bir GPU iş parçacığının engellenmeden başka bir zaman uyumsuz iş parçacığının sonuçlarını kullanmasını sağlayan düşük öncelikli GPU işinin ve atomik işlemlerin eşzamanlı yürütülmesini sağlar.
  • Yüksek öncelikli işlem çalışması - Bu tasarım, 3B render işlemlerini kesintiye uğratarak, CPU üzerinde ek işleme için sonucun erken elde edilmesini sağlayacak az miktarda yüksek öncelikli işlem işini gerçekleştiren senaryoları mümkün kılar.

Komut kuyruğu başlatma

Komut kuyrukları id3D12Device::CreateCommandQueueçağrılarak oluşturulabilir. Bu yöntem, hangi kuyruk türünün oluşturulması gerektiğini ve bu nedenle bu kuyruğa hangi tür komutların gönderilebileceğini belirten bir D3D12_COMMAND_LIST_TYPE alır. Paketlerin yalnızca doğrudan komut listelerinden çağrılabileceğini ve doğrudan kuyruğa gönderilemeyeceğini unutmayın. Desteklenen kuyruk türleri şunlardır:

Genel olarak, DIRECT kuyrukları ve komut listeleri herhangi bir komutu kabul eder, İşlem kuyrukları ve komut listeleri işlem ve kopyalama ile ilgili komutları kabul eder ve COPY kuyrukları ve komut listeleri yalnızca kopyalama komutlarını kabul eder.

Komut Listeleri Çalıştırılıyor

Bir komut listesi kaydettikten ve varsayılan komut kuyruğunu aldıktan veya yenisini oluşturduktan sonra, id3D12CommandQueue::ExecuteCommandListsçağırarak komut listelerini yürütürsiniz.

Uygulamalar, komut listelerini birden çok iş parçacığından herhangi bir komut kuyruğuna gönderebilir. Çalışma zamanı, bu istekleri gönderme sırasına göre seri hale getirme işini gerçekleştirir.

Çalışma zamanı, gönderilen komut listesini doğrular ve kısıtlamalardan herhangi biri ihlal edilirse ExecuteCommandLists çağrısını iptal eder. Aramalar aşağıdaki nedenlerle bırakılır:

Birden çok komut kuyruğundan kaynaklara erişme

Çalışma zamanı tarafından uygulanan ve birden çok komut kuyruğundan kaynaklara erişimi kısıtlayan birkaç kural vardır. Bu kurallar şunlardır:

  1. Bir kaynağa aynı anda birden çok komut kuyruğundan yazılamaz. Bir kaynak bir kuyrukta yazılabilir duruma geçtiğinde, yalnızca bu kuyruğa ait kabul edilir ve başka bir kuyruk tarafından erişilebilmesi için önce okuma veya ORTAK duruma (D3D12_RESOURCE_STATESbakın) geçiş yapması gerekir.

  2. Okuma durumundayken, bir kaynak, okuma durumuna bağlı olarak işlemler arasında da dahil olmak üzere birden çok komut kuyruğundan aynı anda okunabilir.

Kaynak erişim kısıtlamaları ve kaynaklara erişimi eşitlemek için kaynak engellerini kullanma hakkında daha fazla bilgi için bkz. Kaynak durumlarını eşitlemek için kaynak engellerini kullanma.

Komut kuyruğu çitlerini kullanarak komut listesi yürütmesini eşitleme

Direct3D 12'de birden çok paralel komut kuyruğu desteği, GPU'da zaman uyumsuz çalışmanın önceliklendirilmesi üzerinde daha fazla esneklik ve denetim sağlar. Bu tasarım, özellikle bir kuyruktaki komut listeleri başka bir komut kuyruğu tarafından çalıştırılan kaynaklara bağımlı olduğunda uygulamaların iş eşitlemesini açıkça yönetmesi gerektiği anlamına da gelir. Bunun bazı örnekleri arasında, hesaplama kuyruğundaki bir işlemin tamamlanmasını bekleyerek sonucun 3B kuyruğundaki bir işleme kullanılabilmesi ve 3B işlemin tamamlanmasını bekleyerek hesaplama kuyruğundaki bir işlemin yazma için kaynağa erişebilmesi sayılabilir. Kuyruklar arasında iş eşitlemesini etkinleştirmek için Direct3D 12, ID3D12Fence arabirimi tarafından API'de temsil edilen çitler kavramını kullanır.

Çit, işlenen geçerli iş birimini temsil eden bir tamsayıdır. Uygulama ID3D12CommandQueue::Signalçağrısı yaparak çiti ilerlettiğinde tamsayı güncelleştirilir. Uygulamalar bir çitin değerini denetleyebilir ve sonraki bir işlemin başlatılıp başlatılmayabileceğine karar vermek için bir çalışma biriminin tamamlanıp tamamlanmadığını belirleyebilir.

Komut kuyrukları tarafından erişilen kaynakları eşitleme

Direct3D 12'de, bazı kaynakların durumunu eşitleme, kaynak engelleri ile uygulanır. Her kaynak engelinde, bir uygulama kaynağın önce ve sonra durumlarını bildirir. Bir kaynağın gölgelendirici kaynak görünümü arasında işleme hedef görünümüne geçmesi yaygın bir örnektir. Çoğunlukla, bu kaynak engelleri komut listelerinde yönetilir. Hata ayıklama katmanları etkinleştirildiğinde, sistem tüm kaynakların önceki ve sonraki durumlarının eşleşmesini zorunlu kılarak kaynağın bir engel geçişindeki belirli bir işlem için doğru durumda olduğunu garanti eder.

Kaynak durumunu eşitleme hakkında daha fazla bilgi için bkz. Kaynak durumlarını eşitlemek için kaynak engellerini kullanma.

Kutucuklu kaynaklar için komut kuyruğu desteği

Direct3D 11'de ID3D11DeviceContext2 arabirimi aracılığıyla kullanıma sunulan kutucuklu kaynakları yönetme yöntemleri, Direct3D 12'deki ID3D12CommandQueue arabirimi tarafından sağlanır. Bu yöntemler şunlardır:

Yöntem Açıklama
CopyTileMappings Eşlemeleri kaynak dilimli kaynaktan hedef dilimli kaynağa kopyalar.
UpdateTileMappings Kutucuklu kaynaklardaki kutucuk konumlarının eşlemelerini bir kaynak yığınındaki bellek konumlarıyla güncelleştirir.

Direct3D 12 uygulamalarında kutucuklu kaynakları kullanma hakkında daha fazla bilgi için bkz. Direct3D11 Kutucuklu Kaynaklar.

Direct3D 12 'da İş Gönderimi