¿Cómo programan las instrucciones del controlador del dispositivo la GPU?

9

Digamos que estoy usando una computadora, cualquier computadora moderna típica más o menos. Un controlador de dispositivo es responsable de todo lo que veo en mi pantalla, incluso cuando escribo esto, la pantalla se actualiza (esto, por supuesto, está dentro del alcance de un sistema operativo, como Windows).

Bajemos esto al nivel donde al hardware no le importa si hay un kernel o no, y solo toma las instrucciones.

Básicamente, ¿cómo las GPU "saben" exactamente cómo hacer todo? ¿Controla básicamente un controlador cada función minúscula, intrínseca o de hardware a nivel de circuito posible o necesaria para calcular datos binarios para su visualización utilizando instrucciones especiales que proporciona un controlador?

Si es así, ¿la GPU usa un lenguaje "especial" o "ensamblado" para entender las instrucciones que se le envían como lo hace una CPU?

Tengo demasiados vacíos en mi conocimiento, y hay un "misterio" desagradable detrás de las GPU y al acceder a ellas directamente a través del hardware.

Por ejemplo, una GPU y una CPU deben poder conectarse de alguna manera, por lo que es posible acceder a una GPU a través del ensamblaje de la CPU e implementar los buses de datos / direcciones correctos. No hay forma de que un proveedor de dispositivos pueda hacer que sea imposible acceder a la GPU fuera de un controlador, ya que un controlador también es un código compilado, y la GPU, como un circuito programable, debe funcionar con instrucciones binarias.

He hecho este tipo de preguntas y se eliminan violentamente rápido sin respuesta por qué en muchos sitios, ¿cuál es el gran misterio / secreto aquí? Es una pieza de hardware en una placa base a la que se accede como cualquier otra.

Entonces realmente ... asumiendo que esta es una pregunta "correcta" con respecto al software y hardware, cualquiera puede acceder directamente a una GPU sin archivos específicos del proveedor, porque los archivos no son mágicos.

Entonces, ¿cómo se "programan" las GPU desde la perspectiva directa del hardware en el nivel específico del hardware?


