GPU
|
GPU (acrónimo del inglés Graphics Processing Unit) o Unidad de procesamiento gráfico. Procesador dedicado exclusivamente al procesamiento de gráficos, 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.
Origen
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 de la empresa Atari.
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 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
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 500 MHz). 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). 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 potente), 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
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
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 situó un nivel más entre el Hardware y el Software, diseñando lasAPI (Application Program Interface), que proporcionaban un lenguaje más homogéneo para los modelos existentes en el mercado. El primer 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 lenguage 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.