Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tej sekcji opisano wykonywanie zapytań dotyczących sygnatur czasowych oraz kalibrowanie liczników sygnatur czasowych procesora GPU i procesora CPU.
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.
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.