Compartir a través de


Tiempo (gráficos Direct3D 12)

En esta sección se tratan las marcas de tiempo de consulta y la calibración de los contadores de marca de tiempo de GPU y CPU.

Frecuencia de marca de tiempo

La aplicación puede consultar la frecuencia de marca de tiempo de GPU según una cola por comando (consulte el método ID3D12CommandQueue::GetTimestampFrequency ).

La frecuencia devuelta se mide en Hz (tics/s). Si la cola de comandos especificada no admite marcas de tiempo (vea la tabla en la sección Consultas ), se produce un error en esta API (y devuelve E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT y D3D12_COMMAND_LIST_TYPE_COMPUTE siempre admiten marcas de tiempo. D3D12_COMMAND_LIST_TYPE_COPY opcionalmente admite marcas de tiempo si el miembro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported es TRUE.

Calibración de marca de tiempo

D3D12 permite a las aplicaciones correlacionar los resultados obtenidos a partir de consultas de marca de tiempo con los resultados obtenidos de la llamada a QueryPerformanceCounter. Esto está habilitado por la llamada ID3D12CommandQueue::GetClockCalibration.

La GPU muestrea una marca de tiempo en el momento en que la GPU ha terminado con toda la carga de trabajo anterior. Es el mismo comportamiento adoptado por Direct3D 11 (consulte D3D11_QUERY_TIMESTAMP en la especificación funcional de Direct3D 11.3 en GitHub). Esto significa que las consultas de marca de tiempo son una operación de canalización inferior (BOP) en Direct3D 12.

GetClockCalibration muestra el contador de marca de tiempo de GPU para una cola de comandos determinada y muestra el contador de CPU a través QueryPerformanceCounter de casi al mismo tiempo. De nuevo se produce un error en esta API (devolviendo E_FAIL) si la cola de comandos especificada no admite marcas de tiempo (consulte la tabla del tema Consultas ).

Tenga en cuenta que los contadores de marca de tiempo de GPU y CPU no están necesariamente relacionados directamente con la velocidad del reloj de estos procesadores, sino que funcionan a partir de tics de marca de tiempo.

Consultas de marca de tiempo

Puede obtener marcas de tiempo como parte de una lista de comandos (en lugar de una llamada del lado cpu en una cola de comandos) a través de consultas de marca de tiempo. (Consulte Consultas para obtener más información sobre las consultas en general).

Todas las consultas de marca de tiempo usan el tipo D3D12_QUERY_TYPE_TIMESTAMP para la consulta real. Sin embargo, debido a las limitaciones de hardware, D3D12_COMMAND_LIST_TYPE_DIRECT y D3D12_COMMAND_LIST_TYPE_COMPUTE usan un D3D12_QUERY_HEAP_TYPE diferente del que usa D3D12_COMMAND_LIST_TYPE_COPY .

Las colas directas y de proceso usan D3D12_QUERY_HEAP_TYPE_TIMESTAMP.

Las colas de copia usan D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.

Las consultas de cola de copia solo se admiten si el miembro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported es TRUE.

Las consultas de marca de tiempo, una vez resueltas a través de ID3D12GraphicsCommandList::ResolveQueryData, son un UINT64 que representa tics, tal como lo devuelve ID3D12CommandQueue::GetClockCalibration y, por tanto, debe dividirse por la frecuencia de la cola para obtener la longitud en segundos.

Importante

Para obtener precisión, use aritmética de punto flotante al calcular intervalos de segundo o milisegundos de marcas de tiempo. Por ejemplo, use queriedTicks / (double)Frequency en lugar de queriedTicks / Frequency.

Contadores y consultas

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Medición del rendimiento