Tutoriales

GPGPU: ¿qué es y para qué sirve?

Las microarquitecturas de CPU han avanzado mucho pero, aunque se usen para procesamiento genérico, no son las mejores en todo. Por eso nació un nuevo paradigma hace unos años, como es el de la computación heterogénea. Y uno de los puntos más importantes de este tipo de computación es la denominada GPGPU, en la que nos centraremos en este artículo.

Quizás también te interese conocer:

Introducción

Intel Core

Aunque hasta que apareció la computación heterogénea no tenía nombre, ahora que sí que existe se le ha dado el nombre de computación homogénea. Es decir, se trata de aquellos sistemas en los que la CPU se encarga de la computación, usando procesadores o unidades similares para este fin.

¿Qué es la computación heterogénea?

AMD Servidor computación heterogénea GPGPU
21744759_AMD EPYC (Milan) 2P Server_2.png

Sin embargo, a diferencia de la computación homogénea o tradicional, cada vez se van integrando más tipos de procesadores al sistema, para que trabajen juntos y cada uno haga lo que mejor sabe hacer, por decirlo de un modo simple. Por ejemplo, la CPU podría procesar los gráficos, pero tardaría mucho, por eso está la GPU.

Actualmente existen multitud de tipos de procesadores diferentes, cada uno con sus ventajas y desventajas, y cada uno destacando en el procesamiento de un tipo de aplicaciones. Por ejemplo, tenemos la CPU, la GPU, DPU, VPU, DSP, FGPA como aceleradores dedicados, ASICs, NPUs, etc.

En la computación heterogénea se asignará a cada uno de ellos diferentes cargas de trabajo par alas cuales están especializadas o resultan tener mayor rendimiento y/o eficiencia energética. Por ejemplo, si ejecutar una instrucción vectorial que generalmente se procesa en la CPU se podría hacer en menos tiempo en una GPU ¿por qué no hacerlo? Pues bien, en esto precisamente se basa esta computación heterogénea.

Gracias a esto, el rendimiento y la eficiencia energética podrían mejorar de forma exponencial. Y esto es lo que se ha venido explotando especialmente en el sector del HPC en los últimos años. La forma de conseguir el máximo rendimiento por vatio, y minimizando los accesos a memoria.

Por ejemplo, imagina un supercomputador que usa GPU, CPU y DPU. Entonces ya se están explotando los beneficios de la computación heterogénea en él, reduciendo el tiempo de ejecución y el consumo, algo extremadamente importante en estos centros de datos.

Imagina que estás ejecutando cargas de trabajo como las de inteligencia artificial, visión artificial o aprendizaje profundo. Estas tareas necesitan procesar una gran cantidad de datos. Por eso, se pueden pasar a formato gráfico y que se encargue la GPU de ellos. Y es que estos chips, aunque trabajan a menor frecuencia que la CPU, tienen más núcleos de procesamiento.

Por la misma lógica, el uso de núcleos basados en otra ISA diferente o microarquitectura, también puede ser una buena forma de aprovechar esta computación heterogénea, como cuando hablamos de unidades como los Arm que suelen usar clusters de dos tipos de núcleo Cortex A-Series de alto rendimiento y de eficiencia, algo como lo que actualmente también está usando Intel en sus x86. De esta forma, cuando la carga de trabajo es baja se usan los E-Core, mientras que cuando es alta se usan los P-Core, de ese modo se consigue mejorar la eficiencia.

Es algo que los expertos de la industria han estado buscando de varias formas, para tratar de liberar el potencial de los actuales procesadores usándolos de otra manera. Pero claro, esto también implica adaptar el software para poder aprovechar este paradigma.

Ejemplos de implementaciones actuales

Como ejemplos de implementaciones de computación heterogénea actual, tenemos algunos muy conocidos, como por ejemplo:

  • APU AMD, que integra en el mismo chip tanto una GPU como una CPU compartiendo memoria.
  • ARM con su big.LITTLE, donde mezcla ARM Cortex A-Series de menor rendimiento y más eficiencia con núcleos Cortex A-Series de mayor rendimiento y consumo. Esto es lo que se conoce como multinúcleo heterogéneo.
  • Intel en sus procesadores con P-Core y E-Core, lo que sería similar al anterior.
  • SoCs como los de Apple, Qualcomm, Mediatek, etc., que integran en el mismo chip unidades de procesamiento como CPU, GPU, NPU, DSP, etc., para que cada una se encargue de lo que mejor sabe hacer.
  • En HPC o supercomputación, con el uso de GPGPUs y otras arquitecturas heterogéneas.

¿Qué es GPGPU?

Milan-X

GPGPU (General-Purpose Graphics Processing Unit) es un término que se refiere a una metodología de computación heterogénea moderna donde se usa la GPU para algo más que para los gráficos, como puede ser para realizar cálculos no especializados de propósito general que tradicionalmente debería de procesar la CPU.

Sin embargo, dada la arquitectura de la GPU hecha para el paralelismo, podría ejecutarlos en menor tiempo y con una mejor eficiencia energética. En definitiva, aprovechar el potencial de la GPU para propósitos generales, mejorando así el paralelismo.

