Zarządzanie czasem (grafika Direct3D 12)

W tej sekcji opisano wykonywanie zapytań dotyczących sygnatur czasowych oraz kalibrowanie liczników sygnatur czasowych procesora GPU i procesora CPU.

Wskazówka

W przypadku interaktywnego profilowania procesora GPU i analizy chronometrażu klatek użyj formatu PIX dla Windows. PIX zapewnia widoki przechwytywania GPU, przechwytywania pomiarów czasu oraz monitora systemowego, które wizualnie pokazują korelację pracy CPU i GPU, dlatego jest zalecanym punktem wyjścia przed napisaniem niestandardowej infrastruktury zapytań o znaczniki czasu. DirectX 12 Agility SDK zapewnia dostęp do najnowszych funkcji modułu wykonawczego na potrzeby profilowania i diagnostyki, niezależnie od wersji systemu operacyjnego.

Częstotliwość znacznika czasu

Aplikacja może wykonywać zapytania dotyczące częstotliwości znacznika czasowego procesora GPU dla każdej kolejki poleceń z osobna (zapoznaj się z metodą ID3D12CommandQueue::GetTimestampFrequency).

Zwracana częstotliwość jest mierzona w Hz (cykli/s). Jeśli określona kolejka poleceń nie obsługuje sygnatur czasowych (zobacz tabelę w sekcji Queries), ten interfejs API kończy się niepowodzeniem (i zwraca E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT i D3D12_COMMAND_LIST_TYPE_COMPUTE zawsze obsługują znaczniki czasu. D3D12_COMMAND_LIST_TYPE_COPY opcjonalnie obsługuje znaczniki czasu, jeśli członek D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported jest TRUE.

Kalibracja znacznika czasu

D3D12 umożliwia aplikacjom korelowanie wyników uzyskanych z zapytań sygnatur czasowych z wynikami uzyskanymi z wywołania QueryPerformanceCounter. Jest to włączone przez wywołanie ID3D12CommandQueue::GetClockCalibration.

Znacznik czasu jest pobierany przez procesor GPU w momencie, gdy GPU ukończy wszystkie poprzednie zadania. Jest to to samo zachowanie przyjęte przez direct3D 11 (zobacz D3D11_QUERY_TIMESTAMP w specyfikacji funkcjonalnej Direct3D 11.3 w usłudze GitHub). Oznacza to, że zapytania znacznika czasowego są operacją u dołu potoku (BOP) w Direct3D 12.

GetClockCalibration próbuje pobrać próbki licznika czasu GPU dla danej kolejki poleceń i pobiera próbki licznika czasu CPU za pośrednictwem QueryPerformanceCounter w niemal tym samym czasie. Ponownie ten interfejs API kończy się niepowodzeniem (zwracanie E_FAIL), jeśli określona kolejka poleceń nie obsługuje sygnatur czasowych (zobacz tabelę w temacie zapytań).

Należy pamiętać, że liczniki znaczników czasu procesorów GPU i CPU nie muszą być bezpośrednio związane z częstotliwością taktowania tych procesorów, lecz działają na podstawie odczytów znaczników czasu.

Warning

Zegary znaczników czasu GPU mogą przestać tykać na niektórych urządzeniach, gdy GPU jest bezczynny, więc korelacja może dryfować. Aby temu zapobiec, wywołaj metodę ID3D12Device::SetStablePowerState podczas programowania (wymaga włączenia trybu dewelopera).

Zapytania znaczników czasu

Znaczniki czasu można uzyskać w ramach listy poleceń (zamiast wywołania po stronie procesora CPU w kolejce poleceń) za pośrednictwem zapytań znacznika czasu. (Aby uzyskać więcej informacji na temat zapytań, zobacz Zapytania).

Wszystkie zapytania znacznika czasu wykorzystują typ D3D12_QUERY_TYPE_TIMESTAMP do rzeczywistego zapytania. Jednak ze względu na ograniczenia sprzętu D3D12_COMMAND_LIST_TYPE_DIRECT i D3D12_COMMAND_LIST_TYPE_COMPUTE używają innego D3D12_QUERY_HEAP_TYPE niż ten używany przez D3D12_COMMAND_LIST_TYPE_COPY.

Kolejki bezpośrednie i obliczeniowe używają D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Kolejki kopiowania używają D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Zapytania kolejki kopiowania są obsługiwane tylko wtedy, gdy element członkowski D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported jest true.

Zapytania sygnatury czasowej, po rozwiązaniu za pośrednictwem ID3D12GraphicsCommandList::ResolveQueryData, są UINT64, które reprezentują znaczniki, jak jest zwracane przez ID3D12CommandQueue::GetClockCalibration, i jako takie muszą być podzielone przez częstotliwość kolejki, aby uzyskać długość w sekundach.

Ważny

Aby uzyskać dokładność, użyj arytmetyki zmiennoprzecinkowych podczas obliczania interwałów sekund lub milisekund sygnatur czasowych. Na przykład użyj queriedTicks / (double)Frequency zamiast queriedTicks / Frequency.

liczniki i zapytania

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

pomiar wydajności