SIMD no es tan difícil como crees: el superpoder oculto de tu CPU que acelera tu código hasta 16x

Primer plano de un microchip de computadora con luces naranjas y azules
SIMD permite que un solo núcleo de CPU procese múltiples datos a la vez. Foto: Unsplash

¿Sabías que la mayoría de los programadores estamos desperdiciando entre el 80% y el 94% de la capacidad real de nuestros procesadores?

No es culpa tuya. SIMD (Single Instruction, Multiple Data) tiene fama de ser ese tema oscuro que solo los ingenieros de juegos y los que escriben compiladores entienden. Algo complejo, lleno de intrinsics crípticos y registros raros.

Pero esa reputación está completamente equivocada.

Mitchell Hashimoto —sí, el creador de Vagrant, Packer, y fundador de HashiCorp— acaba de publicar una guía que desmonta este mito pieza por pieza en su blog. Y la comunidad de Hacker News lo recibió con 400 puntos y 150 comentarios en horas. Porque toca un nervio: todos sabemos que deberíamos entender SIMD, pero nadie nos enseñó.

¿Qué es SIMD y por qué debería importarte?

SIMD le permite a tu CPU operar sobre múltiples valores al mismo tiempo con una sola instrucción.

En lugar de comparar un byte a la vez, tu CPU puede comparar 4, 8, 16 o más bytes con una sola operación. Así de simple.

El resultado: un loop que procesaba datos de a uno puede acelerarse 4x en ARM (Apple Silicon), 8x en CPUs modernas con AVX2, y hasta 16x si tienes AVX-512. Sin cambiar de hardware. Sin comprar servidores más caros. Solo escribiendo el código de manera distinta.

El patrón de 5 pasos que lo cambia todo

Hashimoto descubrió que todo código SIMD del mundo real sigue exactamente 5 pasos:

  1. Broadcast constantes — prepara los valores que necesitas en registros vectoriales
  2. Loop de un vector a la vez — itera sobre los datos en chunks del tamaño del vector
  3. Operación SIMD — suma, compara, multiplica todos los elementos en paralelo
  4. Reduce el resultado — combina el vector en un valor escalar si es necesario
  5. Tail escalar — procesa los elementos que sobran (siempre hay algunos que no entran en el vector)

Cinco pasos. Nada más. Una vez que entiendes este patrón, escribir SIMD se vuelve casi tan natural como escribir un for loop normal.

El caso real: Ghostty acelerado 5x

Hashimoto aplicó esto en Ghostty, su terminal emulador escrito en Zig. El caso práctico: un loop que busca el siguiente carácter de control C0 en un slice de codepoints.

La versión escalar era una línea:

const search_len = for (slice, 0..) |c, i| if (c < 0x20) break i else slice.len;

La versión SIMD: 12 líneas adicionales. Nada del otro mundo.

¿El resultado? 5x de aceleración en rendimiento real de extremo a extremo. En un Intel de escritorio con AVX2, la mejora fue de 5x en la terminal completa, no solo en el micro-benchmark.

12 líneas por 5x más velocidad. Eso es una de las mejores relaciones esfuerzo/recompensa que existe en optimización de software.

¿Por qué el compilador no hace esto solo?

Buena pregunta. Los compiladores modernos pueden auto-vectorizar loops simples, pero tienen limitaciones enormes:

El compilador no lee tu mente. Tú sabes qué está haciendo tu algoritmo a alto nivel. El compilador solo ve instrucciones sueltas. Por eso escribir SIMD manualmente sigue dando ventajas enormes en 2026, décadas después de que se inventara esta tecnología.

¿Qué lenguajes lo soportan?

Zig (el que usó Hashimoto) tiene soporte nativo para SIMD genérico sin intrinsics de CPU específica. Rust tiene std::simd estabilizándose. C y C++ tienen headers intrínsecos en cada plataforma. Python tiene NumPy que usa SIMD por debajo. Go tiene el paquete golang.org/x/sys/cpu.

El concepto es universal. Lo que cambia es la sintaxis, no la idea.

La trampa mental que nos frena

El mayor obstáculo para aprender SIMD no es técnico. Es mental. Nos han vendido la idea de que SIMD es para "ingenieros de verdad" que escriben kernels de videojuegos o procesan señales de radar. Para el resto, está el compilador y ya.

Pero la realidad es que cualquier desarrollador que escribe loops sobre datos —archivos, buffers de red, imágenes, logs, bases de datos en memoria— tiene oportunidades de usar SIMD. Y no necesitas entender AVX-512 para empezar.

Empieza con el patrón de 5 pasos. Busca un loop en tu código que procese al menos cientos de elementos. Si hace una comparación o una suma simple, SIMD te dará 4x de velocidad en tu primera implementación.

Conclusión: SIMD es para todos

La publicación de Hashimoto no es un tutorial avanzado para expertos. Es una invitación abierta a que cualquier programador pierda el miedo a SIMD. Y la recepción de la comunidad demuestra que había mucha gente esperando esa invitación.

SIMD no es magia negra. Es un patrón de 5 pasos que cualquier dev puede aprender en una tarde. Y cuando tu loop de 1 segundo se convierte en 0.2 segundos, te preguntarás por qué no lo hiciste antes.

Comparte esto si crees que más programadores deberían conocer el poder oculto de su propia CPU.