No obstante, aprovechar la GPU como GPGPU implica adaptar el sosftware para ello, por lo que supone algunos retos también.

En cuanto al hardware, lo cierto es que todas las GPUs modernas son GPGPUs, no necesitan ningún tipo de cambio físico para ello, el procesador es programable y se puede aprovechar todos esos miles de núcleos que incluyen para realizar cálculos de forma simultánea, es decir, con un paralelismo masivo y de forma eficiente.

Es cierto que las GPUs no fueron diseñadas originalmente para esto, sino para procesar gráficos, pero como se ha visto, tienen mucho potencial si se usan para ciertas aplicaciones científicas. Así que ¿por qué no hacerlo?

Pues bien, esto es lo que se conoce como aceleración por GPGPU, como usan muchos sistemas HPC en la actualidad para conseguir muchos FLOPS y así poder acelerar el procesamiento de enormes cantidades de datos para los que una CPU tardaría más.

También deberías leer nuestro tutorial sobre arquitectura de GPU.

GPU vs CPU: diferencias

Para entender un poco mejor lo comentado en el apartado anterior, hay que ver cuáles son las principales diferencias entre la CPU y la GPU, y estas son:

CPU GPU
Es para propósito general: maneja las principales funciones de procesamiento de una computadora. Componente especializado: maneja la representación gráfica y de video.
Recuento de núcleos: 2-64 (la mayoría de las CPUs actuales.) Recuento de núcleos: cientos o miles (en la mayoría de GPUs actuales).
Ejecuta procesos en serie Ejecuta procesos en paralelo
Mejor en el procesamiento de una gran tarea a la vez. Mejor en el procesamiento de varias tareas más pequeñas a la vez.

Recuerda que, en lugar de ejecutar tareas en serie como la CPU, la GPU divide las tareas y las ejecuta en paralelo. Y esto es posible gracias a que la GPU tiene muchos más núcleos que la CPU, aunque sean más pequeños y simples. Pero con todos esos núcleos adicionales, se pueden manejar muchos cálculos matemáticos a la vez, «engañando» a la GPU y haciéndole creer que está procesando datos gráficos en vez de genéricos (GPGPU).

¿Cómo engañar a la GPU para que actúe como una GPGPU?

Como he comentado anteriormente, para que una GPU o tarjeta gráfica actual funcione como una GPGPU hace falta «engañarla», es decir, que los datos de las aplicaciones que queremos acelerar le lleguen como si fuesen datos de gráficos, para que los procese como haría con los gráficos normales y así obtener el resultado. Y para ello existen dos APIs destacadas:

GPGPU con NVIDIA CUDA

NVIDIA CUDA

CUDA es una plataforma de cómputo paralelo y un modelo de programación creado por NVIDIA. El SDK que usan los desarrolladores para crear aplicaciones para GPGPU solo funciona para tarjetas gráficas o GPUs de esta marca.

CUDA ayuda a los desarrolladores a aprovechar el potencial de los aceleradores por GPU en las aplicaciones de software, pero para ello se deben reescribir estos programas y así serán tratados por la GPU en vez de por la CPU. Por ejemplo:

CUDA GPGPU

Aquí puedes ver un programa estándar escrito en lenguaje de programación C para realizar una operación básica. Y a su derecha un programa también escrito en C, pero con las extensiones para CUDA necesarias. El de la izquierda sería procesado por la CPU y el de la derecha por la GPGPU.

CUDA funciona tanto con lenguaje C como con C++ y Fortran. No obstante, terceras partes han agregado también la posibilidad de hacerlo en Python, Perl, Java, Ruby, Lua, Common Lisp, Haskell, R, MATLAB, IDL, Julia, etc.

GPGPU con la API OpenCL

OPENCL GPGPU

Como he dicho, CUDA solo funciona para GPUs NVIDIA, en cambio, otras como las de Intel, AMD, Imagination, Qualcomm, etc. (también funciona en las tarjetas gráficas NVIDIA), no pueden funcionar con ese software, y lo deben hacer con la API OpenCL, que no hay que confundirla con OpenGL, que es una API gráfica.

OpenCL (Open Computing Language) es una API de Khronos Group (inicialmente creada por Apple) de bajo nivel para la computación heterogénea que usa GPGPU para el procesamiento. Con ella los desarrolladores pueden usar los núcleos de cómputo de la GPU para propósito general escribiendo en lenguaje de programación C/C++, de forma similar al ejemplo anterior con CUDA.

Además, mientras CUDA solo funciona en Windows y Linux, en el caso de OpenCL puede funcionar también en Windows, Linux, FreeBSD, macOS y Android.

Isaac

Geek de los sistemas electrónicos, especialmente del hardware informático. Con alma de escritor y pasión por compartir todo el conocimiento sobre tecnología.
Los datos de carácter personal que nos facilite mediante este formulario quedarán registrados en un fichero de Miguel Ángel Navas Carrera, con la finalidad de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento del interesado. Si no se acepta no podrás comentar en este blog. Puedes consultar Política de privacidad. Puede ejercitar los derechos de acceso, rectificación, cancelación y oposición en [email protected]
Botón volver arriba