Arquitetura MCDM
O driver de Modelo de driver de computação da Microsoft (MCDM) é uma estrutura projetada para dar suporte a tarefas de computação de alto desempenho em plataformas Windows. Ele fornece uma interface padronizada para o desenvolvimento de drivers que podem usar GPU, NPU e outros recursos de computação para tarefas de processamento paralelo. Os drivers de MCDM são essenciais para aplicativos que exigem poder computacional intensivo, como simulações científicas, análise de dados e aprendizado de máquina.
Este artigo descreve os conceitos de arquitetura de MCDM. Um driver de MCDM, ou driver somente computação, tem um driver de modo kernel (driver .sys) e uma biblioteca de vínculo dinâmico (DLL) no modo de usuário.
Consulte também:
- Visão geral do modelo de driver de computação da Microsoft
- Diretrizes de implementação de driver de modo kernel MCDM
- Fluxo de operação do WDDM
Fila de comando
Uma Fila de Comandos é uma construção DirectCompute usada para o envio de trabalho. O driver é responsável por criar um ou mais Contextos que ele usa para realizar a execução do trabalho enviado. O driver é responsável por transformar o trabalho expresso por meio de chamadas para sua DDI em buffers DMA que, em seguida, ele envia a um Contexto para execução.
Contexto
Um Contexto é uma fila de trabalho computacional enviada por um driver direcionado a um Mecanismo com estado específico da instância. O trabalho computacional é expresso como Buffers DMA que são mantidos em uma Fila SW aguardando envio ao Mecanismo.
Fila SW
Os Buffers DMA enviados para execução em um contexto são mantidos em uma Fila SW. O comprimento de uma Fila SW é limitado apenas por recursos. Há uma associação um-para-um entre um Contexto e sua Fila SW correspondente. É responsabilidade do Agendador remover os Buffers DMA da Fila SW e enviar os buffers para o Mecanismo apropriado que, por sua vez, coloca o buffer em sua própria Fila HW.
Agendador
O Agendador é implementado pelo SO e o driver não tem controle sobre esse agendamento.
O Agendador é responsável por agendar o trabalho enfileirado em Filas SW destinadas a Mecanismos. Ele garante o uso justo de recursos limitados do Mecanismo em todas as Filas SW e antecipa o trabalho conforme necessário para garantir essa imparcialidade e que o trabalho de prioridade mais alta seja concluído em tempo hábil.
Quando o Agendador se apropria do trabalho, ele é responsável por reenfileirar conforme apropriado o trabalho que foi aceito.
Mecanismo
Um Mecanismo executa as ações necessárias para concluir o trabalho expresso em uma sequência de Buffers DMA. Cada Buffer DMA é executado em um determinado Contexto e Espaço de Endereço. O Mecanismo deve indicar quando a execução de um Buffer DMA está concluída, e essas indicações devem ser fornecidas na mesma ordem em que os Buffers DMA foram recebidos.
Um Mecanismo deve ser capaz de progredir de forma independente na ausência de dependências explícitas ou implícitas expressas nos Buffers DMA. Se existirem dois ou mais Mecanismos, eles serão programados com a suposição de que o trabalho de cada Mecanismo prosseguirá em tempo hábil e sem prejudicar o trabalho realizado em outros Mecanismos.
Como um Buffer DMA é executado com um determinado Espaço de Endereço, vários Mecanismos só podem ser suportados se cada Mecanismo for capaz de executar Buffers DMA em diferentes Espaços de Endereço.
Um driver determina quantos Mecanismos ele relata e como esses Mecanismos são usados pelo Contexto que ele cria.
Fila HW
Um Mecanismo receberá uma sequência de Buffers DMA que são colocados conceitualmente em uma fila chamada Fila HW. Atualmente, essa fila é preenchida apenas com no máximo duas entradas de Buffer DMA. Um Mecanismo deve concluir os Buffers de DMA na ordem de envio.
Preempção
Um Mecanismo deve ser capaz de preempção, permitindo que a execução de Buffers de DMA parcialmente concluídos seja interrompida ou cancelada.
Quando solicitado a antecipar o trabalho pendente, um Mecanismo deve dar suporte mínimo à conclusão de quaisquer Buffers de DMA parcialmente concluídos e cancelar todos os Buffers de DMA que ainda não foram iniciados.
A indicação de conclusão ou preempção de Buffers de DMA ainda deve ser feita na ordem em que os Buffers de DMA foram enviados. Se um Buffer de DMA for aceito, todos os Buffers de DMA subsequentes (atualmente no máximo um outro buffer) também serão aceitos.
Se um Buffer de DMA for parcialmente executado, o driver deverá salvar informações suficientes para a retomada de sua execução.
Buffer de DMA
O driver converte o trabalho enviado por meio de chamadas para sua DDI em Buffers de DMA que são enviados para execução. Um Mecanismo executa as ações necessárias para concluir o trabalho expresso em uma sequência de Buffers DMA. Cada Buffer DMA é executado em um determinado Contexto e Espaço de Endereço. O Mecanismo deve indicar quando a execução de um Buffer DMA está concluída, e essas indicações devem ser fornecidas na mesma ordem em que os Buffers DMA foram recebidos.
Espaço de endereço
Um Espaço de Endereço é usado para mapear endereços de dispositivos virtuais para endereços de dispositivos físicos. Um único Espaço de Endereço é usado para cada processo do lado do host.
Os Mecanismos são um recurso compartilhado entre processos e, portanto, devem dar suporte à alternância entre Espaços de Endereço, pois os Buffers de DMA são executados em diferentes processos.
Os dispositivos que dão suporte a apenas um Espaço de Endereço devem ser restritos na forma como são usados. Apenas um processo por vez tem permissão para usar o dispositivo. Enquanto um processo estiver usando o dispositivo, todas as tentativas de outros processos de acessar o dispositivo falharão. Os dispositivos que só podem suportar o acesso por um único processo são chamados de dispositivos de Uso Único.
Um Espaço de Endereço é especificado por um único ponteiro para a tabela de página raiz do espaço de endereço. Uma alteração em um espaço de endereço diferente requer apenas a especificação de um endereço de tabela de página raiz diferente.
O SO gerencia uma tabela de páginas de espaço de endereço. Para fazer alterações na tabela de páginas, o SO faz solicitações ao driver para registrar essas alterações em Buffers de DMA que são posteriormente enviados ao mecanismo apropriado no momento apropriado.