- Unidad de procesamiento gráfico
-
La unidad de procesamiento gráfico o GPU (acrónimo del inglés graphics processing unit) es un procesador dedicado al procesamiento de gráficos u operaciones de coma flotante, para aligerar la carga de trabajo del procesador central en aplicaciones como los videojuegos y o aplicaciones 3D interactivas. De esta forma, mientras gran parte de lo relacionado con los gráficos se procesa en la GPU, la CPU puede dedicarse a otro tipo de cálculos (como la inteligencia artificial o los cálculos mecánicos en el caso de los videojuegos).
Una GPU implementa ciertas operaciones gráficas llamadas primitivas optimizadas para el procesamiento gráfico. Una de las primitivas más comunes para el procesamiento gráfico en 3D es el antialiasing, que suaviza los bordes de las figuras para darles un aspecto más realista. Adicionalmente existen primitivas para dibujar rectángulos, triángulos, círculos y arcos. Las GPU actualmente disponen de gran cantidad de primitivas, buscando mayor realismo en los efectos.
Las GPU están presentes en las tarjetas gráficas, y en integrados
Contenido
Historia
Las modernas GPU son descendientes de los chips gráficos monolíticos de finales de la década de 1970 y 1980. Estos chips tenían soporte BitBLT limitado en la forma de sprites (si es que tenían dicho soporte del todo), y usualmente no tenían soporte para dibujo de figuras. Algunos GPU podían ejecutar varias operaciones en una lista de "display" y podían usar DMA para reducir la carga en el procesador anfitrión; un ejemplo temprano es el coprocesador ANTIC usado en el Atari 800 y el Atari 5200. Hacia finales de los 80 y principios de los 90, microprocesadores de propósito general de alta velocidad fueron muy populares para implementar los GPUs más avanzados. Muchas (muy caras) tarjetas gráficas para PCs y Estaciones de Trabajo usaban Procesadores Digitales de Señales (DSP por sus siglas en inglés) tales como la serie TMS340 de Texas Instruments, para implementar funciones de dibujo rápidas y muchas impresoras laser contenían un procesador de barrido de imágenes "PostScript" (un caso especial de GPU) corriendo en un procesador RISC como el AMD 29000.
Conforme la tecnología de proceso de semiconductores fue mejorando, eventualmente fue posible mover las funciones de dibujo y las BitBLT a la misma placa y posteriormente al mismo chip a manera de un controlador de buffer de "marcos"(frames), tal como VGA. Estos aceleradores gráficos de 2D "reducidos" no eran tan flexibles como los basados en microprocesadores, pero eran mucho más fáciles de hacer y vender. La Commodore AMIGA fue la primera computadora de producción en masa que incluía una unidad blitter y el sistema gráfico IBM 8514 fue una de las primeras tarjetas de video para PC en implementar primitivas 2D en hardware.
Diferencias con la CPU
Para entender bien las diferencias, primero hay que entender el propósito general de la CPU: Un mero procesador de texto plano que se dedica a convertir órdenes provenientes del interfaz de usuario, para su proceso aritmético lógico. En origen, estas tareas se restringían al ámbito administrativo de empresas y servicios públicos; el uso intensivo del texto plano era evidente: formulas matemáticas, expresiones lógicas, filtrado de datos, etc, no requería más que la adecuada conversión de las instrucciones planas a código binario. Las necesidades básicas de la representación gráfica se cubría a base de implementar, dentro del mismo rango de texto, la representación de un bloque como una referencia plana a una representación pseudográfica. Digamos que, usando el mismo juego de instrucciones, se dedicaban a controlar la representación de texto como algo parecido a un gráfico. Con la evolución del hardware, el aparato gráfico llegó a controlarse a base de puntos de luz encendidos en la pantalla, siendo un acceso de muy bajo nivel que requería los literales en posiciones de memoria, que luego el procesador las trabajaría en forma pseudográfica. Digamos que, si cuentas con un juego de instrucciones que te puede facilitar la vida, para la representación gráfica, se debía dejar a un lado y acceder directamente a direcciones hardware, con literales en ensamblador y direcciones de memoria en sus expresiones binarias.
El uso frecuente de la pseudo representación gráfica, genero bibliotecas de programación, las cuales, implementadas y usadas, ahorraban mucho tiempo al programador. Con este trabajo bibliotecario realizado, las necesidades quedaban abiertamente declaradas: El Conjunto de instrucciones más frecuentes que se necesita para un control del gráfico en su estado nativo, quedó contemplado dentro del estándar ISA.
El handicap del estándar ISA, era que contaba con una frecuencia de reloj dependiente de la CPU, por lo que los recursos se compartían. Siendo que cuando se hacía un uso muy intensivo del área gráfica, la CPU paralizaba sus funciones, las cuales eran necesarias para ir procesando los lotes de resultados provenientes del área gráfica, por lo que se corría el riesgo de un Desbordamiento de búfer, Desbordamiento de pila o cualquier otra forma de saturación de computo.
El programador debía ejercer un cuidado exquisito para equilibrar la carga gráfica, frente al proceso de la CPU.
Ya adentrados en la cuarta parte de la década de los 70 e inicios de los 80, IBM desarrolló su primer PC y Atary sacó al mercado la primera máquina especializada en la gestión gráfica. Ya se podía hablar de un apartado gráfico propiamente dicho. Ahora, los píxeles, se encendían y apagaban mediante instrucciones en las que declarabas que figura deseabas representar y los parámetros que lo acotan (imagen vectorial); siendo que los mapas de bit, aun era una cuestión híbrida entre CPU y GPU.
Adentrándonos en los 80, La principal diferencia entre el apartado gráfico y el apartado de proceso, comenzó a verse como un concepto meramente dimensional. Si el texto plano representa una dimensión, el texto gráfico, que permite adornos y más florituras, distintos colores, fondos y artes a la hora de representar el glifo; cuenta con la referencia plana más la representación artística. Al contar con dos dimensiones que definen al carácter, el trabajo de la CPU es el doble. Los entornos gráficos de la época así lo muestran.
A mediados de los 80, Commodore sacó al mercado la primera máquina con un procesador gráfico propiamente dicho, especializado en vectores y mapas de bit, capaz de calcular diferentes planos en un bitmap. Es a partir de esta innovación, cuando se puede hablar de un procesador gráfico o GPU propiamente dicha.
Haciendo un repaso: Si las CPU's de origen se dedicaban a mover puntos en memoria (una sola dimensión), las instrucciones gráficas se fundamentan en ese principio, pero especializándose en dotar de dimensión al punto y en el movimiento del vector propiamente dicho. Con la inclusión de ordenes especializadas en los mapas de bit, se introduce una pseudo tercera dimensión, pues el área de mapas de bit muebe planos a resoluciones, en origen bajas, pero con un efecto que comenzaba a dar la apariencia de película, o la capacidad de generar pequeñas animaciones con apenas costo para la CPU. Los coprocesadores gráficos propiamente dichos, en el ámbito de los PC's aparecieron con el estándar del Bus VESA.
Si bien en un computador genérico no es posible reemplazar la CPU por una GPU, hoy en día las GPU son muy potentes y pueden incluso superar la frecuencia de reloj de una CPU antigua (más de 500MHz). Pero la potencia de las GPU y su dramático ritmo de desarrollo reciente se deben a dos factores diferentes. El primer factor es la alta especialización de las GPU, ya que al estar pensadas para desarrollar una sola tarea, es posible dedicar más silicio en su diseño para llevar a cabo esa tarea más eficientemente. Por ejemplo, las GPU actuales están optimizadas para cálculo con valores en coma flotante, predominantes en los gráficos 3D.
Por otro lado, muchas aplicaciones gráficas conllevan un alto grado de paralelismo inherente, al ser sus unidades fundamentales de cálculo (vértices y píxeles) completamente independientes. Por tanto, es una buena estrategia usar la fuerza bruta en las GPU para completar más calculos en el mismo tiempo. Los modelos actuales de GPU suelen tener una media docena de procesadores de vértices (que ejecutan Vertex Shaders), y hasta dos o tres veces más procesadores de fragmentos o píxeles (que ejecutan Pixel Shaders (O Fragment Shaders)). De este modo, una frecuencia de reloj de unos 600-800MHz (el estándar hoy en día en las GPU de más potencia), muy baja en comparación con lo ofrecido por las CPU (3.8-4 GHz en los modelos más potentes[no necesariamente más eficientes]), se traduce en una potencia de cálculo mucho mayor gracias a su arquitectura en paralelo.
Una de las mayores diferencias con la CPU estriba en su arquitectura. A diferencia del procesador central, que tiene una arquitectura de von Neumann, la GPU se basa en el Modelo Circulante. Este modelo facilita el procesamiento en paralelo, y la gran segmentación que posee la GPU para sus tareas.
Arquitectura de la GPU
Una GPU está altamente segmentada, lo que indica que posee gran cantidad de unidades funcionales. Estas unidades funcionales se pueden dividir principalmente en dos: aquéllas que procesan vértices, y aquéllas que procesan píxeles. Por tanto, se establecen el vértice y el píxel como las principales unidades que maneja la GPU.
Adicionalmente, y no con menos importancia, se encuentra la memoria. Ésta destaca por su rapidez, y va a jugar un papel relevante a la hora de almacenar los resultados intermedios de las operaciones y las texturas que se utilicen.
Inicialmente, a la GPU le llega la información de la CPU en forma de vértices. El primer tratamiento que reciben estos vértices se realiza en el vertex shader. Aquí se realizan transformaciones como la rotación o el movimiento de las figuras. Tras esto, se define la parte de estos vértices que se va a ver (clipping), y los vértices se transforman en píxeles mediante el proceso de rasterización. Estas etapas no poseen una carga relevante para la GPU.
Donde sí se encuentra el principal cuello de botella del chip gráfico es en el siguiente paso: el pixel shader. Aquí se realizan las transformaciones referentes a los píxeles, tales como la aplicación de texturas. Cuando se ha realizado todo esto, y antes de almacenar los píxeles en la caché, se aplican algunos efectos como el antialiasing, blending y el efecto niebla.
Otras unidades funcionales llamadas ROP toman la información guardada en la caché y preparan los píxeles para su visualización. También pueden encargarse de aplicar algunos efectos. Tras esto, se almacena la salida en el frame buffer. Ahora hay dos opciones: o tomar directamente estos píxeles para su representación en un monitor digital, o generar una señal analógica a partir de ellos, para monitores analógicos. Si es este último caso, han de pasar por un DAC, Digital-Analog Converter, para ser finalmente mostrados en pantalla.
Programación de la GPU
Al inicio, la programación de la GPU se realizaba con llamadas a servicios de interrupción de la BIOS. Tras esto, la programación de la GPU se empezó a hacer en el lenguaje ensamblador específico a cada modelo. Posteriormente, se introdujo un nivel más entre el hardware y el software, con la creación de APIs (Application Program Interface) específicas para gráficos, que proporcionaron un lenguaje más homogéneo para los modelos existentes en el mercado. La primera API usado ampliamente fue estándar abierto OpenGL (Open Graphics Language), tras el cuál Microsoft desarrolló DirectX.
Tras el desarrollo de APIs, se decidió crear un lenguaje más natural y cercano al programador, es decir, desarrollar un lenguajes de alto nivel para gráficos. Por ello, de OpenGL y DirectX surgieron estas propuestas. El lenguaje estándar de alto nivel, asociado a la biblioteca OpenGL es el "OpenGL Shading Language", GLSL, implementado en principio por todos los fabricantes. La empresa californiana NVIDIA creó un lenguaje propietario llamado Cg (del inglés, "C for graphics"), con mejores resultados que GLSL en las pruebas de eficiencia. En colaboración con NVIDIA, Microsoft desarrolló su "High Level Shading Language", HLSL, prácticamente idéntico a Cg, pero con ciertas incompatibilidades menores.
Cálculos de la GPU para propósito general
Se intenta aprovechar la gran potencia de cálculo de las GPU para aplicaciones no relacionadas con los gráficos, en lo que desde recientemente se viene a llamar GPGPU, o GPU de propósito general (General Purpose GPU, en sus siglas en inglés).
Véase también
Enlaces externos
- Wikimedia Commons alberga contenido multimedia sobre Unidad de procesamiento gráficoCommons.
- Sitio web oficial de ATI/AMD (en español)
- Sitio web oficial de NVIDIA (en español)
Wikimedia foundation. 2010.