Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Esta seção aborda a consulta de carimbos de data/hora e a calibragem dos contadores de carimbo de data/hora da GPU e da CPU.
Dica
Para perfilamento interativo de GPU e análise de temporização de quadros, use PIX para Windows. O PIX fornece captura de GPU, captura de tempo e visualizações do monitor do sistema que correlacionam visualmente o trabalho da CPU e da GPU, tornando-o o ponto de partida recomendado antes de escrever uma infraestrutura de consulta de carimbo de data/hora personalizada. O SDK de Agilidade do DirectX 12 garante que você tenha os recursos de runtime mais recentes disponíveis para criação de perfil e diagnóstico, independentemente da versão do sistema operacional.
Frequência da marca temporal
Seu aplicativo pode consultar a frequência dos timestamps da GPU por fila de comandos (consulte o método ID3D12CommandQueue::GetTimestampFrequency).
A frequência retornada é medida em Hz (tiques por segundo). Se a fila de comandos especificada não oferecer suporte a carimbos de data/hora (consulte a tabela na seção Consultas ), essa API falhará (e retornará E_FAIL). D3D12_COMMAND_LIST_TYPE_DIRECT e D3D12_COMMAND_LIST_TYPE_COMPUTE sempre oferecem suporte a carimbos de data e hora. D3D12_COMMAND_LIST_TYPE_COPY opcionalmente suporta carimbos de data/hora se o membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported é TRUE.
Calibração de carimbo de data/hora
O D3D12 permite que os aplicativos correlacionem os resultados obtidos por meio de consultas de carimbo de data/hora com os resultados obtidos ao chamar QueryPerformanceCounter. Isso é habilitado pela chamada ID3D12CommandQueue::GetClockCalibration.
Um timestamp é registrado pela GPU no momento em que ela conclui toda a carga de trabalho anterior. É o mesmo comportamento adotado pelo Direct3D 11 (consulte D3D11_QUERY_TIMESTAMP na Especificação Funcional do Direct3D 11.3 em GitHub). Isso significa que as consultas de carimbo de data/hora são uma operação BOP (parte inferior do pipe) no Direct3D 12.
GetClockCalibration obtém uma amostra do contador de timestamp da GPU para uma fila de comandos específica e obtém uma amostra do contador da CPU via QueryPerformanceCounter praticamente ao mesmo tempo. Novamente, essa API falhará (retornando E_FAIL) se a fila de comandos especificada não oferecer suporte a carimbos de data/hora (consulte a tabela no tópico Consultas ).
Observe que os contadores de carimbo de data/hora de GPU e CPU não estão necessariamente diretamente relacionados à velocidade do relógio desses processadores, mas, em vez disso, funcionam a partir de tiques de carimbo de data/hora.
Aviso
Os relógios de carimbo de tempo da GPU podem parar de contar em alguns hardwares quando a GPU está ociosa; portanto, a correlação pode sofrer desvio. Para evitar isso, chame ID3D12Device::SetStablePowerState durante o desenvolvimento (requer o Modo de Desenvolvedor habilitado).
Consultas de marca temporal
Você pode obter carimbos de data/hora como parte de uma lista de comandos (em vez de uma chamada do lado da CPU em uma fila de comandos) por meio de consultas de carimbo de data/hora. (Consulte consultas para obter mais informações sobre consultas em geral).
Todas as consultas de timestamp usam o tipo D3D12_QUERY_TYPE_TIMESTAMP na consulta em si. No entanto, devido a limitações de hardware, D3D12_COMMAND_LIST_TYPE_DIRECT e D3D12_COMMAND_LIST_TYPE_COMPUTE usam um D3D12_QUERY_HEAP_TYPE diferente daquele que D3D12_COMMAND_LIST_TYPE_COPY usa.
As filas diretas e de computação usam D3D12_QUERY_HEAP_TYPE_TIMESTAMP.
As filas de cópia usam D3D12_QUERY_HEAP_TYPE_COPY_QUEUE_TIMESTAMP.
As consultas na fila de cópia são suportadas somente se o membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported for TRUE.
As consultas de carimbo de data/hora, uma vez resolvidas por meio de ID3D12GraphicsCommandList::ResolveQueryData, são um UINT64 que representa ciclos, como é retornado por ID3D12CommandQueue::GetClockCalibration, e, como tal, deve ser dividido pela frequência da fila para obter a duração em segundos.
Importante
Para garantir precisão, use aritmética de ponto flutuante ao calcular intervalos em segundos ou milissegundos de marcas de tempo. Por exemplo, use queriedTicks / (double)Frequency ao invés de queriedTicks / Frequency.