Zeitsteuerung (Direct3D 12-Grafik)

In diesem Abschnitt werden Die Abfragen von Zeitstempeln sowie das Kalibrieren der GPU- und CPU-Zeitstempelzähler behandelt.

Tip

Verwenden Sie PIX für Windows für interaktive GPU-Profilerstellung und Frame-Timing-Analyse. PIX bietet GPU-Aufzeichnungen, Zeitaufzeichnungen und Systemmonitoransichten, die die Arbeit von CPU und GPU visuell miteinander in Beziehung setzen, und ist damit der empfohlene Ausgangspunkt, bevor Sie eine benutzerdefinierte Infrastruktur für Zeitstempelabfragen implementieren. Das DirectX 12 Agility SDK stellt sicher, dass Sie unabhängig von der Betriebssystemversion über die neuesten Laufzeitfeatures für Profilerstellung und Diagnose verfügen.

Zeitstempelhäufigkeit

Ihre Anwendung kann die GPU-Zeitstempelhäufigkeit auf Basis der einzelnen Befehlswarteschlangen abfragen (siehe ID3D12CommandQueue::GetTimestampFrequency-Methode).

Die zurückgegebene Frequenz wird in Hz gemessen (Ticks/Sek.). Wenn die angegebene Befehlswarteschlange zeitstempel nicht 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 D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported-Member TRUE ist.

Zeitstempelkalibrierung

D3D12 ermöglicht es Anwendungen, mit Zeitstempelabfragen erhaltene Ergebnisse mit Ergebnissen zu korrelieren, die durch Aufrufen von QueryPerformanceCounter erhalten werden. Dies wird durch den Aufruf ID3D12CommandQueue::GetClockCalibration aktiviert.

Ein Zeitstempel wird von der GPU in dem Moment erfasst, in dem die GPU die gesamte vorhergehende Workload abgeschlossen hat. Es ist das gleiche Verhalten, das von Direct3D 11 übernommen wurde (siehe D3D11_QUERY_TIMESTAMP in der Direct3D 11.3-Funktionalen Spezifikation für GitHub). Das bedeutet, dass Zeitstempelabfragen in Direct3D 12 eine Bottom-of-Pipe (BOP) Operation sind.

GetClockCalibration erfasst den GPU-Zeitstempelzähler für eine bestimmte Befehlswarteschlange und den CPU-Zähler über QueryPerformanceCounter nahezu gleichzeitig. Auch hier schlägt diese API fehl (zurückgeben E_FAIL), wenn die angegebene Befehlswarteschlange keine Zeitstempel unterstützt (siehe Tabelle im Thema "Abfragen ").

Beachten Sie, dass GPU- und CPU-Zeitstempelzähler nicht unbedingt in direktem Zusammenhang mit der Taktfrequenz dieser Prozessoren stehen, sondern stattdessen auf der Grundlage von Zeitstempel-Ticks arbeiten.

Zeitstempelabfragen

Sie können Zeitstempel als Teil einer Befehlsliste (anstelle eines cpuseitigen Aufrufs in einer Befehlswarteschlange) über Zeitstempelabfragen abrufen. (Weitere Informationen zu Abfragen finden Sie unter " Abfragen " im Allgemeinen).

Bei allen Zeitstempelabfragen wird der Typ D3D12_QUERY_TYPE_TIMESTAMP für die tatsächliche Abfrage verwendet. Aufgrund von Hardwareeinschränkungen verwenden D3D12_COMMAND_LIST_TYPE_DIRECT und D3D12_COMMAND_LIST_TYPE_COMPUTE jedoch eine andere D3D12_QUERY_HEAP_TYPE als die D3D12_COMMAND_LIST_TYPE_COPY verwendet.

Direkte und Compute-Warteschlangen verwenden D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Kopierwarteschlangen verwenden D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Abfragen von Kopierwarteschlangen werden nur unterstützt, wenn das D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported Mitglied TRUEist.

Zeitstempel-Abfragen sind, sobald sie über ID3D12GraphicsCommandList::ResolveQueryDataaufgelöst wurden, ein UINT64, das Ticks darstellt, wie es von ID3D12CommandQueue zurückgegeben wird::GetClockCalibrationzurückgegeben wird, und muss als solche durch die Frequenz der Warteschlange geteilt werden, um die Länge in Sekunden zu erhalten.

Important

Für eine genaue Berechnung sollten Sie bei der Berechnung von Sekunden- oder Millisekundenintervallen aus Zeitstempeln Gleitkommaarithmetik verwenden. Verwenden Sie z. B. queriedTicks / (double)Frequency statt queriedTicks / Frequency.

Warnung

Die GPU-Zeitstempelhäufigkeit kann je nach Hardware unter dynamischer Taktskalierung variieren. Fragen Sie die Häufigkeit immer erneut ab, wenn Sie Zeitstempel auflösen, und vermeiden Sie es, den Häufigkeitswert über lange Zeiträume hinweg zwischenzuspeichern. Für stabile Profilerstellungsergebnisse rufen Sie id3D12Device::SetStablePowerState während der Entwicklung auf (erfordert die Aktivierung des Entwicklermodus).

Zähler und Abfragen

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Leistungsmessung