Zamanlama (Direct3D 12 Grafik)

Bu bölüm zaman damgalarını sorgulamayı ve GPU ile CPU zaman damgası sayaçlarını ayarlamayı kapsar.

Tip

Etkileşimli GPU profil oluşturma ve çerçeve zamanlama analizi için Windows için PIX kullanın. PIX, CPU ve GPU çalışmasını görsel olarak ilişkilendiren GPU yakalama, zamanlama yakalama ve sistem izleyicisi görünümleri sağlar; bu da özel zaman damgası sorgu altyapısı yazmadan önce önerilen başlangıç noktasıdır. DirectX 12 Çeviklik SDK'sı, işletim sistemi sürümünden bağımsız olarak profil oluşturma ve tanılama için en son çalışma zamanı özelliklerine sahip olduğunuzdan emin olur.

Zaman damgası sıklığı

Uygulamanız GPU zaman damgası sıklığını komut sırası temelinde sorgulayabilir (ID3D12CommandQueue::GetTimestampFrequencyyöntemine bakın).

Döndürülen frekans Hz (saniyede tik) cinsinden ölçülür. Belirtilen komut kuyruğu zaman damgalarını desteklemiyorsa (Sorgular bölümündeki tabloya bakın), bu API başarısız olur (ve E_FAILdöndürür). D3D12_COMMAND_LIST_TYPE_DIRECT ve D3D12_COMMAND_LIST_TYPE_COMPUTE her zaman zaman damgalarını destekler. D3D12_COMMAND_LIST_TYPE_COPY, D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported üyesi TRUEise isteğe bağlı olarak zaman damgalarını destekler.

Zaman damgası kalibrasyonu

D3D12, uygulamaların zaman damgası sorgularından elde edilen sonuçları QueryPerformanceCounterçağrısından elde edilen sonuçlarla ilişkilendirmesini sağlar. Bu, ID3D12CommandQueue::GetClockCalibrationçağrısı tarafından etkinleştirilir.

GPU, önceki iş yükünü tamamen bitirdiğinde, bir zaman damgası örneği alır. Direct3D 11 tarafından benimsenen davranışla aynıdır (bkz. GitHub'daki Direct3D 11.3 İşlev Belirtimi'nde D3D11_QUERY_TIMESTAMP). Bu, zaman damgası sorgulamaları Direct3D 12'de bir bottom-of-pipe (BOP) işlemi olduğu anlamına gelir.

GetClockCalibration belirli bir komut kuyruğu için GPU zaman damgası sayacını ve neredeyse aynı anda QueryPerformanceCounter aracılığıyla CPU sayacını örnekler. Belirtilen komut kuyruğu zaman damgalarını desteklemiyorsa bu API yine başarısız olur (E_FAIL döndürülerek) (sorgular konu başlığındaki tabloya bakın).

GPU ve CPU zaman damgası sayaçlarının bu işlemcilerin saat hızıyla doğrudan ilgili olmadığını, bunun yerine zaman damgası değerlerinden çalıştığını unutmayın.

Warning

GPU zaman damgası saatleri, GPU boşta olduğunda bazı donanımlarda işlenmeyi durdurabilir, bu nedenle bağıntı kayabilir. Bunu önlemek için geliştirme sırasında ID3D12Device::SetStablePowerState çağrısı yapın (Geliştirici Modunun etkinleştirilmesini gerektirir).

Zaman damgası sorguları

Zaman damgası sorguları aracılığıyla zaman damgalarını bir komut listesinin parçası olarak (komut kuyruğunda CPU tarafı çağrısı yerine) elde edebilirsiniz. (Genel olarak sorgular hakkında daha fazla bilgi için bkz. Sorgular).

Tüm zaman damgası sorguları, gerçek sorgu için D3D12_QUERY_TYPE_TIMESTAMP türünü kullanır. Ancak, donanım sınırlamaları nedeniyle D3D12_COMMAND_LIST_TYPE_DIRECT ve D3D12_COMMAND_LIST_TYPE_COMPUTE, D3D12_COMMAND_LIST_TYPE_COPY kullandığından farklı bir D3D12_QUERY_HEAP_TYPE kullanır.

Doğrudan ve işlem kuyrukları D3D12_QUERY_HEAP_TYPE_TIMESTAMPkullanır.

Kopyalama kuyrukları D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMPkullanır.

Kopyalama kuyruğu sorguları yalnızca D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported üyesi "TRUE" ise desteklenir.

ID3D12GraphicsCommandList::ResolveQueryDataaracılığıyla çözümlenen zaman damgası sorguları, ID3D12CommandQueue::GetClockCalibrationtarafından döndürüldüğü gibi, onay işaretlerini temsil eden bir UINT64 ve bu nedenle saniye cinsinden uzunluğu almak için kuyruk sıklığına bölünmesi gerekir.

Önemli

Doğruluk için, zaman damgalarının ikinci veya milisaniyelik aralıklarını hesaplarken kayan nokta aritmetiği kullanın. Örneğin, queriedTicks / (double)Frequencyyerine queriedTicks / Frequency kullanın.

Sayaçlar ve Sorgular

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Performans Ölçümü