Partilhar via


Preempção de GPU

Um modelo de preempção de GPU mais recente estava disponível a partir do Windows 8. Nesse modelo, o sistema operacional não permite mais que a preempção de pacotes de DMA (acesso direto à memória) de GPU seja desabilitada e garante que as solicitações de preempção sejam enviadas para a GPU antes que um processo de TDR (Detecção e Recuperação de Tempo limite) seja iniciado.

Requisito Descrição
Versão mínima do WDDM (Modelo de Driver de Exibição do Windows) 1,2
Versão mínima do Windows 8
Implementação do driver – elementos gráficos completos e somente Renderização Obrigatório
Requisitos e testes da WHLK Device.Graphics... Teste de preempção, Device.Graphics... FlipOnVSyncMmIo

Se pacotes de longa execução não puderem ser preemptos com êxito, o trabalho de GPU de alta prioridade, como o trabalho exigido pelo DWM (Gerenciador de Janelas da Área de Trabalho), poderá ser adiado, resultando em falhas durante transições e animações de janela. Além disso, pacotes de GPU de longa execução que não podem ser preemptados podem fazer com que um processo TDR redefina repetidamente a GPU e, eventualmente, uma verificação de bugs do sistema possa ocorrer.

Nota Todos os drivers de miniporto de exibição do WDDM 1.2 devem dar suporte ao modelo de preempção Windows 8. No entanto, quando em operação, os drivers WDDM 1.2 também podem rejeitar o modelo de preempção Windows 8 e manter o comportamento do Windows 7 pelo agendador de subsistema de kernel de elementos gráficos do Microsoft DirectX.

DDIs (interfaces de driver de dispositivo de preempção) de GPU

As DDIs (interfaces de driver de dispositivo) a seguir estão disponíveis para o driver de miniporto de exibição implementar o modelo de preempção de GPU Windows 8.

Exibir implementação do driver de miniporte

Siga estas etapas gerais para implementar o modelo de preempção de GPU Windows 8 no driver de miniporto de exibição:

  1. Compile seu driver em relação a cabeçalhos que têm DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
  2. Declare suporte para o modelo de preempção de GPU Windows 8 definindo os membros PreemptionAware e MultiEngineAware da estrutura de DXGK_VIDSCHCAPS como 1. Para dar suporte ao modelo de preempção do Windows 7, defina PreemptionAware como zero.
  3. Especifique o nível de granularidade de preempção com suporte na estrutura D3DKMDT_PREEMPTION_CAPS , que usa valores constantes das enumerações D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY e D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY .
  4. Se o hardware der suporte à alternância de contexto lenta, envie um buffer de comprimento zero para a função DxgkDdiSubmitCommand e defina o membro pSubmitCommand-Flags-ContextSwitch>> como 1. Observe a discussão no membro ContextSwitch da estrutura DXGK_SUBMITCOMMANDFLAGS .
  5. Defina alocações de contexto de GPU e alocações de contexto do dispositivo chamando a função DxgkCbCreateContextAllocation . Observe as instruções e restrições específicas fornecidas em Comentários para a função.
  6. Chame a função DxgkCbDestroyContextAllocation para destruir alocações de contexto de GPU e alocações de contexto do dispositivo que foram criadas com DxgkCbCreateContextAllocation.
  7. Ao preparar o buffer DMA em resposta a uma chamada para a função DxgkDdiBuildPagingBuffer , inicialize o recurso de contexto preenchendo a estrutura interna InitContextResource dentro da estrutura DXGKARG_BUILDPAGINGBUFFER . Se os recursos de contexto forem removidos ou realocados, o gerenciador de memória de vídeo preservará o conteúdo dos recursos de contexto.
  8. O driver deve dar suporte à inversão de E/S mapeada pela memória na próxima sincronização vertical. Em Windows 8, o agendador de GPU tenta preempitar o hardware mesmo se as versões invertidas estiverem pendentes. Portanto, para evitar rasgar e renderizar artefatos, o driver deve dar suporte ao modelo de inversão de E/S mapeado pela memória e deve definir o membro FlipOnVSyncMmIo da estrutura DXGK_FLIPCAPS como 1 e dar suporte às operações descritas em FlipOnVSyncMmIo.

