30 votes

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 coprocesseur SIMD.

Mais l'unité VFP (Vector Floating Point), qui est également un coprocesseur, fonctionne-t-elle comme un processeur SIMD ? Si c'est le cas, laquelle est la meilleure à utiliser ?

J'ai lu quelques liens tels que -

  1. Lien1

  2. Lien2 .

Mais ce qu'ils veulent dire n'est pas vraiment très clair. Ils disent que VFP n'a jamais été destiné à être utilisé pour SIMD mais sur Wiki Je lis ce qui suit : " L'architecture VFP prend également en charge l'exécution d'instructions vectorielles courtes, mais celles-ci opèrent sur chaque élément vectoriel de manière séquentielle et n'offrent donc pas les performances d'un véritable parallélisme SIMD (Single Instruction Multiple Data). "

Ce n'est pas très clair ce qu'il faut croire, quelqu'un peut-il nous en dire plus sur ce sujet ?

26voto

Cosmin Cojocar Points 409

Il y a une grande différence entre les deux. Neon est un processeur accélérateur SIMD (Single Instruction Multiple Data) faisant partie du noyau ARM. Cela signifie que pendant l'exécution d'une instruction, la même opération se produira sur un maximum de 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 avec le Neon qu'avec un processeur SISD standard fonctionnant à la même fréquence d'horloge.

Le plus grand avantage de Neon est d'exécuter des opérations avec des vecteurs, par exemple l'encodage/décodage vidéo. Il peut également effectuer des opérations en virgule flottante de précision simple (float) en parallèle.

VFP est un accélérateur matériel classique à virgule flottante. Il ne s'agit pas d'une architecture parallèle comme Neon. En fait, 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 en simple et double précision.

Vous avez 3 possibilités pour utiliser Neon : - utiliser les fonctions intrinsèques #include "arm_neon.h"
- inlinez le code d'assemblage - laissez le gcc faire les optimisations pour vous en fournissant -mfpu=neon comme argument (gcc 4.5 est bon sur ce point)

14voto

Pierre Lebeaupin Points 729

Sur le plan architectural, le VFP (qui ne s'appelait pas Vector Floating Point pour rien) permet en effet d'opérer sur un vecteur à virgule flottante en une seule instruction. Je ne pense pas qu'il exécute réellement plusieurs opérations simultanément (comme un vrai SIMD), mais cela pourrait permettre d'économiser de la taille de code. Cependant, si vous lisez le manuel de référence de l'architecture ARM dans l'aide de Shark (comme je le décris dans mon introduction à NEON, lien 1 dans la question), vous verrez à la section A2.6 que la fonction vectorielle de VFP est dépréciée dans ARMv7 (qui est ce que le Cortex A8 implémente), et que le logiciel devrait utiliser Advanced SIMD pour les opérations vectorielles en virgule flottante.

Pire encore, dans l'implémentation du Cortex A8, VFP est implémenté avec une unité d'exécution VFP Lite (lire lite comme occupant une surface de silicium plus petite, pas comme ayant moins de fonctionnalités), ce qui signifie qu'il est en fait plus lent que sur l'ARM11, par exemple ! Heureusement, la plupart des instructions VFP en 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 soient ; et même si c'est le cas, elles s'exécutent certainement plus lentement qu'avec les instructions NEON.

J'espère que ça va éclaircir les choses !

11voto

Peter M Points 623

Le NEON est une unité de traitement de données SIMD et parallèle pour les données entières 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 hautement parallèles, puisque le VFP est non pipeliné.

Alors pourquoi utiliser le VFP ? !

D'une part, le VFP propose certaines instructions spécialisées pour lesquelles il n'existe pas d'implémentation équivalente dans l'unité NEON.

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

Parce qu'il n'est pas conforme à la norme IEEE-754, un compilateur ne peut pas générer ces instructions à moins que vous ne lui indiquiez que vous n'êtes pas intéressé par une conformité totale. Ceci peut être fait de plusieurs façons.

  1. L'utilisation d'une fonction intrinsèque pour forcer l'utilisation de NEON, voir par exemple la fonction Liste des fonctions intrinsèques du GCC Neon .
  2. Demandez au compilateur, très gentiment. Même les versions plus récentes de GCC avec -mfpu=neon ne générera pas d'instructions NEON en virgule flottante à moins que vous ne spécifiiez également -funsafe-math-optimizations .

2voto

sum1stolemyname Points 2400

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

Cela signifie que vous pouvez utiliser une instruction sur un vecteur de flottants pour un comportement de type SIMD, mais en interne, l'instruction est exécutée sur chaque élément du vecteur. dans l'ordre .

Bien que le temps global requis pour l'instruction soit réduit de ce fait en raison de l'instruction de chargement unique, le VFP a encore besoin de temps pour traiter tous les éléments du vecteur.

La véritable SIMD permettra de gagner plus de performances nettes en virgule flottante, mais l'utilisation du VFP avec des vecteurs est toujours plus rapide que son utilisation purement séquentielle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X