Tanto si te interesa el tema de la arquitectura de una GPU, como si vas a elegir una nueva tarjeta gráfica para tu equipo, es importante conocer algo más sobre el chip de ésta, cómo usar los SKUs, y generaciones a tu favor, etc. Al igual que en el artículo tutorial sobre la microarquitectura de la CPU, en este otro nos centraremos en esta otra unidad que se puede usar para algo más que para los gráficos.
Índice de contenidos
No debes guiarte por su nombre para determinar para qué sirve cada una de ellas. En el pasado la CPU se encargaba también de los gráficos, cuando no existían aceleradores gráficos. Incluso actualmente, algunas CPUs se siguen encargando de los gráficos en algunos sistemas, como cuando se usa para el renderizado. Por otro lado, la GPU no solo puede procesar gráficos y nada más, ya que puede tener otras aplicaciones, como la GPGPU, que se puede usar como una CPU, con propósito genérico.
Por otro lado, me gustaría agregar que la CPU es el «cerebro» de la computadora, y que ello también implica enviar órdenes a la GPU. Por tanto, la GPU es dependiente de la CPU.
Existen varias compañías que diseñan GPUs, como Intel, AMD y NVIDIA para el ámbito del PC y el HPC, así como también han diseñado algunas para el sector de los dispositivos móviles, e incluso otras como Imagination Technologies (PowerVR Technologies) para ARM, Apple Silicon, Qualcomm (sus Adreno surgieron de una compra de la división móvil de ATI/AMD), etc.
Todos ellos tienen arquitecturas muy diferentes en cada GPU. Por este motivo, no se pueden comparar entre ellas a la ligera, ni tampoco los FLOPS se deben usar como unidad de referencia para comparativas. Y esto es debido a la heterogeneidad de unidades de procesamiento que existe, dando resultados muy diferentes.
Las unidades computacionales o núcleos de una GPU son mucho más pequeñas y simples que las de una GPU, sin embargo, al ser tan numerosas, la potencia de cálculo es bastante impresionante, especialmente en coma flotante. De hecho, el núcleo de una GPU lo que más hace es sumar y multiplicar (MAD), y multiplicar-sumar (FMA). Otros núcleos algo más complicados, como las unidades tensionales o Tensor units, pueden hacer tareas algo más complejas que eso, como las operaciones tensor para acelerar IA (Inteligencia Artificial). Otros núcleos complejos son los de trazado de rayos, destinados a aportar mayor realismo en la iluminación.
El modelo de programación de los núcleos de la GPU es SIMD (Simple Instruction Multiple Data), es decir, con una instrucción única se aplica a varios datos, como una unidad vectorial. Dicho de otro modo, la GPU hará que un flujo de datos, que ocupará todos sus núcleos de procesamiento, sufra sea alterado al ejecutar una misma instrucción para todos. Así es como se consigue un alto paralelismo.
Estos modelos SIMD permiten acelerar una gran parte de aplicaciones, entre ellas las gráficas. En este caso para escalar todos los píxeles de una imagen, mapearlos, agregar texturas, iluminación, etc. Procesos que implican de una gran cantidad de datos matemáticos.
Evidentemente, estarás pensando que, al igual que un una CPU no se llenan todas las unidades funcionales, en una GPU tampoco vas a toparte siempre con un modelo que coincide especialmente con el SIMD, como cuando se procesan problemas asíncronos, por lo que va a producir una carga desigual en los núcleos de procesamiento en algunos casos.
Como se puede apreciar en la imagen anterior, la GPU se representa como un «mar» de unidades de procesamiento (marcadas en verde), y que pueden actuar de forma independiente. Por ejemplo, imagina sumar los elementos de una matriz de 8 filas. Para ello, se necesita obtener el primer elemento, sumarlo al segundo, el resultado sumarlo al tercer elemento, y así sucesivamente. Luego se hace lo mismo con la segunda fila, después la tercera,…
Este tipo de operaciones matriciales se pueden hacer de forma muy eficiente, rápida y simultáneamente con una GPU. Para ello se transforma este problema secuencial en algo paralelo. Para ello, se pueden sumar de dos en dos en paralelo los primeros parciales, logrando 4 resultados en este caso. Esos parciales se sumarán, y por último se suman los 2 últimos parciales. De esta forma, mientras una unidad de procesamiento convencional necesitaría muchos pasos, una GPU solo lo hace en 3.
Siguiendo con este ejemplo, la GPU lo que hará será emplear cuatro unidades de procesamiento en el primer ciclo de reloj para la suma y obtención de los cuatro parciales. Luego, en la siguiente oscilación de reloj se usarán dos núcleos para la suma de los cuatro parciales, y por último un núcleo para la suma de estos dos últimos. Así es como la GPU trabaja a nivel de arquitectura.
Como habrás deducido, de esto se puede ver que la GPU necesitará un espacio de memoria compartida para almacenar y obtener los resultados parciales. Cada unidad de procesamiento o núcleo se organiza en Streaming Processors, o procesadores de flujo, cuyas unidades de procesamiento dentro del grupo pueden ser de varios tipos. Estos grupos puede colaborar entre sí de forma mucho más sencilla que si se relacionaran todos con todos como sucede en una CPU.
AMD usa Compute Units o CU para designar a las unidades de procesamiento, y NVIDIA los llama SM o Streaming Multiprocessor. Cada una de estas unidades está integrada por un conjunto de subunidades, como los motores de sombreado, unidad de textura, unidad de rasterizado etc.
Estos elementos de procesamiento pueden realizar diversas operaciones, como: FP32 o de coma flotante de precisión simple; FP64 o de coma flotante de doble precisión; enteros para datos enteros, por ejemplo para cálculos de direcciones, etc.; tensoriales o Tensor Cores son agrupaciones de coma flotante tipo FP16 o de precisión media. Esas operaciones algo más simples son las más comunes en el aprendizaje profundo o IA. En las modernas arquitecturas de GPU se pueden integrar varios tipos de elementos, como por ejemplo:
Dependiendo de la arquitectura de GPU, esas unidades pueden variar. Y, por supuesto, no hay que olvidar el bus de memoria de la GPU para comunicarse con ella con un ancho de banda elevado, y de la memoria gráfica o VRAM. Ésta juega un papel fundamental en el proceso, ya que guardará elementos y datos de los gráficos ya procesados, y en función de la resolución, se necesitará más cantidad de esta memoria o menos. Así se puede recurrir a ellos cuando se necesite, sin volver a procesarlos. En caso de tener menos memoria y que no quepan todos, se deberá volver a procesar todo, lo que supone un impacto en el rendimiento.
En la imagen superior puedes ver estos Streaming Processors en forma de líneas de unidades de procesamiento en verde, con partes a la izquierda de memoria compartida y control del flujo. Esta memoria no es la VRAM, o RAM para gráficos, sino que es una memoria tipo caché built-in en la GPU, mientras la VRAM es externa (en las iGPU o APUs, la memoria empleada por la GPU es la RAM principal, que compartirán con la CPU).
Tras explicar de forma sencilla cómo es la arquitectura de una GPU, vamos a ver cómo trabaja esta para generar los gráficos. Es decir, cómo esas operaciones matemáticas se transforman en un gráfico 2D o 3D en nuestra pantalla. Haciendo un resumen simplificado, la tubería gráfica se compone de los siguientes pasos:
Por supuesto, la GPU no trabaja sola. La CPU es la que le encargará las tareas, mediante el envío de comandos y datos, durante el procesamiento del videojuego o del software gráfico que sea. Y a eso hay que agregar APIs gráficas como OpenGL, Vulkan, etc., los controladores gráficos que trabajarán a nivel bajo con la GPU, etc.
Te recomendamos la lectura de los siguientes tutoriales:
Con esto terminamos nuestro artículo sobre la arquitectura de GPU. Esperemos que os haya servido de utilidad, y si tienes alguna duda, estamos a vuestra disposición. ¡Hasta el próximo artículo!
Hace algunos meses salió una información que indicaba que las aceleradoras de IA Nvidia Blackwell…
Intel revela sus próximas aceleradoras Jaguar Shores, que van a llegar después del lanzamiento de…
Abysm es una de las muchas marcas que celebran el Black Friday a lo grande.…