¿Qué son y cómo funcionan los núcleos de una GPU? (28-01-2024)
Los núcleos de una GPU, ya sea el chip central de una tarjeta gráfica o esta se encuentre integrada junto a una CPU en un mismo chip, no son iguales. En este artículo aprovecharemos para romper algunos mitos sobre estos y cuál es la diferencia entre ambos tipos de núcleo. Entre otras cosas, explicaremos el error de usar términos como «Shaders», núcleos CUDA y Stream Processors, términos muy usados, cuando se suele hablar de hardware gráfico.
Nota: esté, es un artículo en desarrollo, por lo que irá creciendo a lo largo del tiempo e iréis viendo su progreso y actualización a lo largo del tiempo con nuevas secciones. No os preocupéis por el hecho buscar este artículo, dado que las iréis viendo aparecer en primera página a medida que se vayan añadiendo nuevas secciones. Al mismo tiempo, cuando este párrafo desaparezca, entonces el artículo habrá llegado a su fin.
Índice de contenidos
Tabla de contenidos
¿Qué son los núcleos de una GPU? ¿Shaders, CUDA o Stream Processors?
Antes de nada hay que eliminar un concepto que lleva años siendo repetido en el mundo de las tarjetas gráficas, que es el de núcleos CUDA. Se entiende como núcleo la unidad completa e integrada que se encarga de procesar cada instrucción desde su captación en memoria hasta su ejecución, pasando por la descodificación de las mismas. Sin embargo, los llamados CUDA Cores son solo unidades de cálculo que procesan datos en coma flotante de 32 bits. Es como si dijéramos que un coche con un motor de 16 válvulas tuviese 16 motores. Una terminología similar se vio con AMD, pero dado que CUDA es una palabra registrada por NVIDIA, durante un tiempo se les llamó Stream Processors a las ALU FP32, cayendo exactamente bajo el mismo error.
Los núcleos en una GPU también tienen la capacidad de ejecutar código, pero su planteamiento es muy diferente a las aplicaciones en una CPU. Por ejemplo, no los vas a ver ejecutando un Microsoft Word, pero sí piezas mucho más concretas dentro de un programa. Y no solo se utilizan para mover complejos gráficos en los videojuegos o hacer simulaciones, sino también para acelerar partes de un programa que por su nivel de paralelismo no es eficiente hacerlo en la unidad central de proceso.
Diferencias entre núcleos de GPU y CPU
Por lo que los núcleos de una GPU son lo que NVIDIA llama SM y AMD Compute Unit o Workgroup Processor, aunque esta son dos CU compartiendo algunos elementos. No obstante, nos encontramos con que la cantidad de núcleos en una GPU es mucho más alta que los núcleos de una CPU.
Todo ello se debe a que los núcleos de una GPU son una estructura más simple, dado que en general tiene una unidad de control mucho más compleja, dado que entre otras cosas:
- No tienen capacidad para ejecutar el código fuera de orden.
- La unidad de predicción de saltos en una GPU es muy simple.
- Una GPU es rápida haciendo cálculos, pero muy lentas con las instrucciones de saltos y los bucles.
- Una GPU no tiene que manejar interrupciones que le mandan los periféricos de forma continua.
De ahí a que se puedan colocar una cantidad inmensa de núcleos de GPU en un chip en comparación con los de una CPU.
Procesadores de dominio específico
Este término apareció hace un tiempo en ciertas publicaciones sobre computación, para referirse a un tipo de unidades que se encuentran entre una CPU como paradigma del procesador de propósito general, y un ASIC, un chip altamente especializado que es poco programable, pero altamente eficiente a la hora de hacer ciertos cálculos para tareas muy específicas. Los núcleos de una GPU entran dentro de la categoría de procesadores de dominio específico.
Imaginad que queréis que una unidad especializada ejecute un algoritmo concreto a gran velocidad, lo normal hace unos años era usar un ASIC, que tenía dicho algoritmo codificado en hardware y te lo devolvía rápidamente. El problema es que si quieres ejecutar otro algoritmo distinto, vas a tener que construirlo en el chip y así continuamente. Un día escribes los algoritmos sobre un papel y decides comprobar las instrucciones que usa cada uno de ellos y te das cuenta de que usan las mismas instrucciones, pero no quieres hacer algo tan complejo como una GPU. Entonces, decides crear un tipo de núcleo, que pueda ejecutar esos mismos algoritmos, pero eliminando todo aquello fuera de su trabajo principal.
Con ello has conseguido lo que solemos llamar «los shaders de la gráfica», lo cual es otra palabra errónea, dado que Shaders son los programas o código fuente que ejecutaran los núcleos de la GPU. Decir que una tarjeta gráfica tiene x shaders es erróneo, dado que es un concepto puramente de hardware.
Entonces, ¿de dónde viene el término GPGPU?
Los primeros núcleos de GPU que aparecieron trabajan con datos gráficos, píxeles y vértices, y estaba todavía altamente especializados en esos tipos de datos. A medida que estos se fueron haciendo más complejos, se unificaron en un tipo de unidad general. La cual podía ejecutar todo tipo de datos. Fue en ese punto donde las tarjetas gráficas empezaron a usarse para resolver ciertos tipos de algoritmo, dado que eran mucho más eficientes a la hora de hacerlo que una CPU. Esto hizo madurar a las tarjetas gráficas, de ser accesorios para el mercado de los videojuegos en PC, a montarse en grandes superordenadores de carácter científico y militar.
Sin embargo, cuando hablamos de GPGPU no estamos diciendo que dejen de ser procesadores de dominio específico, sino que se hace referencia al uso. No obstante, incluso a día de hoy, los núcleos de una GPU no tienen la capacidad de poder reemplazar a un microprocesador central. Dado que, como ya hemos dicho antes, carecen de una serie de elementos que son imprescindibles para ejecutar algo tan esencial como un sistema operativo.