Contexte et motivation
Le projet de rétro‑ingénierie de l’Apple Neural Engine (ANE) du SoC M1 vise à cartographier l’ensemble du datapath, du planificateur et du modèle d’exécution. L’auteur a interrompu le travail il y a trois ans, estimant que le bloc ANE était trop spécialisé pour devenir une plateforme d’accélération généraliste. La décision d’Apple d’intégrer les cœurs ANE dans le GPU du M5 (2025) confirme la fin probable du NPU autonome, ce qui rend l’analyse du M1 d’autant plus pertinente pour comprendre les hypothèses de conception initiales.
Architecture interne du cœur de calcul
L’ANE du M1 comporte 16 cœurs de calcul parallèles. Chaque cœur possède 128 unités MAC en virgule flottante 16 bits (ou 256 en INT8), soit 2048 MACs simultanés (128 × 16). Le diagramme suivant, extrait du reverse‑engineering, illustre le datapath d’un cœur :
┌────────────────────── core ─────────────────────┐
│ ┌───────── 256× MACs ─────────┐ ┌────────────┐ │
│ │ MAD ─► add ─► accumulator │─►│ activation │ │
│ │ ▲ │ │ └────────────┘ │
│ │ └──────────┘ │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────────────────┘Chaque MAC réalise la récurrence s←s+a×b, où le produit a×b est ajouté à un accumulateur 32 bits. L’accumulateur utilise un format fixe Q16.16 : 16 bits de fraction, 16 bits d’entier signé, ce qui impose une saturation à 2¹⁵. Cette limite a été confirmée en injectant un vecteur de valeurs unitaires ; la somme atteint 256 × v et se clamp à 0x7c00, correspondant à la borne supérieure du registre.
Modèle de données et flux d’exécution
Le MAC ne connaît pas la dimension du tenseur qu’il réduit ; la distinction entre produit scalaire, multiplication matricielle ou convolution dépend entièrement de la façon dont les opérandes sont mappés dans le temps et l’espace. Le planificateur place les entrées dans les registres locaux, évitant tout aller‑retour avec la mémoire externe. Une fois le résultat d’un MAC disponible, il est directement acheminé vers le bloc d’activation point‑wise, sans écriture intermédiaire. Cette architecture minimise la latence et la bande passante, mais elle repose sur des motifs de réutilisation très prévisibles, typiques des réseaux CNN de 2017.
Pour les fonctions non linéaires, le reverse‑engineering a extrait la table de coefficients de la fonction tanh() dans le registre matériel (hwx) à l’adresse 0x4288. La séquence de 33 mots FP16 représente une approximation piecewise‑linear de tanh, confirmant que les activations sont implémentées par des tables de lookup plutôt que par des calculs dynamiques.
Limites et perspectives d’évolution
Le design de l’ANE montre clairement une orientation vers des charges de travail à forte densité de MACs et à réutilisation locale, comme les convolutions 2D. Les transformeurs, qui nécessitent des accès plus aléatoires aux poids (attention), ne profitent pas pleinement du flux de données linéaire de l’ANE. Le fait qu’Apple ait déplacé les cœurs ANE dans le GPU du M5 indique que la flexibilité du GPU (support natif du tensor core et du data‑flow hybride) est jugée supérieure. De plus, la saturation de l’accumulateur à 2¹⁵ limite la dynamique des calculs en FP16, imposant des stratégies de scaling qui ne sont pas toujours triviales pour les modèles de grande taille.
En conclusion, l’ANE du M1 constitue un accélérateur très spécialisé : 2048 MACs, accumulation locale en Q16.16, activation intégrée via tables, et un datapath optimisé pour les motifs de réutilisation des CNN. Ces choix offrent une efficacité énergétique élevée pour les charges ciblées, mais restreignent la portabilité vers les workloads modernes basés sur les transformeurs, expliquant la migration d’Apple vers une intégration GPU‑centrée.