¿Por qué el chip M1 de Apple es tan rápido?
(erik-engheim.medium.com)- M1 no es una sola CPU, sino un sistema completo con varios chips dentro de un gran paquete de silicio. La CPU es solo uno de ellos
→ Un SoC (System on a Chip) que integra CPU, GPU, memoria, controlador de I/O, etc.
- En vez de incluir muchos núcleos de propósito general, incorpora chips especializados para tareas concretas
→ CPU: ejecuta el sistema operativo y las apps
→ GPU: realiza tareas gráficas, como la UI de las apps y juegos 2D/3D
→ ISP (Image Processing Unit): aumenta la velocidad del procesamiento de imágenes
→ DSP (Digital Signal Processor): realiza funciones más intensivas en matemáticas que la CPU, como descomprimir archivos de música
→ NPU (Neural Processing Unit): acelera machine learning, reconocimiento de voz, procesamiento de cámara, etc.
→ Video Encoder/Decoder: procesa archivos y formatos de video con bajo consumo
→ Secure Enclave: cifrado, autenticación y seguridad
→ UMA (Unified Memory Architecture): permite que la CPU, la GPU y otros núcleos intercambien información rápidamente
Esta es la razón por la que estos chips sobresalen en edición de imagen/video y en codificación de video de gran tamaño
- ¿Qué tiene de especial la Unified Memory Architecture (UMA)?
→ Los chips anteriores que integraban CPU/GPU eran lentos
Ambos usaban regiones de memoria distintas y de formas distintas.
Además, como la GPU genera mucho calor, las tarjetas enormes con grandes ventiladores de enfriamiento lograban el mejor rendimiento
Pero eso obliga a copiar muchos datos entre ambos, por lo que se necesita un bus como PCIe
→ Unified Memory no asigna memoria por separado para CPU y GPU; simplemente la comparten.
A diferencia de Shared Memory, CPU y GPU pueden acceder al mismo tiempo, y como acceden compartiendo solo la información de ubicación, ya no hace falta copiar datos
- Si este enfoque SoC es tan bueno, ¿por qué otros fabricantes no lo hacen?
→ Sí lo están haciendo. AMD empezó a crear APUs con CPU y GPU en el mismo dado de silicio
→ Pero llevarlo a la práctica es difícil, porque un SoC pone toda la computadora en un solo chip, así que encaja mejor con fabricantes de computadoras como HP o Dell
→ El modelo de negocio de Intel y AMD está basado en CPUs genéricas que la gente instala en motherboards de PC,
mientras que el nuevo mercado de SoC no consiste en ensamblar productos físicos de distintos vendors, sino en ensamblar IP (Intellectual Property)
→ ¿Realmente Intel, AMD y Nvidia podrían licenciar su IP a Dell o HP?
→ Claro, Intel y AMD podrían vender SoCs terminados, pero podrían surgir conflictos de intereses entre el fabricante de CPU, el fabricante de PC y Microsoft (por ejemplo, sobre qué incluir)
→ Pero para Apple es un tema simple. Ellos hacen todo. "They control the whole widget"
- El desafío más fundamental para hacer una CPU rápida
→ Firestorm, el núcleo de CPU de propósito general rápido del M1, es realmente rápido. Esa es la diferencia frente a los ARM anteriores, que eran más lentos que AMD/Intel
→ Firestorm supera en velocidad a la mayoría de los núcleos de Intel/AMD Ryzen, algo que en teoría parecería imposible
→ ¿Cuál es la estrategia para hacer una CPU rápida?
-
Ejecutar instrucciones secuenciales más rápido
-
Ejecutar varias instrucciones en paralelo
En los 80 era fácil. Bastaba con subir la frecuencia de reloj para ejecutar las instrucciones más rápido.
Las computadoras hacen algo en cada ciclo de reloj, y ese “algo” es muy pequeño, así que una sola instrucción puede requerir varios ciclos de reloj
Pero en la era moderna hay límites para seguir aumentando la frecuencia de reloj.
"El fin de la ley de Moore"
Por eso ahora es importante ejecutar la mayor cantidad posible de instrucciones en paralelo
- ¿Multi-core o procesadores Out-of-Order?
→ Hay dos enfoques para la ejecución en paralelo
- Agregar más núcleos de CPU (desde la perspectiva del desarrollador, agregar más threads)
En teoría, los núcleos del procesador pueden ejecutar varios threads (threads de software)
Esto se ejecuta alternando entre threads, así que se usa en situaciones donde se espera algo de I/O o red
Los threads de hardware aumentan la velocidad, pero el desarrollador tiene que escribir código para aprovecharlos.
Este modelo encaja bien en servidores y la nube.
Por eso empresas como Ampere fabrican CPUs ARM para la nube como Altra Max con 128 núcleos.
Apple es exactamente lo contrario. Apple es una empresa que fabrica dispositivos para un solo usuario
La mayoría del software de escritorio no está hecho para aprovechar muchos núcleos.
Los juegos sí mejoran en 8 núcleos, pero 128 núcleos serían puro desperdicio.
Por eso se necesitan menos núcleos, pero más potentes
- La ejecución fuera de orden (Out-of-Order Execution, OoO) ejecuta más instrucciones en paralelo sin necesidad de usarlo explícitamente como en el multithreading
Desde la perspectiva del desarrollador, simplemente parece que cada núcleo funciona más rápido
Traer datos desde una ubicación concreta de memoria es lento
Pero no hay diferencia de latencia entre traer 1 byte o 128 bytes
Los datos se mueven por el data bus, y si ese bus es ancho, se pueden leer varios bytes al mismo tiempo
Cuando la CPU ejecuta, procesa varios bloques de instrucciones a la vez, aunque esas instrucciones estén escritas para ejecutarse secuencialmente
Los microprocesadores modernos ejecutan Out-of-Order.
Es decir, analizan varias instrucciones para detectar si hay dependencias entre ellas.
01: mul r1, r2, r3 // r1 ← r2 × r3
02: add r4, r1, 5 // r4 ← r1 + 5
03: add r6, r2, 1 // r6 ← r2 + 1
En las instrucciones anteriores, 1 y 2 tienen dependencia, pero la 3 no tiene relación con las anteriores.
Entonces los procesadores Out-of-Order pueden ejecutar en paralelo la instrucción 3, que no tiene dependencias.
En la práctica, la CPU puede detectar dependencias no entre una o dos, sino entre cientos de instrucciones.
La CPU conecta las instrucciones como un grafo de nodos, lo analiza y determina qué instrucciones se pueden ejecutar en paralelo y en qué puntos hay que esperar resultados antes de continuar
La razón por la que el núcleo Firestorm del M1 alcanza velocidades enormes es que su ejecución Out-of-Order es excelente.
Parece ser mejor que la de cualquier otro actor del mercado masivo, incluido Intel/AMD
- ¿Por qué la ejecución Out-of-Order de AMD e Intel es más lenta que la del M1?
→ Lo que se explicó antes en realidad se relaciona con el ROB (Reorder Buffer), y no con instrucciones normales de machine code (las que la CPU trae desde memoria para ejecutar)
Estas instrucciones forman la CPU Instruction Set Architecture (ISA), es decir, lo que llamamos x86, ARM, PowerPC, etc.
→ Internamente, la CPU ejecuta otro conjunto de instrucciones completamente distinto que el programador no ve: micro-operations (microinstrucciones, micro-ops o μops), y el ROB está lleno de estas micro-ops
→ Puede pensarse que las instrucciones ARM/x86 son la API pública, y las micro-ops son la API privada.
→ En CISC las instrucciones son grandes y complejas, así que las micro-ops son obligatorias; en RISC, usarlas o no es opcional.
(Por ejemplo, algunas CPUs ARM pequeñas no usan micro-ops. Eso no significa que no puedan hacer OoO)
→ ¿Por qué importa esto? Porque "la velocidad depende de qué tan rápido y cuánto puedas llenar el ROB"
→ Mientras más rápido se llene, más oportunidades hay de ejecutar más instrucciones en paralelo, y por tanto mejora el rendimiento
→ El machine code se divide en micro-ops mediante decodificadores.
→ Los núcleos de Intel/AMD tienen 4 decodificadores,
mientras que Apple tiene unos 8 decodificadores “de locura”, y un ROB 3 veces más grande, así que básicamente puede contener 3 veces más instrucciones
- Entonces, ¿por qué Intel y AMD no ponen más decodificadores de instrucciones?
→ Aquí empieza el contraataque de RISC. Que el núcleo Firestorm del M1 use ARM RISC es importante.
→ Las instrucciones x86 tienen una longitud de 1 a 15 bytes, mientras que en RISC el tamaño es fijo
→ Si todas las instrucciones tienen la misma longitud, basta con cortarlas y repartirlas entre 8 decodificadores distintos
→ Pero en x86 no se sabe dónde empieza la siguiente instrucción, así que no queda otra que analizar cada instrucción una por una
→ Intel y AMD resuelven este problema de forma brute-force: decodificando en cada posible inicio de instrucción
Es decir, tienen que descartar constantemente suposiciones erróneas y errores.
Por eso es difícil agregar más decodificadores, mientras que para Apple es mucho más fácil
→ Esto es, en esencia, lo que le permite procesar el doble de instrucciones que una CPU de AMD/Intel a la misma frecuencia de reloj
→ En la práctica, x86 no suele usar tanto las instrucciones CISC complejas y tiende a usar instrucciones cortas más parecidas a RISC, pero aun así tiene que soportar esas instrucciones de 15 bytes, y eso mantiene la complejidad
- Pero el núcleo Zen3 de AMD todavía es más rápido, ¿no?
→ En benchmarks, Zen3 sí es más rápido que Firestorm, pero Zen3 corre a 5 GHz y Firestorm a 3.2 GHz
→ Apple no sube la frecuencia de reloj porque el chip se calentaría demasiado.
→ En términos básicos, el núcleo Firestorm es superior a Zen3
→ Zen3 puede consumir más energía y generar más calor para usarse en gaming, pero "Apple decidió no ir por ese camino"
→ Si Apple quisiera más rendimiento, agregaría más núcleos. Así podría obtener más rendimiento con menos consumo
- Futuro
→ AMD/Intel se han ido arrinconando por dos frentes
-
No tienen un modelo de negocio que impulse la computación heterogénea y el diseño SoC
-
Las complejas instrucciones x86 CISC se volvieron legado y dificultan mejorar el rendimiento OoO
→ Claro, no es game over. Todavía pueden subir más el clock, mejorar la refrigeración, usar más núcleos...
→ Intel está en peor posición. Ya pierde contra Firestorm en velocidad de núcleo, y además la GPU que mete en sus SoC es floja.
→ Muchos núcleos son naturalmente buenos para servidores, pero Amazon y Ampere están presionando con 128 núcleos. Intel/AMD tienen que pelear en ambos frentes
→ Por suerte para AMD/Intel, Apple no vende sus chips en el mercado
→ Tal vez no de inmediato, pero los usuarios de PC irán migrando poco a poco a Apple, y Apple ganará más participación en el mercado de PC
17 comentarios
Escribes realmente muy bien.
Muchas gracias por explicarlo y organizarlo todo de una forma tan fácil de entender. ¡Lo máximo!
Gracias por el buen contenido.
¡¡Gracias!!
Quería comprar un dispositivo con M1, pero parece que en vez de eso debería haber comprado acciones..
¡Gracias por el buen artículo!
Yo también voto por que las acciones de Apple tienen un alto valor a futuro.
Siento que en algún momento de verdad va a salir el Apple Car.
Parece que el modelo de memoria débil se está volviendo cada vez más importante... Apple ahora de verdad se está convirtiendo en una empresa cerrada que puede hacerlo todo, desde el chip y el ensamblaje hasta el hardware, el OS y las apps (tal como soñaba Jobs).
Yo también estoy pensando que mi próximo equipo será una Mac mini con M1 o una MacBook Air.
Yo también pasé de una MacBook Pro 2015 a una M1... ¡dicen que llega a fin de año o a comienzos del próximo!
Revisé hoy y ya salió en el mercado local.
¡Guau! ¡Gurú, de verdad eres lo máximo!!
Gracias ;)
En ese artículo también hay una comparación entre RISC y CISC que escribió el autor, y la recomiendo muchísimo. Explica de forma muy fluida por qué llegaron a tener ese tipo de arquitectura de instrucciones.
Básicamente, parece ser una persona que escribe muy bien. Este artículo también es bastante largo, pero se lee muy bien.
Vaya, gracias por el excelente contenido.
¡Gracias!
Se siente como volver a tomar una clase de arquitectura de computadoras jaja
Al final, Apple tiene una estructura en la que no le queda otra más que seguir mejorando en lo que mejor sabe hacer.
¿Y ahora qué harán Intel y AMD..?
En el episodio 16 del podcast de GeekNews que subí hoy, presenté brevemente el truco de
Memory-Orderdel chip M1, pero este es otro artículo detallado desde una perspectiva distinta.Parece que también volveremos a hablar de esto en el podcast de la próxima semana ^^;