5 puntos por GN⁺ 2023-10-22 | 1 comentarios | Compartir por WhatsApp
  • Una comprensión básica de la computación con GPU es esencial para todo ingeniero de software.
  • Este artículo se centra principalmente en las GPU de Nvidia y utiliza la terminología de Nvidia.
  • Las GPU están diseñadas para procesamiento masivo en paralelo y alto rendimiento en gráficos, cálculo numérico, aprendizaje profundo y más.

Comparación entre CPU y GPU

  • La CPU está diseñada para la ejecución secuencial de instrucciones e incluye diversas funciones para reducir la latencia en la ejecución de instrucciones.
  • La GPU está diseñada para procesamiento masivo en paralelo y alto rendimiento, y presenta una latencia de ejecución de instrucciones de media a alta.
  • La GPU puede procesar una cantidad mucho mayor de operaciones mucho más rápido que la CPU.

# Arquitectura de la GPU

Arquitectura de cómputo de la GPU

  • La GPU está compuesta por un arreglo de multiprocesadores de streaming (SM).
  • Cada SM incluye varios procesadores de streaming (núcleos o hilos).
  • Un SM tiene una cantidad limitada de memoria en chip (memoria compartida o scratchpad), compartida por todos los núcleos.

Arquitectura de memoria de la GPU

  • La GPU cuenta con varios tipos de memoria organizados en múltiples niveles.
  • Cada SM tiene una gran cantidad de registros, que se comparten entre los núcleos.
  • La caché de constantes se usa para almacenar en caché datos constantes utilizados durante la ejecución del código.
  • La memoria compartida es una memoria SRAM programable en chip, rápida y de baja latencia.
  • La caché L1 almacena en caché datos de acceso frecuente desde la caché L2.
  • La caché L2 es compartida por todos los SM y almacena en caché datos de acceso frecuente desde la memoria global.
  • La memoria global es una DRAM de alta capacidad y alto ancho de banda que está lejos de los SM, por lo que tiene una latencia alta.

# Entendiendo el modelo de ejecución de la GPU

Breve introducción a los kernels de CUDA y los bloques de hilos

  • CUDA es una interfaz de programación para escribir programas para GPU de Nvidia.
  • Un kernel es un cálculo expresado de forma similar a una función en C/C++ que se ejecuta en paralelo en la GPU.
  • Para ejecutar un kernel, se lanza una cantidad de hilos llamada grid.

Etapas de la ejecución de un kernel en la GPU

  1. Copiar datos del host al dispositivo
  2. Programar bloques de hilos en los SM
  3. Instrucción única, múltiples hilos (SIMT) y warps
  4. Programación de warps y tolerancia a la latencia
  5. Copiar los datos de resultado desde el dispositivo a la memoria del host

# Conceptos de partición de recursos y occupancy

  • La utilización de los recursos de la GPU se mide con la métrica llamada "occupancy", que representa la proporción entre la cantidad de warps asignados y la cantidad máxima de warps que un SM puede soportar.
  • El occupancy está limitado por los recursos de ejecución del SM, los registros, la memoria compartida, los slots de bloques de hilos y los slots de hilos.
  • Es importante minimizar la latencia manteniendo un occupancy alto mediante la optimización del código.

# Resumen

  • Una GPU está compuesta por varios SM, y cada SM tiene varios núcleos de procesamiento.
  • La memoria global está lejos del chip y tiene una latencia alta.
  • Las cachés L1 y L2 funcionan de forma similar a las cachés L1/L2 de la CPU.
  • Cada SM tiene memoria compartida, que se comparte entre los núcleos.
  • Para ejecutar un kernel en la GPU, se lanza una grid de hilos.
  • La GPU asigna los bloques que se ejecutarán en los SM, y todos los hilos se ejecutan en el mismo SM.
  • Los hilos asignados a un SM se agrupan además en unidades de 32 llamadas warps.
  • La GPU realiza partición dinámica de recursos entre hilos según los requisitos de los hilos y los límites del SM.

# Cierre

  • Las GPU se usan ampliamente hoy en día, y su arquitectura y modelo de ejecución son fundamentalmente distintos de los de la CPU.
  • Este artículo cubre varios aspectos de la GPU y ofrece una visión de por qué se usa tanto y cómo funciona.

Opinión de GN⁺

  • La GPU es una tecnología esencial para el aprendizaje profundo y los cálculos numéricos complejos, y este artículo ayuda a comprender la arquitectura básica y el modelo de ejecución de la GPU.
  • Contiene contenido especialmente importante para ingenieros de software principiantes interesados en el procesamiento en paralelo y la computación de alto rendimiento.
  • Este artículo ofrece conocimientos básicos sobre programación de GPU y es un material interesante que despierta la curiosidad por este campo.

1 comentarios

 
GN⁺ 2023-10-22
Comentarios de Hacker News
  • Este artículo ha sido criticado por estar demasiado centrado en Nvidia e ignorar otras alternativas válidas como SYCL, Sapphire Rapids y MI300 de AMD.
  • Se señala que falta una mención a la copia asíncrona para evitar que la GPU quede inactiva durante la transferencia de datos.
  • El artículo es elogiado como una buena introducción a la programación de GPU, aunque se sugiere explorar técnicas más avanzadas.
  • Algunos lectores cuestionan la precisión de la afirmación del artículo de que la ley de Little de la teoría de colas se aplica a las GPU.
  • La explicación del artículo sobre la arquitectura de memoria ha sido criticada por no mencionar que las cachés no garantizan coherencia entre hilos.
  • Se propone renombrar la GPU como PPU (Parallel Processing Units) para reflejar mejor sus capacidades.
  • El artículo es elogiado como una de las mejores explicaciones sobre programación de GPU y se recomienda usarlo para mentoría.
  • La programación SIMD se describe como "salvaje", con cálculos sencillos para todos los píxeles pero dificultades con las condiciones de bifurcación.
  • Se planteó una pregunta sobre la eficiencia de usar la GPU para ciertas tareas de cálculo sobre arreglos, considerando la necesidad de transferir datos hacia la GPU y recuperarlos desde ella.