ARM NEON

Cet article est une ébauche concernant le matériel informatique.

Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants.

L'ARM NEON également appelé Advanced SIMD ou encore « MPE » (de l'anglais media processing engine, littéralement « moteur de calcul de médias ») est une unité de calcul de type SIMD, accélérant les calculs de type DSP, apparu en 2009 et intégré à la série de microprocesseurs ARM Cortex-A, d'architecture ARMv7A. Elle reprend certains principes des SIMD précédents d'ARM, mais apporte 3 fois plus de performance que celui du processeur VFP (de l'anglais « vector floating point » pour virgule flottante vectorielle) présent dès l'ARMv5 (VFPv2) et deux fois plus que le SIMD implémenté dans l'ARMv6 en plus de l'unit VFP[1]. Dans l'architecture ARMv7, le VFP est remplacé par VFPv3 (VFPlite pour la révision r1p1 du Cortex-A8) et le SIMD par l'Advanced SIMD ou NEON.

Caractéristiques générales

Si les unités VFP sont compatibles avec la norme IEEE 754[2], assurant ainsi un bon niveau de précision, ça n'est pas le cas de Neon[3],[4].

Il contient 32 registres 64 bits qui peuvent être combinés pour former 16 registres 128 bits. Ceux-ci sont partagés avec le FPU (VFPlite, VFPv3 ou VFPv4 selon les modèles) du processeur. Ces registres sont considérés comme des vecteurs d'éléments qui sont tous du même type avec les particularités suivantes [1]:

  • Les types de données peuvent également être de type entier, signés ou non-signés sur 8, 16, 32 ou 64 bits, ou des flottants simple précision ;
  • Les mêmes instructions peuvent être exécutées sur tous les canaux de calcul.

Il fournit l'accélération des calculs vectoriels, standardisé pour les applications de traitement du signal ou des médias. Par exemple, filtre de couleurs au format ARGB, des opérations sur des vecteurs de type (x, y, z) ou bien de la compression et décompression d'un signal audio ou vidéo.

Il est obligatoirement inclus dans l'ARM Cortex-A8, mais, tout comme le VFP est optionnel sur l'ARM Cortex-A9 MPCore[5].

Il supporte l'accélération des codecs MPEG-4, H.264, On2 VP6/7/8, Real, AVS.

NEON peut faire du décodage MP3 sur un processeur fonctionnant à 10 MHz et peut encoder et décoder le codec audio GSM AMR à 13 MHz.

Il contient un jeu d’instruction, un registre de fichiers séparé et de l’exécution matérielle indépendante[6].

Jeu d'instructions

Le jeu d'instructions de Neon partageant les mêmes registres que celui de VFP, ils peuvent être complémentaire dans le traitement de leurs données.

ARMv7

Au sein de l'architecture ARMv7, le jeu d'instructions peut être divisé en différentes catégories[7] :

  • Déplacement des données : chargement depuis la mémoire, sauvegarde en mémoire, copie d'un registre à un autre ;
  • Arithmétique : addition, soustraction, multiplication, différence absolue, maximum, minimum, saturation arithmétique, réciproque, racine carrée, multiplication-addition, multiplication-soustraction, division par 2-addition, multiplication-accumulation, opération dépendant d'une valeur scalaire ;
  • Logique : opérateurs applicables à des champs de bits, tels que ou, ou exclusif, et, négation et mise à zéro.
  • Comparaison : sur une valeur absolue ou la donnée d'un registre, >, ≥, =, ≤, <.
  • Compression, décompression : données conservées dans les registres ou les 'canaux' de traitement dans des vecteurs.
  • En fonction des implémentations, il peut exécuter jusqu'à 4 opérations 32 bits, 8 opérations 16 bits ou 16 opérations 8 bits simultanément[8]

ARMv8

Cette section est vide, insuffisamment détaillée ou incomplète. Votre aide est la bienvenue ! Comment faire ?

ARMv8 fonctionne en 2 modes, Aarch32, compatible avec ARMv7 et Aarch64 bénéficiant pleinement des avancées de la nouvelle architecture.

Support logiciel de NEON

Ne10

ProjectNe10 est une bibliothèque logicielle libre comportant des optimisations pour NEON en assembleur pour différentes fonctions tels que l'algèbre linéaire, le traitement du signal ou le traitement d'image, crée à la base par Zhang Yang (张洋), d'ARM[9].

Compilateur GNU

Depuis 2008, le compilateur GNU GCC comporte des algorithmes d'auto-vectorisation pour les SIMD[10], il supporte notamment NEON avec l'auto-vectorisation du code source. Les premiers tests de vectorisation ont été faits par Jun Zhou de l'université de Griffith, en Australie[7] ils donnent une plus grande efficacité consommation électrique/puissance de calcul aux SIMD des ARM que ceux des x86. Les optimisations manuelles semblent également donner de bien meilleurs résultats. Cela a conduit à différentes techniques d'amélioration de la vectorisation automatique des boucles (ou auto-vectorisation).

La version 4.7 de GCC auto-vectorise en 128 bits par défaut, et repasse en 64 bits, si ça n'est pas possible[11].

Depuis la version 4.8.0, sortie le , il comporte un nouveau modèle de vectorisation pour améliorer l'auto-vectorisation à destination de ce SIMD[12]. Il faut noter qu'en raison de sa non-conformité avec la norme de précision IEEE 754, il est davantage orienté multimédia que calcul scientifique, il faut utiliser l'option -funsafe-math-optimizations pour bénéficier de l'auto-vectorisation.

Algèbre linéaire

Autres

Parmi les logiciels comportant des optimisations en assembleur pour NEON, on peut citer :

  • La bibliothèque d'encodage/décodage multimédia ffmpeg[14].
  • La bibliothèque de compression/décompression vidéo x264 pour le codec H.264[15].
  • La bibliothèque de traitement d'image jpeg libjpeg-turbo, modification de libjpeg avec le support de l'accélération de différents SIMD par optimisation en assembleur.
  • La bibliothèque de rendu géométrique Cairo (bibliothèque Pixmap du projet, depuis la 0.22.0[16]).
  • La bibliothèque graphique libre de dessin vectoriel 2D, Skia, utilisé par Android[15], Chrome OS (et Chromium OS), Chrome (et Chromium), Firefox, FirefoxOS.
  • La bibliothèque de chiffrement OpenSSL depuis la version 1.0.1[17]
  • La bibliothèque de chiffrement NaCl de Daniel J. Bernstein (en cours d'optimisation en )[18], dont des développeurs d'OpenSSL veulent s'inspirer pour implémenter Curve25519 dans OpenSSL[19].
  • La bibliothèque libre BlueZ de gestion du bluetooth notamment sous Linux[15].

Annexes

Bibliographie

  • (en) Haoliang Qin, « Boost Software Performance on Zynq-7000 AP SoC with NEON », sur Xilinx,
  • (en) NEON Programmer’s Guide, ARM, (lire en ligne) (enregistrement nécessaire).
  • (en) Cortex™-A7 NEON™ Media Processing Engine – Technical Reference Manual – Revision: r0p5, ARM, (lire en ligne) ((en) « Cortex™-A7 NEON™ Media Processing Engine – Technical Reference Manual – Revision: r0p5 », ARM, version PDF)
  • (en) Mike Anderson, « ARM NEON Instruction Set and Why You Should Care », sur elinux.org,
  • (en) RealView® Compilation Tools Assembler Guide, ARM (lire en ligne), Chapter 5. NEON and VFP Programming

Liens externes

(en + ja + zh-CN) « NEON », sur arm.com
(en) « NEON™ Support in Compilation Tools Development Article » ((en) « version PDF », sur infocenter.arm.com)
(en) « Optimizing Code for ARM Cortex-A8 with NEON SIMD » [archive du ], sur pixhawk.ethz.ch (consulté le ) explications sur le fonctionnement de Neon et certains moyens pour optimiser le code.
(en) Jiangning Liu, « The implementation of AArch64 Neon™ in LLVM » [archive du ], sur hellogcc.org (consulté le )

Notes et références

  1. a et b (en)NEON sur arm.com
  2. http://www.arm.com/products/processors/technologies/vector-floating-point.php
  3. (en) 3.17.4 ARM Options on GCC documentation
  4. (en) Q1. Is ARM support included in the latest stable (3.10) release of ATLAS? (ATLAS FAQ)
  5. « Cortex-A9 Processor », Arm.com (consulté le )
  6. « About the Cortex-A9 NEON MPE », Arm.com (consulté le )
  7. a et b (en) Use of SIMD Vector Operations to Accelerate Application Code Performance on Low-Powered ARM and Intel Platforms sur le site de l'université de Griffith, en Australie.
  8. (en)Mali™ GPU - Version: 1.0 - Application Optimization Guide - 4.8 Use vector instructions
  9. (en) Ne10 Library Getting Started sur les blogs des ingénieurs d'ARM
  10. Auto-vectorization in GCC
  11. (en) « GCC 4.7 Release Series - Changes, New Features, and Fixes », sur gnu.org (consulté le ).
  12. (en) GCC−4.8 changes sur gcc.gnu.org
  13. (en) FAQ - Which SIMD instruction sets are supported by Eigen?
  14. (en) « This One's For You, Mru »
  15. a b et c Anderson 2011.
  16. (en) « [ANNOUNCE] pixman stable release 0.22.0 now available »
  17. (en) « OpenSSL - News, ChangeLog »
  18. (en) « NaCl: Networking and Cryptography library », cr.yp.to (consulté le )
  19. (en) « Safe ECC curves » (consulté le )
v · m
CPU
  • ARM1
  • ARM2
    • Amber
  • ARM3
  • ARM6
  • ARM7
  • ARM7TDMI
  • ARM9 TDMI
  • ARM7EJ
  • ARM9E
  • ARM10E
  • ARM11
ARMv7 (32 bits)
ARMv8 32 bits uniquement
ARMv8 64 bits
compatible 32 bits
ARMv8 64 bits uniquement
  • ARM Cortex-A34
  • ARM Cortex-A65/65AE
ARM Cortex-M (microcontrôleur)
ARM Cortex-R (Temps réel)
ARMv9
GPU
VPU
SoC
Bus
  • AMBA
    • AHB
    • AXI
    • APB
    • ASB
    • ACE
Systèmes d'exploitation
  • icône décorative Portail de l’informatique
  • icône décorative Portail de l’électricité et de l’électronique