El documento proporciona información sobre la tecnología GPU utilizada en las tarjetas gráficas. Explica que una GPU es una unidad de procesamiento dedicada al procesamiento de gráficos para aliviar la carga de trabajo de la CPU. Luego describe las diferencias entre las GPU y CPU, así como la arquitectura de las GPU, incluidos los componentes clave como los vértices, píxeles, memoria y shaders. Finalmente, resume la última arquitectura GT200 de nVidia, incluidos sus desafíos de tama
1. Alberto Perojo Parás
Tecnología GPU para las tarjetas gráficas
Con este trabajo se pretende dar unas nociones básicas sobre la tecnología GPU usada en las tarjetas gráficas y
profundizar en la última arquitectura propuesta por nVidia para los modelos GTX200.
El concepto
GPU es un acrónimo utilizado para abreviar Graphics Processing Unit, que significa "Unidad de Procesado de Gráficos".
Una GPU es un 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).
Diferencias con la CPU
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.
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 fragment shaders). De este modo, una frecuencia de reloj de unos
500-600MHz (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 Eckert-Mauchly, 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.
2. 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
situó un nivel más entre el hardware y el software, diseñando las API (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.
Última GPU de nVidia
La última arquitectura desarrollada por nVidia es la GT200.
Tamaño y consecuencias
El GPU GT200 es grande, extremadamente grande y esto combinado con el hecho de que la arquitectura de GPUs es
más compleja que la de un CPU, tiene una cantidad importante de consecuencias.
A nVIDIA le ha costado controlar el tamaño de sus GPUs y sus desarrollos les están comenzando a salir un poco de las
manos. La razón de esto, es que mientras más grande sea el tamaño del cuadrado de silicio, se pueden obtener menos
chips por cada oblea (wafer) que se procesa. Esto es obvio, pues la oblea no ha crecido en diámetro - 300mm - en
muchos años. Si para el G80 cada disco tenía 121 GPUs de 484mm², siendo que el tamaño del GT200 es ahora de
576mm², la cantidad de ellos se reduce aproximadamente a 100. Junto con esto, la cantidad de chips sin defectos o en
otras palabras, su rendimiento productivo (yields) disminuye debido a que las impurezas ahora amenazan a la superficie
de un circuito impreso cuya área es mayor. Por ende, la cantidad de GPUs buenos se reduce en una buena cantidad
con respecto a los del G80 trayendo como resultando que el costo del GT200 sea significativamente más alto para la
empresa.
Adicionalmente, la cantidad de transistores en cada procesador gráfico ha aumentado a un ritmo considerablemente
más rápido que el de los CPUs.
Considerando que es Intel la empresa que utiliza los procesos de manufactura más modernos del mundo y no NVIDIA,
se puede ver como esta última esta estresando mucho más la tecnología a su límite. Esto se demuestra de forma muy
clara cuando se compara el consumo en watts de los más recientes desarrollos de ambas empresas: mientras el Intel
Core 2 Extreme QX9770 consume - según documentos de la empresa - 150w, el GT200 disipa 236w, un 57% más
aproximadamente. No solo esto, debido a que los transistores del GPU son en su gran mayoría unidades de
procesamiento a comparación del caso de Intel en donde la mayoría se emplean en memoria cache, la cantidad de
ruido eléctrico generado dentro de cada GPU está haciendo que cada vez sea más difícil que ellos logren frecuencias
más elevadas.
Las consecuencias de lo anterior hacen fácil preveer que NVIDIA está llegando al límite de lo que pueden hacer en un
solo chip para su siguiente generación de GPUs, tanto por factibilidad como por costos.
3. Arquitectura GTX200
1. Manejo de hilos (threads)
En la arquitectura unificada de NVIDIA no existen unidades específicas que cumplan las funciones de por ejemplo, pixel
shaders o vertex shaders o cualquier otro conjunto de instrucciones. La forma como se procesan estas instrucciones es
por medio de unidades que asignan hilos atadas a su característica y son enviados a los streaming processors a ser
procesados. Por ejemplo, si se va a procesar un programa de pixel shader, la unidad de pixel shader crea los hilos
marcados con esa función para ser procesados posteriormente. Las diferencias de esta unidad entre su modo
computacional y su modo gráfico se verán en el siguiente apartado.
2. Area de procesamiento principal
Un resumen de lo que hace es el siguiente: en esta área del GPU se encuentran los procesadores de hilo (streaming
processors o SP) que son agrupados de 8 en 8 en multiprocesdores de flujo (streaming multiprocessors o SM) los
cuales incluyen elementos adicionales dependiendo de si se usa el chip en modo computacional o gráfico. Finalmente,
los SMs están agrupados de a 3 en grupos de procesamiento de hilo (thread processing clusters o TPC) que
adicionalmente incluyen las unidades de texturización y el cache L1 - de primer nivel - compartido. Teniendo en cuenta
que hay 10 TPCs en el GPU podemos llegar a esta sencilla ecuación: 10x3x8= 240.
Este número representa la cantidad de SPs (núcleos de procesamiento del GPU) que posee la arquitectura, un salto
considerable con respecto a los 128 SPs (8 TPC x 2 SM x 8 SP) del G80.
3. ROP
Para el subsistema de ROPs (encargados de hacer el procesamiento final de los pixeles) el GT200 adiciona dos
particiones más de ellas con lo cual pasa a tener 8 ROPS a comparación de 6, lo que le permite procesar hasta 32
píxeles por reloj. Esto implica que técnicamente el GT200 debería tener un rendimiento superior al aplicar filtros (de
alisado de lineas y anisotrópico) en comparación a G80.
En la generación anterior, cada ROP estaba conectado a un canal de memoria de 64-bit, en esta generación se da el
mismo caso, por lo que ahora el bus de memoria pasó de tener 384 bits a tener 512-bit.
Aparte de algunas otras optimizaciones menores para ciertos tipos de píxeles, los ROPs se mantienen estructuralmente
iguales a los anteriores, lo cual implica que todos los modos de Anti-Aliasing / Alisado (MSAA, SSAA, AA de
transparencia adaptiva y CSAA) que existían en la generación anterior, son soportados por el nuevo GPU, pero no se
agregan nuevos modos.
4. 4. Canales de memoria
Es interesante que NVIDIA habla de que se optimizaron las rutas críticas de memoria para que esta pueda operar a una
velocidad máxima de 1,2 GHz GDDR3, algo que probablemente viene del G92 pues la velocidad de las memorias en la
GeForce 8800 GTX era de 900MHz, que luego subieron a 1080MHz con la GeForce 8800 Ultra y posteriormente a
1100MHz con la GeForce 9800 GTX. Sin embargo, esto también quiere decir que el controlador de memoria está al
límite de sus capacidades para GDDR3. NVIDIA cuando tuvo que decidir sobre que tecnología de memorias tendría
para su siguiente GPU, decidió ser conservador manteniendo el uso de GDDR3, la cual a estas alturas está
ampliamente disponible y por ende es más económica, confiando en que el mayor ancho de banda surgiría por agregar
un par de controladores de memoria más en vez de depender del aumento de frecuencia de la memoria. La decisión
tomada por la empresa es muy razonable pues disminuye los costos de investigación y desarrollo de un nuevo
controlador de memoria, mientras se toman una mayor cantidad de tiempo en hacer las pruebas correspondientes para
desarrollarlo y optimizarlo al mismo tiempo que disminuyen los costos por tarjeta de video armada.
También, NVIDIA hizo algunos ajustes en la razón o ratio de ancho de banda entre las texturas y la memoria para que
esté más acorde a las cargas de trabajo actuales y futuras y así mantener a las unidades de textura siempre trabajando
pues siempre los datos están disponibles.
Por otra parte, se aumentaron en 6 veces la cantidad de estructuras internas para los buffers de salida lo que hace que
las operaciones de los shaders de geometría y las operaciones stream out (útiles para modo cómputo) sean
considerablemente más rápidas que las del G80 y un poco más rápidas que las de la Radeon HD 3870 X2. Esto es
destacable, porque en las pruebas de rendimiento que utilizaban shaders de geometría eran consistentemente más
lentos los GPUs de NVIDIA. Siendo que la arquitectura del G80 tenía un rendimiento superior en todas las pruebas de
rendimiento vistas en benchmarks y análisis (en donde no se emplean mucho los shaders de geometría pues estos solo
fueron recién introducidos con DirectX 10 y las arquitecturas compatibles de NVIDIA y ATI) la empresa se aseguro de
corregir una de las pocas cosas en la cual estaba en franca desventaja con la competencia.
El producto
El GT200 viene en dos versiones, el modelo GTX280 y el modelo GTX260. Al igual que en la generación pasada, la
diferencia entre cada modelo radica en las velocidades de reloj, en que se deshabilitan dos TCPs completamente, lo
que implica que disminuye el número de shaders y se deshabilita un ROP.