Compartilhar via


Monitoramento de contexto

Este artigo fornece informações sobre o monitoramento de contexto, que permite a sincronização flexível entre mecanismos de GPU ou entre núcleos de CPU e mecanismos de GPU. Um objeto de cerca monitorado, que é uma forma avançada de sincronização de cerca, permite que um núcleo de CPU ou um mecanismo de GPU sinalize ou aguarde em um objeto de cerca específico.

Criação de cerca monitorada

O runtime do Direct3D cria um objeto fence monitorado chamando o retorno de chamada CreateSynchronizationObjectCb do driver do modo de usuário com o tipo de objeto de sincronização do D3DDDI_MONITORED_FENCE .

Um objeto de cerca monitorado é criado junto com os seguintes atributos:

  • Valor inicial
  • Sinalizadores (especificando seu comportamento de espera e sinalização)

Após a criação, o kernel gráfico retorna um objeto fence composto pelos seguintes itens:

Item Descrição
hSyncObject Manipule para o objeto de sincronização. Usado para fazer referência a ele em uma chamada para o kernel de elementos gráficos.
FenceValueCPUVirtualAddress Mapeamento somente leitura do valor de cerca (64 bits) para a CPU. Esse endereço é mapeado WB (em cache) do ponto de vista da CPU em plataformas que dão suporte à coerência de E/S, UC (não armazenada em cache) em outras plataformas. Permite que a CPU acompanhe o progresso da cerca apenas lendo esse local de memória. A CPU não tem permissão para gravar nesse local de memória. Para sinalizar a cerca, a CPU é necessária para chamar o SignalSynchronizationObjectFromCpuCb. Os adaptadores que dão suporte ao IoMmu devem usar esse endereço para acesso à GPU. O endereço é mapeado como leitura-gravação neste caso.
FenceValueGPUVirtualAddress Mapeamento de leitura/gravação do valor de cerca (64 bits) para a GPU. Esse endereço é mapeado como exigindo coerência de E/S em plataformas que dão suporte a ele. Para sinalizar a cerca, a GPU tem permissão para gravar diretamente nesse endereço virtual de GPU. As GPUs IoMmu não devem usar esse endereço.

O valor de cerca é um valor de 64 bits com seus respectivos endereços virtuais alinhados em um limite de 64 bits. As GPUs devem declarar se são capazes de atualizar atomicamente valores de 64 bits como visíveis pela CPU por meio do sinalizador DXGK_VIDSCHCAPS::No64BitAtomics adicionado. Se uma GPU for capaz de atualizar apenas valores de 32 bits atomicamente, o sistema operacional manipulará a solução alternativa de cerca automaticamente. No entanto, ele coloca uma restrição de que os valores pendentes de espera e cerca de sinal não podem estar mais do que UINT_MAX/2 longe do último valor de cerca sinalizado.

Sinal de GPU

Se um mecanismo de GPU não for capaz de gravar em uma cerca monitorada usando seu endereço virtual, o driver de modo de usuário (UMD) usará o retorno de chamada SignalSynchronizationObjectFromGpuCb para enfileirar um pacote de sinal de software para o contexto de GPU.

Para sinalizar a cerca da GPU, o UMD insere um comando de gravação de cerca em um fluxo de comando de contexto diretamente sem passar pelo modo kernel. O mecanismo pelo qual o kernel monitora o progresso da cerca varia dependendo se um mecanismo de GPU específico dá suporte à implementação básica ou avançada da cerca monitorada.

Quando um buffer de comando conclui a execução na GPU, o kernel gráfico:

  • Passa pela lista de objetos de cerca com esperas pendentes que podem ser sinalizadas para esse processo
  • Lê o valor da cerca atual
  • Determina se há esperas que precisam ser desfeitos.

Espera de GPU

Para aguardar em uma cerca monitorada em um mecanismo de GPU, o UMD primeiro precisa liberar seu buffer de comando pendente e, em seguida, chamar WaitForSynchronizationObjectFromGpuCb especificando o objeto fence (hSyncObject) e o valor da cerca que está sendo esperado. O kernel gráfico enfileira a dependência para seu banco de dados interno e retorna imediatamente para o UMD para que ele possa continuar a enfileirar o trabalho por trás da operação de espera. Os buffers de comando enviados após a operação de espera não são agendados para execução até que a operação de espera seja atendida.

Sinal de CPU

O retorno de chamada SignalSynchronizationObjectFromCpuCb foi adicionado para permitir que a CPU sinalize um objeto de cerca monitorado. Quando a CPU sinaliza um objeto de cerca monitorado, o kernel gráfico atualiza o local da memória de cerca com o valor sinalizado. Esse valor torna-se imediatamente visível para qualquer leitor de modo de usuário e imediatamente cancela as esperas atendidas.

Espera da CPU

Um retorno de chamada WaitForSynchronizationObjectFromCpuCb foi adicionado para permitir que a CPU aguarde em um objeto de cerca monitorado. Duas formas de operações de espera estão disponíveis. No primeiro formulário, WaitForSynchronizationObjectFromCpuCb bloqueia até que a espera seja atendida. No segundo formulário, WaitForSynchronizationObjectFromCpuCb leva um identificador para um evento de CPU que é sinalizado depois que a condição de espera é atendida.