Como as instruções do driver de dispositivo programam a GPU?

9

Digamos que eu esteja usando um computador, qualquer computador moderno típico mais ou menos. Um driver de dispositivo é responsável por tudo que vejo na minha tela, inclusive quando digito isso, a tela é atualizada (é claro que isso está dentro do escopo de um sistema operacional, como o Windows).

Vamos levar isso ao nível em que o hardware não se importa se existe um kernel ou não, e apenas recebe instruções.

Basicamente, como as GPUs "sabem" exatamente como fazer tudo? Um driver controla basicamente todas as funções minúsculas, intrínsecas ou de nível de circuito de hardware possíveis ou necessárias para calcular dados binários para exibição usando instruções especiais fornecidas por um driver?

Nesse caso, a GPU usa uma linguagem "assembly" ou "especial" para entender as instruções enviadas a ela como uma CPU?

Tenho muitas lacunas no meu conhecimento e existe esse "mistério" desagradável por trás das GPUs e de acessá-las diretamente via hardware.

Por exemplo, uma GPU e CPU precisam ser capazes de conectar-se de alguma forma, para que seja possível acessar uma GPU via conjunto da CPU e implementar os barramentos de dados / endereço corretos. Não há como um fornecedor de dispositivos impossibilitar o acesso à GPU fora de um driver, porque um driver também é código compilado e a GPU, como um circuito programável, deve trabalhar com instruções binárias.

Eu fiz esses tipos de perguntas e elas são excluídas violentamente rapidamente, sem resposta por que em muitos sites, então qual é o grande mistério / segredo aqui? É um pedaço de hardware em uma placa-mãe que é acessado como qualquer outro.

Então, realmente ... supondo que essa seja uma pergunta "ok" aqui sobre software e hardware, qualquer pessoa pode acessar diretamente uma GPU sem arquivos específicos do fornecedor, porque os arquivos não são mágicos.

Então, como as GPUs são "programadas" da perspectiva direta de hardware direto no nível específico do hardware?


fonte
Parece uma pergunta "OK" (embora complicada e talvez exija um livro para responder), o que não é um bom formato. Por isso, consulte primeiro a Central de Ajuda e as páginas dos tours para se familiarizar com o tipo de perguntas que você pode fazer aqui. .
Doktoro Reichard
Não estou lendo o centro de ajuda.
Se importa se eu perguntar por que não?
Doktoro Reichard
Porque pode-se gastar um tempo melhor pensando, tentando resolver e responder à minha pergunta "OK" como está.
E como eu disse, para responder adequadamente a essa pergunta, você provavelmente precisaria de um livro ... respostas longas geralmente não são boas.
Doktoro Reichard

Respostas:

8

Basicamente, como as GPUs "sabem" exatamente como fazer tudo? Um driver controla basicamente todas as funções minúsculas, intrínsecas ou de nível de circuito de hardware possíveis ou necessárias para calcular dados binários para exibição usando instruções especiais fornecidas por um driver?

Não, o dispositivo possui seus próprios ICs que controlam todos os aspectos do funcionamento do dispositivo em nível de hardware e fazem interface com um processador central que coordena os aspectos do dispositivo, além de fornecer uma interface de programação de nível superior que pode ser usada para acessar, ler, escrever e controlar o dispositivo.

Nesse caso, a GPU usa uma linguagem "assembly" ou "especial" para entender as instruções enviadas a ela como uma CPU?

Sim e não. Como a maioria dos dispositivos, as placas de vídeo usam padrões para simplificar as coisas. Eles usam padrões como o VESA para acessar funções regulares, como vídeo de inicialização, ou CUDA para acessar as funções de programação da GPU. Além disso, os programas podem acessar as funções não padrão ou dependentes do dispositivo diretamente usando o código da máquina (geralmente C compilado no assembler) em conjunto com as documentações de programação do dispositivo (disponíveis no site do adaptador).

Tenho muitas lacunas no meu conhecimento e existe esse "mistério" desagradável por trás das GPUs e de acessá-las diretamente via hardware.

Os drivers acessam o dispositivo diretamente, e é por isso que eles têm acesso especial (programas regulares no nível do usuário não têm permissão para acessar o hardware diretamente no Vista + por motivos de segurança e estabilidade). Acesse o dispositivo usando portas, DMA (acesso direto à memória ) e mapeamento de memória .

Por exemplo, uma GPU e CPU precisam ser capazes de conectar-se de alguma forma, para que seja possível acessar uma GPU via conjunto da CPU e implementar os barramentos de dados / endereço corretos. Não há como um fornecedor de dispositivos impossibilitar o acesso à GPU fora de um driver, porque um driver também é código compilado e a GPU, como um circuito programável, deve trabalhar com instruções binárias.

