Timing (Direct3D 12-grafische weergave)

Deze sectie bevat informatie over het uitvoeren van query's op tijdstempels en het kalibreren van de GPU- en CPU-tijdstempeltellers.

Tip

Gebruik PIX voor interactieve GPU-profilering en frametijdanalyse voor Windows. PIX biedt GPU-opname-, timingopname- en systeemmonitorweergaven die cpu- en GPU-werk visueel correleren, waardoor het het aanbevolen startpunt is voordat u aangepaste tijdstempelquery-infrastructuur schrijft. De DirectX 12 Agility SDK zorgt ervoor dat u beschikt over de nieuwste runtimefuncties die beschikbaar zijn voor profilering en diagnostische gegevens, ongeacht de versie van het besturingssysteem.

Tijdstempelfrequentie

Uw toepassing kan een query uitvoeren op de frequentie van de GPU-tijdstempel per opdrachtwachtrij (raadpleeg de methode ID3D12CommandQueue::GetTimestampFrequency ).

De geretourneerde frequentie wordt gemeten in Hz (tikken per seconde). Als de opgegeven opdrachtwachtrij geen tijdstempels ondersteunt (zie de tabel in de sectie Query's), mislukt deze API (en retourneert E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT en D3D12_COMMAND_LIST_TYPE_COMPUTE altijd tijdstempels ondersteunen. D3D12_COMMAND_LIST_TYPE_COPY ondersteunt optioneel tijdstempels als het lid D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupportedTRUE is.

Kalibratie van tijdstempels

Met D3D12 kunnen toepassingen resultaten die zijn verkregen uit tijdstempelquery's correleren met resultaten die zijn verkregen bij het aanroepen QueryPerformanceCounter. Dit is ingeschakeld door de aanroep ID3D12CommandQueue::GetClockCalibration.

De GPU legt een tijdstempel vast op het moment dat deze gereed is met alle voorgaande werklast. Het is hetzelfde gedrag dat door Direct3D 11 wordt aangenomen (zie D3D11_QUERY_TIMESTAMP in de Functionele Specificatie van Direct3D 11.3 op GitHub). Dat betekent dat tijdstempelquery's in Direct3D 12 een bottom-of-pipe (BOP)-bewerking zijn.

GetClockCalibration bemonstert de GPU-timestampteller voor een bepaalde opdrachtwachtrij en bemonstert de CPU-teller via QueryPerformanceCounter vrijwel tegelijkertijd. Deze API mislukt opnieuw (retourneert E_FAIL) als de opgegeven opdrachtwachtrij geen tijdstempels ondersteunt (zie de tabel in het onderwerp Query's).

Houd er rekening mee dat GPU- en CPU-tijdstempeltellers niet noodzakelijkerwijs rechtstreeks zijn gerelateerd aan de kloksnelheid van deze processors, maar in plaats daarvan werken vanaf tijdstempeltekens.

Warning

De tijdstempelklokken van de GPU kunnen op sommige hardware stoppen met lopen wanneer de GPU inactief is, waardoor de correlatie kan wegdriften. U kunt dit voorkomen door id3D12Device::SetStablePowerState aan te roepen tijdens de ontwikkeling (hiervoor is de ontwikkelaarsmodus ingeschakeld).

Tijdstempelqueries

U kunt tijdstempels verkrijgen als onderdeel van een opdrachtlijst (in plaats van een CPU-aanroep in een opdrachtwachtrij) via tijdstempelquery's. (Zie Query's voor meer informatie over query's in het algemeen).

Alle tijdstempelquery's gebruiken het type D3D12_QUERY_TYPE_TIMESTAMP voor de werkelijke query. Vanwege hardwarebeperkingen gebruiken D3D12_COMMAND_LIST_TYPE_DIRECT en D3D12_COMMAND_LIST_TYPE_COMPUTE echter een ander D3D12_QUERY_HEAP_TYPE dan het type dat D3D12_COMMAND_LIST_TYPE_COPY gebruikt.

Direct- en compute-wachtrijen maken gebruik van D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Kopieerwachtrijen maken gebruik van D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Query's voor de kopieerwachtrij worden alleen ondersteund als het lid D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported de waarde TRUE heeft.

Tijdstempelquery’s leveren, zodra ze zijn opgelost met ID3D12GraphicsCommandList::ResolveQueryData, een UINT64-waarde op die ticks vertegenwoordigt, net als geretourneerd door ID3D12CommandQueue::GetClockCalibration, en moeten daarom door de queuefrequentie worden gedeeld om de duur in seconden te berekenen.

Important

Voor een nauwkeurige berekening gebruikt u drijvendekomma-aritmetiek bij het berekenen van tijdstempelintervallen in seconden of milliseconden. Gebruik bijvoorbeeld queriedTicks / (double)Frequency in plaats van queriedTicks / Frequency.

Tellers en query’s

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Prestatiemeting