Si hablamos del mayor fabricante de tarjetas gráficas, nos referimos a NVIDIA. Este fabricante ofrece soluciones muy potentes y variadas, no solo destinadas al gaming, también a la computación de datos o la inteligencia artificial. Todas sus GPU tienen algo en común y son los NVIDIA CUDA Cores, un tipo de núcleo gráfico realmente potente y versátil.
Al leer las especificaciones de cualquier tarjeta gráfica de NVIDIA habrás visto repetidas veces la mención de los llamados núcleos CUDA en medio de las especificaciones. ¿A que hace referencia este término y qué relación tienen con la potencia de la tarjeta gráfica y, por tanto, con la capacidad de mover gráficos?, ¿Se trata de un concepto exclusivo del hardware de NVIDIA o en su defecto es el clásico movimiento de branding tecnológico? Veamos que es esta particular tecnología que lleva en las GPU de NVIDIA desde ya quince años.
¿Qué son los CUDA Cores?
Son un tipo de núcleo específico desarrollado por parte de NVIDIA de computación en paralelo de propósito general. Esto quiere decir que es un tipo de núcleo que permite su uso en diferentes tipos de tareas. Comúnmente se los conoce en informática, para los videojuegos, pero también se usan en investigación médica y otros campos científicos, predicciones meteorológicas, matemáticas complejas y otros muchos campos.
Los núcleos CUDA (Compute Unified Device Architecture) son realmente flexibles y maleables, como hemos destacado. Debido a su capacidad de paralelización de tareas, son enormemente más eficientes en tareas complejas que una CPU. Además, son mucho más eficientes, ya que lograr esta misma potencia con CPU sería costoso, ocuparía mucha superficie y requeriría de mucha energía.
Existe desde hace años un ecosistema de aplicaciones y herramientas alrededor de CUDA centrado en el mundo científico y la ingeniería y en ramas distintas de cada uno. Desde la medicina hasta en el diseño de automóviles. Lo cual le permitió crecer a NVIDIA más allá del hardware para juegos de PC y ampliar su cuota de mercado potencial.
CUDA, además, es una filosofía a la hora de programar algoritmos que se ejecutarán en una GPU de NVIDIA. Aunque también hay posibilidades de hacerlo en un procesador central e incluso en un chip de la competencia. En la actualidad existen diversos lenguajes de programación que tienen las extensiones CUDA correspondientes. Entre los que se incluyen: C, C++, Fortran, Python y MATLAB.
Diferencia entre núcleos de CPU y núcleos CUDA
La denominación nos puede llevar a engaño, si seguimos la visión tradicional de núcleo de los procesadores. Los núcleos CUDA difieren en bastante con respecto a los núcleos de los procesadores. NVIDIA lo que hace es denominar núcleos a unidades aritmético-lógicas o ALU en inglés como núcleos. Estas unidades tienen una enorme capacidad de realizar cálculos matemáticos a gran velocidad. La denominación CUDA Core vendría a ser un nombre más comercial.
En el caso de las tarjetas de NVIDIA, lo que es el equivalente real a un núcleo o procesador son los llamados SM. Así, por ejemplo, una RTX 3090 Ti pese a tener 10.752 núcleos CUDA realmente tiene 84 núcleos reales, dado que esa es la cifra de SM reales. Pensad que un procesador ha de ser capaz de ejecutar el ciclo de instrucción al completo por sí mismo y no una sola parte, como es el caso de los mal llamados «núcleos CUDA».
Los núcleos CUDA de las GPUs están diseñados para ejecutar tareas de computación paralela, por lo que son mucho más rápidos y eficientes que los núcleos de CPU diseñados para realiza tareas secuenciales. Los núcleos CUDA, además, es escalables, por lo que permite agrupar en un equipo varias GPUs para ofrecer un mayor rendimiento sumando el número total de núcleos CUDA.
Los racks que vende NVIDIA para entrenar LLM para Inteligencia Artificial, estás compuestos por un único procesador para servidor, ya sea Intel Xeon o AMD Epyc y entre 6 y 10 GPUs. Y solo se encuentra un único procesador porque los núcleos de las CPU no son tan fácilmente escalables, además de tener un precio muy elevado y el resultado no siempre es la suma de núcleos que ofrece.
Este es uno de los motivos por el que los procesadores para servidores tienen un número mayor de núcleos que los procesadores de equipos de sobremesa. Un ejemplo de esto que estamos diciendo lo encontramos en la gama de procesadores para servidor AMD EPYC Serie 9005 disponibles con hasta 192 núcleos Zen 5 o Zen 5c.
Tipos de núcleos CUDA
Por lo general llamamos a las unidades de coma flotante con precisión de 32 bits como núcleos CUDA, pero también se engloban dentro de la definición otro tipo de unidades, las cuales son:
- Unidades ALU con la capacidad de trabajar con números de coma flotante de doble precisión, es decir, de 64 bits.
- Las unidades de enteros de 32 bits.
Debido a que las GPU no utilizan un sistema de paralelismo con respecto a las instrucciones, lo que se hace es utilizar ejecución concurrente. Donde una unidad de un tipo puede reemplazar a la de otro tipo en la ejecución de una instrucción. Esto es una habilidad que los chips de NVIDIA tienen desde la arquitectura Volta en adelante, en el caso de los sistemas de sobremesa, desde la RTX 20.
En cambio, no son núcleos CUDA, las siguientes unidades de los SM en la GPU:
- Tensor Cores: Nuevo tipo de unidades de computación cuyo propósito se centra en la inteligencia artificial. Son bastante conocidos en el segmento de los videojuegos, ya que estos núcleos son necesarios para el funcionamiento de la tecnología DLSS.
- RT Cores: Es otro tipo de núcleo bastante nuevo que se centra solamente en los cálculos de trayectorias de rayos de luz para la tecnología Ray Tracing.
- SFU: Son un tipo de núcleo que tiene la capacidad de ejecutar instrucciones matemáticas complejas a más velocidad que las ALU convencionales. Entre las instrucciones soportadas se incluyen operaciones trigonométricas, raíces cuadradas, potencias, logaritmos, etcétera.
Las cuales, pese a ser también unidades de aritmético-lógicas, no son contadas por NVIDIA como tales.
¿Cómo funcionan?
Antes de nada, debes saber que las CPU tienen un diseño para realizar las tareas de manera secuencial. Esto quiere decir que las tareas se ponen en cola y se procesan por orden de llegada. Algunas se pueden saltar esta cola si tienen una elevada prioridad.
Los núcleos CUDA de NVIDIA funcionan de una manera muy distinta, ya que han sido desarrollados para ejecutar tareas en paralelo. Esto quiere decir que cada núcleo (más o menos) se encarga de realizar una tarea concreta. Todas las tareas se van repartiendo por los diferentes núcleos CUDA a medida que estos van terminando la tarea iniciada.
Debes saber que los desarrolladores pueden establecer una estructura jerárquica y agrupación de núcleos. Las tareas pueden ser divididas por los desarrolladores en «bloques» que están conformados por una determinada cantidad de núcleos CUDA. Adicionalmente, los «bloques» se pueden estructurar en «rejillas», que viene a ser una agrupación de diferentes «bloques».
¿Cómo se ejecutan las instrucciones en núcleo CUDA?
Además, la forma de ejecutar los hilos de ejecución, y esto es en general en todas las GPU, es usando una variante del algoritmo Round-Robin. El cual consiste en:
- Las instrucciones se clasifican en grupos según la cantidad de ciclos de reloj que tardan en ejecutarse desde cada una de las ALU/Stream Processors/núcleos CUDA.
- Si la instrucción en un hilo de ejecución no se ha ejecutado en el tiempo determinado, entonces esta se mueve a la cola y se ejecuta la siguiente de la lista. La cual no tiene por qué corresponder al mismo hilo de ejecución de la primera.
Hay que tener en cuenta que las escenas complejas en 3D están compuestas a día de hoy por millones de elementos visuales para formar las complejas escenas y que se formen a una velocidad lo suficientemente rápida. Por lo que los núcleos CUDA son la base de conseguir procesar en paralelo y en gran velocidad todos esos elementos.
Tienen como ventaja la ejecución de los datos dentro de los registros y, por tanto, en la memoria interna de cada SM. Así que no contiene instrucciones de acceso directo a la memoria VRAM.
El ecosistema, por tanto, está pensado para que los hilos de ejecución sean dirigidos desde la memoria a cada uno de los núcleos de la GPU. Mediante este sistema se reduce la posibilidad de atascos de acceso a la memoria. Supone un importante cambio con respecto al sistema convencional de acceso a la memoria.
No pueden ejecutar programas convencionales
Los hilos de ejecución que ejecutaran los núcleos CUDA son creados y gestionados por el procesador central del sistema y son creados en grupos por parte de la API al enviar las listas de comandos gráficos o para computación. Cuando el procesador de comandos del chip gráfico lee las listas de comandos, estos se encuentran clasificados en bloques que son distribuidos cada uno de ellos a un SM o núcleo real distinto. Desde allí, el planificador interno desgrana los hilos de ejecución según el tipo de instrucción y los agrupa para irlos ejecutando.
Esto significa que no pueden ejecutar programas convencionales, debido a esta particular forma de funcionar de los núcleos en las GPU de las tarjetas gráficas, ya que su naturaleza se lo impide. Es por ello que no podéis instalar ningún sistema operativo ni ejecutar ningún programa convencional en ellos.
Diferencia entre NVIDIA CUDA y AMD Stream Processors
Aunque parezca mentira, no existe una unificación en el término de núcleo, ni tan siquiera, en los procesadores. Si bien todos estamos de acuerdo en la denominación basica, cada fabricante los bautiza de manera diferente posteriormente. Algo así sucede en las tarjetas gráficas.
Pese a que son iguales, prácticamente iguales, los núcleos (bueno, las ALU) cada fabricante les ha puesto un nombre. NVIDIA los ha bautizado como CUDA Cores, mientras que AMD los denomina como Stream Processors. Cambiarán aspectos menores, como el proceso de fabricación o diseño, entre otros ajustes.
Realmente, en el caso de NVIDIA, el término CUDA no solo referencia a los núcleos, sino también a un conjunto de instrucciones y herramientas para desarrolladores. Podemos hablar que se ha construido un entorno en torno a este tipo de núcleos con su misma denominación. AMD, como es lógico, cuenta con su ecosistema de instrucciones y herramientas, aunque tienen otras denominaciones.
Por cierto, un Stream Processor o Procesador de Caudal en su correcta definición es todo aquel procesador que depende directamente del ancho de banda de su memoria RAM asociada y no de la latencia. Así pues, un chip gráfico o GPU lo es, pero, en cambio, una CPU que depende más de la latencia no. Por otro lado, desde el momento en que los chips de NVIDIA y AMD entienden binarios distintos es imposible ejecutar un programa CUDA en una GPU que no sea de NVIDIA.
Núcleos NVIDIA CUDA | AMD Stream Processors | |
---|---|---|
¿Qué son? | Unidades ALU | Unidades ALU |
¿Dónde se encuentran? | En las GPU de NVIDIA | En las GPU de AMD |
¿Pueden ejecutar programas CUDA? | Si | No |
Al final se trata del mismo correo con distinto collar, ya que la función tanto de los núcleos CUDA como de los Stream Processors es exactamente la misma y se encarga de medir la potencia de procesamiento. Básicamente, lo más importante a la hora de comprar una tarjeta gráfica, es la cantidad de memoria que ofrezca de que tipo. La memoria más rápida para gráficas disponible actualmente en el mercado es la GDDR7, seguida de la GDDR6X y GDDR6.