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 visualizações de captura da GPU, captura de temporização e monitor do sistema que correlacionam visualmente as atividades da CPU e da GPU, tornando-o o ponto de partida recomendado antes de criar uma infraestrutura personalizada de consultas de timestamp. 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 oferece suporte opcional a marcas de tempo se o membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported for TRUE.
Calibração de carimbo de data e 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 timestamp são uma operação de final de pipeline (BOP) 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 timestamp da GPU e da CPU não estão necessariamente relacionados de forma direta à frequência de clock desses processadores, mas funcionam, em vez disso, com base em ticks de timestamp.
Consultas de marca temporal
Você pode obter marcas de tempo como parte de uma lista de comandos (em vez de uma chamada feita no lado da CPU em uma fila de comandos) por meio de consultas de marca de tempo. (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 de fila de cópia só têm suporte se o membro D3D12_FEATURE_DATA_D3D12_OPTIONS3::CopyQueueTimestampQueriesSupported for TRUE.
As consultas de timestamp, uma vez resolvidas por ID3D12GraphicsCommandList::ResolveQueryData, resultam em um UINT64 que representa tiques, assim como retornado por ID3D12CommandQueue::GetClockCalibration, e, como tal, ele 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.
Aviso
A frequência de timestamp da GPU pode variar em alguns tipos de hardware sob ajuste dinâmico da frequência do clock. Sempre consulte a frequência novamente próximo do momento em que as marcas de tempo forem resolvidas e evite armazenar em cache o valor da frequência por longos períodos. Para obter resultados estáveis de criação de perfil, chame ID3D12Device::SetStablePowerState durante o desenvolvimento (requer o Modo de Desenvolvedor habilitado).