Sdílet prostřednictvím


Časování (grafika Direct3D 12)

Tato část se zabývá dotazováním časových razítek a kalibrací čítačů časového razítka GPU a procesoru.

Frekvence časového razítka

Vaše aplikace může dotazovat frekvenci časového razítka GPU pro jednotlivé fronty příkazů (viz metoda ID3D12CommandQueue::GetTimestampFrequency).

Vrácená frekvence se měří v Hz (tiků/s). Pokud zadaná fronta příkazů nepodporuje časová razítka (viz tabulka v části Dotazy), toto rozhraní API selže (a vrátí E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT a D3D12_COMMAND_LIST_TYPE_COMPUTE vždy podporují časová razítka. D3D12_COMMAND_LIST_TYPE_COPY volitelně podporuje časové razítko, pokud D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported člen je TRUE.

Kalibrace časového razítka

D3D12 umožňuje aplikacím korelovat výsledky získané z dotazů časového razítka s výsledky získanými z volání QueryPerformanceCounter. To je povoleno voláním ID3D12CommandQueue::GetClockCalibration.

Časové razítko je vzorkováno GPU v okamžiku, kdy GPU dokončí všechny předchozí úlohy. Je to stejné chování, které direct3D 11 přijímá (viz D3D11_QUERY_TIMESTAMP ve funkční specifikaci Direct3D 11.3 na GitHubu). To znamená, že dotazy časového razítka jsou operací typu BOP (bottom-of-pipe) v Direct3D 12.

GetClockCalibration vzorkuje čítač časového razítka GPU pro danou frontu příkazů a vzorkuje čítač procesoru prostřednictvím QueryPerformanceCounter téměř ve stejnou dobu. Toto rozhraní API znovu selže (vrací E_FAIL), pokud zadaná fronta příkazů nepodporuje časové razítka (viz tabulka v tématu Dotazy).

Všimněte si, že čítače časových razítek GPU a CPU nemusí nutně přímo souviset s taktovací frekvencí těchto procesorů, ale místo toho pracují z tiků časových razítek.

Dotazy na časová razítka

Časové razítka můžete získat jako součást seznamu příkazů (místo volání na straně procesoru ve frontě příkazů) prostřednictvím dotazů časového razítka. (Pro více informací o dotazech obecně viz dotazy).

Všechny dotazy časového razítka používají typ D3D12_QUERY_TYPE_TIMESTAMP pro skutečný dotaz. Vzhledem k hardwarovým omezením ale D3D12_COMMAND_LIST_TYPE_DIRECT a D3D12_COMMAND_LIST_TYPE_COMPUTE používat jiný D3D12_QUERY_HEAP_TYPE než ten, který D3D12_COMMAND_LIST_TYPE_COPY používá.

Přímé a výpočetní fronty používají D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Fronta pro kopírování používá D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Dotazy fronty kopírování jsou podporovány pouze v případě, že D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported člen je TRUE.

Dotazy časového razítka, jakmile jsou vyřešeny prostřednictvím ID3D12GraphicsCommandList::ResolveQueryData, jsou UINT64, který představuje tiky, jak je vráceno ID3D12CommandQueue::GetClockCalibration, a proto musí být rozděleny podle frekvence fronty, aby získaly délku v sekundách.

Důležitý

Pro přesnost použijte aritmetiku s plovoucí desetinnou čárkou při výpočtu intervalů sekund nebo milisekund časových razítek. Například místo queriedTicks / Frequencypoužijte queriedTicks / (double)Frequency .

Čítače a dotazy

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

měření výkonu