Интервал времени (графика Direct3D 12)

В этом разделе рассматриваются запросы меток времени и калибровка счетчиков меток времени GPU и ЦП.

Частота метки времени

Приложение может запрашивать частоту метки времени GPU для каждой очереди команд (см. метод ID3D12CommandQueue::GetTimestampFrequency ).

Возвращаемая частота измеряется в Гц (тактов/с). Если указанная очередь команд не поддерживает метки времени (см. таблицу в разделе Запросы ), этот API завершается ошибкой (и возвращает E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT и D3D12_COMMAND_LIST_TYPE_COMPUTE всегда поддерживают метки времени. D3D12_COMMAND_LIST_TYPE_COPY при необходимости поддерживает метки времени, если элемент D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported имеет значение TRUE.

Калибровка метки времени

D3D12 позволяет приложениям сопоставлять результаты, полученные из запросов меток времени, с результатами, полученными при вызове QueryPerformanceCounter. Это включается вызовом ID3D12CommandQueue::GetClockCalibration.

Выборка метки времени выполняется gpuом в момент завершения работы gpu со всеми предыдущими рабочими нагрузками. Это то же поведение, что и Direct3D 11 (см. D3D11_QUERY_TIMESTAMP в функциональной спецификации Direct3D 11.3 на GitHub). Это означает, что запросы меток времени являются операцией BOP в Direct3D 12.

GetClockCalibration выполняет выборку счетчика меток времени GPU для заданной очереди команд и выполняет выборку счетчика QueryPerformanceCounter ЦП практически в одно и то же время. Снова этот API завершается ошибкой (возвращает E_FAIL), если указанная очередь команд не поддерживает метки времени (см. таблицу в разделе Запросы ).

Обратите внимание, что счетчики меток времени GPU и ЦП не обязательно напрямую связаны с тактовой частотой этих процессоров, а работают на основе меток времени.

Запросы меток времени

Метки времени можно получить как часть списка команд (а не вызова на стороне ЦП в очереди команд) с помощью запросов меток времени. (Дополнительные сведения о запросах в целом см. в разделе Запросы .

Все запросы меток времени используют тип D3D12_QUERY_TYPE_TIMESTAMP для фактического запроса. Однако из-за аппаратных ограничений D3D12_COMMAND_LIST_TYPE_DIRECT и D3D12_COMMAND_LIST_TYPE_COMPUTE использовать D3D12_QUERY_HEAP_TYPE, отличные от D3D12_COMMAND_LIST_TYPE_COPY.

Прямые и вычислительные очереди используют D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Очереди копирования используют D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Запросы очереди копирования поддерживаются, только если элемент D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported имеет значение TRUE.

Запросы меток времени, после разрешения с помощью ID3D12GraphicsCommandList::ResolveQueryData, представляют собой такты, возвращаемые ID3D12CommandQueue::GetClockCalibration, и поэтому они должны быть разделены на частоту очереди, чтобы получить длину в секундах.

Важно!

Для точности используйте арифметику с плавающей запятой при вычислении интервалов секунд или миллисекунд меток времени. Например, используйте queriedTicks / (double)Frequency вместо queriedTicks / Frequency.

Счетчики и запросы

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Измерение производительности