Um driver pode ler e gravar o dispositivo com instruções regulares da CPU, acessando portas mapeadas na memória e outras coisas. Como um exemplo fácil de entender, você pode colocar um caractere na tela no modo de texto escrevendo em “memory” no endereço B8000. Esse endereço não era RAM, mas sim, foi mapeado para corresponder à memória da placa de vídeo; portanto, a gravação nele seria gravada na tela. Da mesma forma, você pode escrever na tela colocando o caractere que deseja gravar no ALregistro, 0x09no AHregistro e, em seguida, chamando a interrupção do BIOS 0x10. Funções mais avançadas não são diferentes; você pode ler e gravar a memória do adaptador, chamar as funções em seu chip e assim por diante, usando as interfaces que o dispositivo expõe e documenta.

Então, realmente ... supondo que essa seja uma pergunta "ok" aqui sobre software e hardware, qualquer pessoa pode acessar diretamente uma GPU sem arquivos específicos do fornecedor, porque os arquivos não são mágicos.

Somente para recursos que cumprem os padrões, mas todo o resto (ou seja, o material mais avançado), você precisará consultar os documentos de programação do fabricante.

Então, como as GPUs são "programadas" da perspectiva direta de hardware direto no nível específico do hardware?

Através de várias camadas:

  1. Componentes de estado sólido como transistores e
  2. ASICs de baixo nível
  3. Processador (es) e chipsets integrados
  4. Interfaces de programação de baixo nível (montagem)
  5. Interfaces de programação de nível superior (DirectX, OpenGL)
  6. Linguagem de programação de alto nível (C ++, C #, Python, etc.)
Synetech
fonte
11
nota sobre 'bare metal'; no caso de você ouvir a maioria dos desenvolvedores de jogos falando, eles estão reclamando que precisam usar abstrações de alto nível, como DirectX / OpenGL, em vez de escrever código que seja compilado na linguagem da própria máquina de cartões. consulte aqui para obter informações sobre o idioma do assembler usado pelo código de GPUs FERMI da Nvidia.google.com/p/asfermi observe que até o CUDA fica no topo de um idioma de alto nível (PTX) que é compilado no código da máquina, portanto, os códigos de código programados no CUDA podem não seja o mesmo que a saída compilada.
Frank Thomas
Ei, você pode ter uma boa sugestão de livro adequada para um estudante universitário que cubra as coisas de que você falou neste post? Não estou interessado em trabalhar na programação de GPU, mas as lacunas no meu entendimento de como tudo funciona são frustrantes.
Lanza
2

Não sou exatamente um gênio da arquitetura de computadores, mas tentarei tratar sua pergunta por pontos, com o melhor de meu conhecimento.


Um driver de dispositivo é responsável por tudo que vejo na minha tela, inclusive quando digito isso, a tela é atualizada (é claro que isso está dentro do escopo de um sistema operacional, como o Windows).

É verdade, principalmente porque a interação direta com a GPU não é fácil de implementar. Daí o desenvolvimento de estruturas gráficas como DirectX e OpenGL.

Esta definição útil da Wikipedia explica isso com mais detalhes:

Um driver de dispositivo simplifica a programação agindo como tradutor entre um dispositivo de hardware e os aplicativos ou sistemas operacionais que o utilizam. Os programadores podem escrever o código do aplicativo de nível superior independentemente de qualquer hardware específico que o usuário final esteja usando.


Basicamente, como as GPUs "sabem" exatamente como fazer tudo? Um driver controla basicamente todas as funções minúsculas, intrínsecas ou de nível de circuito de hardware possíveis ou necessárias para calcular dados binários para exibição usando instruções especiais fornecidas por um driver?

GPU's são microprocessadores. Como tal, eles processam. Eles processam dados que são alimentados da CPU (ou seja, posição dos elementos) para uma exibição adequada. Eles "sabem" como fazer tudo porque são fabricados dessa maneira e um grande grupo de pessoas concordou com as maneiras adequadas de enviar dados para e a partir da GPU.

Pense no driver de vídeo como um buffer ou um proxy. Imagine que você é uma janela de programa e o usuário o move para cima. Você pede à GPU para atualizar a exibição. Mas, como a GPU fala klingon e você fala vulcano , o driver recebe seu comando, converte-o na GPU que, por sua vez, faz o que você mandou.

Nesse caso, a GPU usa uma linguagem "assembly" ou "especial" para entender as instruções enviadas a ela como uma CPU?


Da Wikipedia :

A linguagem de montagem ARB é uma linguagem de sombreamento de baixo nível, que pode ser caracterizada como uma linguagem de montagem. Foi criado pelo OpenGL Architecture Review Board (ARB) para padronizar as instruções da GPU que controlam o pipeline de gráficos de hardware.

Há um exemplo e lembre-se de que fabricantes individuais (NVIDIA, ATI) têm seus próprios conjuntos de instruções.

Além disso, existe o OpenCL e muitas outras maneiras de, de certa forma, programar diretamente instruções para a GPU.

Tudo isso deve responder à sua pergunta, até certo ponto.

Doktoro Reichard
fonte