Temporización (gráficos de 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.

Tip

Para la generación de perfiles interactiva de GPU y el análisis de intervalos de fotogramas, use PIX para Windows. PIX proporciona vistas de captura de GPU, captura de tiempo y monitor del sistema que correlacionan visualmente el trabajo de CPU y GPU, lo que lo convierte en el punto de partida recomendado antes de escribir una infraestructura de consulta de marca de tiempo personalizada. El SDK de agilidad de DirectX 12 garantiza que tiene las características en tiempo de ejecución más recientes disponibles para la generación de perfiles y el diagnóstico, independientemente de la versión del sistema operativo.

Frecuencia de marca de tiempo

La aplicación puede consultar la frecuencia de las marcas de tiempo de la GPU para cada cola de comandos (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 llamar a QueryPerformanceCounter. Esto se habilita mediante la llamada a ID3D12CommandQueue::GetClockCalibration.

La GPU muestrea una marca de tiempo en el momento en que la GPU finaliza 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 lee el contador de marcas de tiempo de la GPU de una cola de comandos determinada y lee el contador de la CPU a través de QueryPerformanceCounter casi al mismo tiempo. De nuevo, esta API produce un error (devolviendo E_FAIL) si la cola de comandos especificada no admite marcas de tiempo (consulte la tabla en el 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.

Warning

Los relojes de marca de tiempo de la GPU pueden dejar de funcionar en algunos dispositivos cuando la GPU está inactiva, por lo que la correlación puede desviarse. Para evitar esto, llame a ID3D12Device::SetStablePowerState durante el desarrollo (requiere el modo de desarrollador habilitado).

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) mediante consultas de marcas 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 D3D12_COMMAND_LIST_TYPE_COPY usa.

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 marcas, tal como devuelve ID3D12CommandQueue::GetClockCalibration y, como tal, deben dividirse por la frecuencia de la cola para obtener la duración en segundos.

Importante

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

Contadores y consultas

ID3D12Device::SetStablePowerState

ID3D12Object::SetName

ID3DUserDefinedAnnotation

Medición del rendimiento