ARM Cortex-A8: Quelle est la différence entre VFP et NEON

Dans le processeur ARM Cortex-A8, je comprends ce qu’est NEON, c’est un co-processeur SIMD.

Mais l’unité VFP (Vector Floating Point), qui est également un co-processeur, fonctionne-t-elle comme un processeur SIMD? Si oui, lequel est préférable d’utiliser?

Je lis peu de liens tels que –

  1. Link1

  2. Link2 .

Mais pas vraiment très clair ce qu’ils veulent dire. Ils disent que VFP n’a jamais été destiné à être utilisé pour SIMD mais sur Wiki, j’ai lu ce qui suit – ” L’architecture VFP prend également en charge l’exécution d’instructions vectorielles courtes, mais Single Instruction Multiple Data) parallélisme.

Il n’est pas si clair de quoi croire, peut-on en dire plus sur ce sujet?

    Il y a toute une différence entre les deux. Neon est un processeur d’accélération SIMD (Single Instruction Multiple Data) faisant partie du kernel ARM. Cela signifie que pendant l’exécution d’une instruction, la même opération se produira sur 16 ensembles de données en parallèle. Comme il y a du parallélisme à l’intérieur du Neon, vous pouvez obtenir plus de MIPS ou de FLOPS de Neon qu’un processeur SISD standard fonctionnant à la même fréquence d’horloge.

    Le plus grand avantage de Neon est que vous souhaitiez exécuter des opérations avec des vecteurs, à savoir le codage / décodage vidéo. En outre, il peut effectuer des opérations de précision en virgule flottante (float) en parallèle.

    VFP est un accélérateur de matériel à virgule flottante classique. Ce n’est pas une architecture parallèle comme Neon. Fondamentalement, il effectue une opération sur un ensemble d’entrées et renvoie une sortie. Son but est d’accélérer les calculs en virgule flottante. Il supporte la virgule flottante simple et double précision.

    Vous avez 3 possibilités d’utiliser Neon:

    • utiliser des fonctions insortingnsèques #include “arm_neon.h”
    • incorporer le code d’assemblage
    • laissez le gcc faire les optimisations pour vous en fournissant l’ -mfpu=neon comme argument (gcc 4.5 est bon sur ceci)

    D’un sharepoint vue architectural, VFP (il n’a pas été appelé Vector Floating Point for nothing) dispose en effet d’une fonction permettant de fonctionner sur un vecteur à virgule flottante dans une seule instruction. Je ne pense pas qu’il exécute réellement des opérations multiples simultanément (comme le vrai SIMD), mais cela pourrait économiser de la taille de code. Cependant, si vous lisez le Manuel de référence de l’architecture ARM dans l’aide Shark (comme je l’ai décrit dans mon introduction à NEON, lien 1 dans la question), vous verrez à la section A2.6 que la caractéristique vectorielle de VFP est obsolète dans ARMv7. (qui est ce que le Cortex A8 implémente), et le logiciel devrait utiliser Advanced SIMD pour les opérations vectorielles à virgule flottante.

    Pire encore, avec l’implémentation du Cortex A8, VFP est implémenté avec une unité d’exécution VFP Lite (lire lite comme occupant une plus petite surface de silicium, pas comme moins de fonctionnalités), ce qui signifie qu’il est plus lent que sur l’ARM11, par exemple! Heureusement, la plupart des instructions VFP à simple précision sont exécutées par l’unité NEON, mais je ne suis pas sûr que les opérations VFP vectorielles le fassent. et même s’ils le font, ils exécutent certainement plus lentement qu’avec les instructions NEON.

    J’espère que ça clarifie les choses!

    Pour armv7 ISA (et variantes)

    Le NEON est une unité de traitement de données SIMD et parallèle pour les données à virgule entière et à virgule flottante et le VFP est une unité à virgule flottante entièrement compatible IEEE-754. En particulier sur l’A8, l’unité NEON est beaucoup plus rapide pour à peu près tout, même si vous n’avez pas de données très parallèles, puisque la VFP n’est pas en pipeline.

    Alors, pourquoi utiliseriez-vous le VFP?!

    La différence la plus importante est que le VFP fournit une virgule flottante double précision.

    Deuxièmement, il existe des instructions spécialisées que VFP propose qu’il n’y a pas d’implémentations équivalentes dans l’unité NEON. On pense à SQRT, peut-être à certaines conversions de type.

    Mais la différence la plus importante qui n’a pas été mentionnée dans la réponse de Cosmin est que le pipeline en virgule flottante NEON n’est pas entièrement conforme à la norme IEEE-754. La meilleure description des différences se trouve dans la description du registre FPSCR .

    Comme il n’est pas conforme à la norme IEEE-754, un compilateur ne peut pas générer ces instructions à moins d’indiquer au compilateur que vous n’êtes pas intéressé par une conformité totale. Cela peut être fait de plusieurs manières.

    1. En utilisant une fonction insortingnsèque pour forcer l’utilisation de NEON, consultez par exemple la liste des fonctions insortingnsèques de GCC Neon .
    2. Demandez au compilateur, très gentiment. Même les nouvelles versions de GCC avec -mfpu=neon ne généreront pas d’instructions NEON à virgule flottante à moins que vous ne -funsafe-math-optimizations également l’ -funsafe-math-optimizations .

    Pour armv8 + ISA (et variantes) [Mise à jour]

    NEON est désormais entièrement compatible IEE-754 et, du sharepoint vue du programmeur (et du compilateur), il n’ya pas vraiment de différence. La double précision a été vectorisée. Du sharepoint vue de la micro-architecture, je doute que ce soient des unités matérielles différentes. ARM documente séparément les instructions scalaires et vectorielles, mais les deux font partie de “Advanced SIMD”.

    IIRC, le VFP est un coprocesseur à virgule flottante qui fonctionne de manière séquentielle.

    Cela signifie que vous pouvez utiliser des instructions sur un vecteur de flottants pour un comportement de type SIMD, mais en interne, l’instruction est effectuée sur chaque élément du vecteur en séquence .

    Bien que le temps total requirejs pour l’instruction soit réduit à cause de l’instruction de chargement unique, le VFP a toujours besoin de temps pour traiter tous les éléments du vecteur.

    True SIMD gagnera plus de performances en virgule flottante, mais l’utilisation de la VFP avec des vecteurs est encore plus rapide que son utilisation uniquement séquentielle.