Considerações sobre mapeamento de memória em sua implementação

Crie um driver robusto que dê suporte ao modelo de preempção de GPU Windows 8 e forneça uma experiência de usuário de qualidade seguindo estas diretrizes:

  • Solicite a preempção de buffer de DMA médio da GPU quando o agendador do kernel de elementos gráficos DirectX (Dxgkrnl) envia um comando de preempção. Os dispositivos de hardware que têm uma granularidade mais fina de preempção de buffer de DMA médio devem produzir uma melhor experiência do cliente.
  • Permitir que as IDs de cerca de comando de paginação sejam reutilizados: se uma solicitação de preempção resultou na preempção de comandos de paginação na fila de hardware, o agendador Dxgkrnl reenviará comandos de paginação preemptados com as mesmas IDs de cerca que foram originalmente usadas para eles, e os comandos de paginação serão agendados antes de quaisquer outros comandos nesse mecanismo. Comandos não paginação serão reenviados com IDs de cerca recém-atribuídas.
  • Forneça uma lista de locais de patch para buffers de DMA divididos— consulte Divisão de um buffer de DMA.
  • Um modo de verificação, chamado de detecção de vazamento de associação, está disponível que percorre a lista de locais de patch e rejeita pacotes que não são desassociados ou que não reprogramam alocações para cada pacote dividido. Alguns hardwares dão suporte a endereços virtuais, permitindo um nível extra de indireção que pode tornar essa verificação desnecessária. Nesse caso, para indicar que o driver recusa o modo de verificação, defina o membro NoDmaPatching da estrutura DXGK_VIDSCHCAPS como 1.
  • No Windows 7, o agendador Dxgkrnl garante que todos os pacotes DMA divididos que correspondem ao mesmo comando de renderização sejam executados sequencialmente sem alternar para outro contexto de renderização. No modelo de preempção Windows 8, o agendador pode executar pacotes de renderização de um contexto diferente entre dois pacotes divididos que correspondem ao mesmo comando de renderização. Como consequência, os drivers que estão cientes da preempção devem lidar com um envio de pacote de DMA dividido/parcial da mesma forma que um envio de pacote completo regular. Em particular, o estado de GPU deve ser salvo ou restaurado no limite para esses envios.
  • Um driver com reconhecimento de preempção não deve alterar o conteúdo de um buffer de DMA dividido quando é transmitido para vários adaptadores no modo LDA (adaptador de exibição vinculado), em que várias GPUs físicas são vinculadas para formar uma GPU virtual única, mais rápida. Isso ocorre porque, no modelo de preempção Windows 8, o agendador Dxgkrnl não garante mais a execução síncrona de uma sequência de pacotes divididos sem alternar para outro contexto. Um driver que alterou o conteúdo de um pacote DMA dividido comprometeria a integridade dos dados do pacote porque, se o pacote fosse executado em outro mecanismo, ele operaria na mesma cópia dos dados do buffer de DMA.
  • No modelo de preempção de GPU Windows 8, o agendador Dxgkrnl habilita a preempção para pacotes que associaram primitivos de sincronização "signal on submit". Se um dispositivo usa primitivos de sincronização "signal on submit" em conjunto com estados de espera baseados em hardware, ele deve dar suporte à capacidade de antecipar uma instrução de espera antes que a condição de espera seja atendida.

Requisitos de certificação de hardware

Para obter informações sobre os requisitos que os dispositivos de hardware devem atender ao implementar esse recurso, consulte a documentação relevante do WHCK em Device.Graphics... Teste de preempção e Device.Graphics... FlipOnVSyncMmIo.

Consulte Recursos do WDDM 1.2 para obter uma revisão dos recursos adicionados com Windows 8.