Timing (Direct3D 12-Grafiken)
In diesem Abschnitt werden das Abfragen von Zeitstempeln und das Kalibrieren der GPU- und CPU-Zeitstempelindikatoren behandelt.
Ihre Anwendung kann die GPU-Zeitstempelhäufigkeit pro Befehlswarteschlange abfragen (siehe ID3D12CommandQueue::GetTimestampFrequency-Methode ).
Die zurückgegebene Frequenz wird in Hz (Ticks/s) gemessen. Wenn die angegebene Befehlswarteschlange keine Zeitstempel unterstützt (siehe Tabelle im Abschnitt Abfragen ), schlägt diese API fehl (und gibt E_FAIL zurück). D3D12_COMMAND_LIST_TYPE_DIRECT und D3D12_COMMAND_LIST_TYPE_COMPUTE unterstützen immer Zeitstempel. D3D12_COMMAND_LIST_TYPE_COPY unterstützt optional Zeitstempel, wenn das element D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupportedTRUE ist.
D3D12 ermöglicht Anwendungen das Korrelieren von Ergebnissen, die aus Zeitstempelabfragen abgerufen wurden, mit Ergebnissen, die beim Aufrufen QueryPerformanceCounter
von abgerufen wurden. Dies wird durch den Aufruf ID3D12CommandQueue::GetClockCalibration aktiviert.
Ein Zeitstempel wird von der GPU in dem Moment abgetastet, in dem die GPU mit der gesamten vorherigen Workload abgeschlossen ist. Es ist das gleiche Verhalten, das von Direct3D 11 übernommen wird (siehe D3D11_QUERY_TIMESTAMP in der Direct3D 11.3-Funktionsspezifikation auf GitHub). Das bedeutet, dass Zeitstempelabfragen ein BOP-Vorgang (Bottom-of-Pipe) in Direct3D 12 sind.
GetClockCalibration sucht den GPU-Zeitstempelzähler für eine bestimmte Befehlswarteschlange und den CPU-Leistungsindikator QueryPerformanceCounter
über fast gleichzeitig. Auch diese API schlägt fehl (gibt E_FAIL zurück), wenn die angegebene Befehlswarteschlange keine Zeitstempel unterstützt (siehe Tabelle im Thema Abfragen ).
Beachten Sie, dass GPU- und CPU-Zeitstempelzähler nicht notwendigerweise direkt mit der Taktgeschwindigkeit dieser Prozessoren zusammenhängen, sondern stattdessen mit Zeitstempel-Ticks arbeiten.
Sie können Zeitstempel als Teil einer Befehlsliste (anstelle eines CPU-seitigen Aufrufs in einer Befehlswarteschlange) über Zeitstempelabfragen abrufen. ( Weitere Informationen zu Abfragen im Allgemeinen finden Sie unter Abfragen.
Alle Zeitstempelabfragen verwenden den Typ D3D12_QUERY_TYPE_TIMESTAMP für die tatsächliche Abfrage. Aufgrund von Hardwarebeschränkungen verwenden D3D12_COMMAND_LIST_TYPE_DIRECT und D3D12_COMMAND_LIST_TYPE_COMPUTE jedoch eine andere D3D12_QUERY_HEAP_TYPE als die , die D3D12_COMMAND_LIST_TYPE_COPY verwendet.
Direkte Warteschlangen und Computewarteschlangen verwenden D3D12_QUERY_HEAP_TYPE_TIMESTAMP.
Kopierwarteschlangen verwenden D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.
Kopierwarteschlangenabfragen werden nur unterstützt, wenn das D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported-ElementTRUE ist.
Timestamp-Abfragen, die über ID3D12GraphicsCommandList::ResolveQueryData aufgelöst wurden, sind ein UINT64 , der Teilstriche darstellt, wie von ID3D12CommandQueue::GetClockCalibration zurückgegeben wird, und muss daher durch die Warteschlangenhäufigkeit geteilt werden, um die Länge in Sekunden zu erhalten.
Wichtig
Verwenden Sie für die Genauigkeit Gleitkommaarithmetik beim Berechnen von Sekunden- oder Millisekundenintervallen von Zeitstempeln. Verwende z. B. queriedTicks / (double)Frequency
statt queriedTicks / Frequency
.