fuente
En mi opinión, parece una pregunta "OK" (aunque enrevesada y tal vez requiera un libro para responder, lo que no es un buen formato, así que primero vea el centro de ayuda y excursión páginas para familiarizarse con el tipo de preguntas que puede hacer aquí.
Doktoro Reichard
No estoy leyendo el centro de ayuda.
¿Le importa si pregunto por qué no?
Doktoro Reichard
Porque se puede pasar un mejor tiempo pensando, tratando de resolver y responder a mi pregunta "OK" tal como está.
Y como dije, a correctamente Si responde a esta pregunta, probablemente necesite un libro ... Las respuestas largas no suelen ser buenas.
Doktoro Reichard

Respuestas:

8

Básicamente, ¿cómo las GPU "saben" exactamente cómo hacer todo? ¿Controla básicamente un controlador cada función minúscula, intrínseca o de hardware a nivel de circuito posible o necesaria para calcular datos binarios para su visualización utilizando instrucciones especiales que proporciona un controlador?

No, el dispositivo tiene sus propios circuitos integrados que controlan todos los aspectos a nivel de hardware del funcionamiento del dispositivo, y se conectan con un procesador central que coordina los aspectos en el dispositivo, además de proporcionar una interfaz de programación de nivel superior que se puede usar. para acceder, leer, escribir y controlar el dispositivo.

Si es así, ¿la GPU usa un lenguaje "especial" o "ensamblado" para entender las instrucciones que se le envían como lo hace una CPU?

Si y no. Como la mayoría de los dispositivos, las tarjetas de video usan normas para simplificar las cosas. Ellos usan estándares como VESA para acceder a las funciones normales como el video de arranque, o CUDA Para acceder a las funciones de programación de GPU. Además, los programas pueden acceder a las funciones no estándar o dependientes del dispositivo directamente usando el código de la máquina (a menudo C compilado por ensamblador) junto con las documentaciones de programación del dispositivo (que están disponibles en el sitio web del adaptador).

Tengo demasiados vacíos en mi conocimiento, y hay un "misterio" desagradable detrás de las GPU y al acceder a ellas directamente a través del hardware.

Los controladores acceden al dispositivo directamente, por lo que tienen un acceso especial (los programas regulares a nivel de usuario no pueden acceder al hardware directamente en Vista + por razones de seguridad y estabilidad). El acceso al dispositivo mediante puertos, DMA ( Memoria de acceso directo ), y mapeo de memoria .

Por ejemplo, una GPU y una CPU deben poder conectarse de alguna manera, por lo que es posible acceder a una GPU a través del ensamblaje de la CPU e implementar los buses de datos / direcciones correctos. No hay forma de que un proveedor de dispositivos pueda hacer imposible el acceso a la GPU fuera de un controlador, ya que un controlador también es un código compilado, y la GPU, como un circuito programable, debe funcionar con instrucciones binarias.

Un controlador puede leer y escribir el dispositivo con instrucciones regulares de la CPU al acceder a los puertos asignados a la memoria y similares. Como un ejemplo fácil de entender, puede poner un carácter en la pantalla en modo de texto escribiendo en "memoria" en la dirección B8000. Esta dirección no era RAM, sino que estaba asignada a la memoria de la tarjeta de video, por lo que escribir en ella escribiría en la pantalla. Del mismo modo, puede escribir en la pantalla colocando el carácter que desea escribir en el AL registro, 0x09 en el AH registrarse, y luego llamar a la interrupción del BIOS 0x10. Las funciones más avanzadas no son diferentes; puede leer y escribir en la memoria del adaptador, llamar a las funciones en su chip, etc., utilizando cualquier interfaz que exponga el dispositivo y los documentos.

Entonces realmente ... asumiendo que esta es una pregunta "correcta" con respecto al software y hardware, cualquiera puede acceder directamente a una GPU sin archivos específicos del proveedor, porque los archivos no son mágicos.

Solo para las características que cumplen con los estándares, pero todo lo demás (es decir, las cosas más avanzadas), deberá consultar los documentos de programación del fabricante.

Entonces, ¿cómo se "programan" las GPU desde la perspectiva directa del hardware en el nivel específico del hardware?

A través de múltiples capas:

  1. Componentes de estado sólido como transistores y similares.
  2. Nivel bajo ASICs
  3. Procesadores y chipsets integrados
  4. Interfaces de programación de bajo nivel (montaje)
  5. Interfaces de programación de nivel superior (DirectX, OpenGL)
  6. Lenguaje de programación de alto nivel (C ++, C #, Python, etc.)
Synetech
fuente
1
nota sobre 'metal desnudo'; En el caso de que la mayoría de los desarrolladores de juegos hablen, se quejan de que tienen que usar abstracciones de alto nivel como DirectX / OpenGL en lugar de escribir un código que compile en las tarjetas de la máquina langague. Consulte aquí para obtener información sobre el ensamblador langague utilizado por las GPU FERMI de Nvidia code.google.com/p/asfermi tenga en cuenta que incluso CUDA se asienta sobre un lenguaje de alto nivel (PTX) que se compila en el código de la máquina, por lo que los códigos de operación que programe en CUDA pueden no ser los mismos que la salida compilada.
Frank Thomas
Oye, ¿podrías tener una buena sugerencia de libro para un estudiante universitario que cubra las cosas de las que hablas en este post? No me interesa trabajar nunca en la programación de GPU, pero los vacíos en mi comprensión de cómo funciona todo son frustrantes.
lanza
2

No soy exactamente un genio en arquitectura de computadoras, pero trataré de tratar su pregunta por puntos, según mi conocimiento.


Un controlador de dispositivo es responsable de todo lo que veo en mi pantalla, incluso cuando escribo esto, la pantalla se actualiza (esto, por supuesto, está dentro del alcance de un sistema operativo, como Windows).

Es cierto, principalmente porque la interacción directa con la GPU no es fácil de implementar. De ahí el desarrollo de marcos gráficos como DirectX y OpenGL.

Esta definición práctica de Wikipedia Explica esto con más detalle:

Un controlador de dispositivo simplifica la programación al actuar como traductor entre un dispositivo de hardware y las aplicaciones o sistemas operativos que lo utilizan. Los programadores pueden escribir el código de aplicación de nivel superior independientemente del hardware específico que esté utilizando el usuario final.


Básicamente, ¿cómo las GPU "saben" exactamente cómo hacer todo? ¿Controla básicamente un controlador cada función minúscula, intrínseca o de hardware a nivel de circuito posible o necesaria para calcular datos binarios para su visualización utilizando instrucciones especiales que proporciona un controlador?

Las GPU son microprocesadores. Como tal, se procesan. Procesan los datos que se alimentan desde la CPU (es decir, la posición de los elementos) a una pantalla adecuada. Ellos "saben" cómo hacer todo porque están fabricados de esa manera. y un gran grupo de personas acordaron las formas adecuadas de enviar datos hacia y desde la GPU.

Piense en el controlador de pantalla como un búfer, o un proxy. Imagina que eres una ventana de programa y el usuario te mueve hacia arriba. Le pides a la GPU que actualice la pantalla. Pero como habla la GPU Klingon y tu hablas Vulcano , el controlador recibe su comando, lo traduce a la GPU que a su vez hace lo que usted ordenó.

Si es así, ¿la GPU usa un lenguaje "especial" o "ensamblado" para entender las instrucciones que se le envían como lo hace una CPU?


Desde Wikipedia :

El lenguaje ensamblador ARB es un lenguaje de sombreado de bajo nivel, que se puede caracterizar como un lenguaje ensamblador. Fue creado por la Junta de Revisión de Arquitectura OpenGL (ARB) para estandarizar las instrucciones de la GPU que controlan la tubería de gráficos del hardware.

Hay un ejemplo y recuerde que los fabricantes individuales (NVIDIA, ATI) tienen sus propios conjuntos de instrucciones.

Además, existe OpenCL y muchas otras formas de, de una manera, programar directamente las instrucciones a la GPU.

Todo esto debería responder a tu pregunta, hasta cierto punto.

Doktoro Reichard
fuente