Dans ARM Processeur 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?
J'ai lu quelques liens tels que -
Mais pas vraiment très clair ce qu'ils signifient. 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 celles-ci fonctionnent sur chaque élément vectoriel de manière séquentielle et n'offrent donc pas les performances d'un vrai parallélisme SIMD (Single Instruction Multiple Data). "
On ne sait pas trop quoi croire, quelqu'un peut-il en dire plus sur ce sujet?
Il y a pas mal de 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 jusqu'à 16 ensembles de données en parallèle Puisqu'il existe un parallélisme à l'intérieur du Neon, vous pouvez obtenir plus de MIPS ou FLOPS de Neon que vous ne le pouvez avec un processeur SISD standard fonctionnant à la même fréquence d'horloge.
Le plus grand avantage de Neon est que vous souhaitez exécuter une opération avec des vecteurs, c'est-à-dire un encodage/décodage vidéo. Il peut également effectuer des opérations en virgule flottante simple précision (float) en parallèle.
VFP est un accélérateur 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 prend en charge la virgule flottante simple et double précision.
Vous avez 3 possibilités pour utiliser Neon:
-mfpu=neon
comme argument (gcc 4.5 est bon à ce sujet)Pour armv7 ISA (et variantes)
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 ne disposez pas de données hautement parallèles, car le VFP n'est pas canalisé.
Alors pourquoi voudriez-vous jamais utiliser le VFP?!
La différence la plus importante est que le VFP fournit une virgule flottante double précision.
Deuxièmement, VFP propose des instructions spécialisées pour lesquelles il n'existe aucune implémentation équivalente dans l'unité NEON. SQRT vient à l'esprit, peut-être certaines conversions de types.
Mais la différence la plus importante non mentionnée dans la réponse de Cosmin est que le pipeline à virgule flottante NEON n'est pas entièrement conforme à la norme IEEE-754. La meilleure description des différences se trouve dans la FPSCR Register Description .
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 disiez au compilateur que vous n'êtes pas intéressé par une conformité totale. Cela peut se faire de plusieurs manières.
-mfpu=neon
ne générera pas d'instructions NEON à virgule flottante sauf si vous spécifiez également -funsafe-math-optimizations
.Pour armv8 + ISA (et variantes) [Mise à jour]
NEON est maintenant entièrement compatible IEE-754, et du point de vue du programmeur (et du compilateur), il n'y a en fait pas trop de différence. La double précision a été vectorisée. Du point de vue de la micro-architecture, je doute que ce soient même 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".
Du point de vue architectural, VFP (il ne s'appelait pas Vector Floating Point pour rien) a en effet une disposition pour fonctionner sur un vecteur à virgule flottante dans une seule instruction. Je ne pense pas qu'il exécute jamais plusieurs opérations simultanément (comme le vrai SIMD), mais il pourrait économiser une certaine taille de code. Cependant, si vous lisez le ARM Architecture Reference Manual 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éconseillée 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, dans l'implémentation 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 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 s'exécutent certainement plus lentement qu'avec les instructions NEON.
J'espère que ça clarifie les choses!
IIRC, le VFP est un coprocesseur à virgule flottante qui fonctionne séquentiellement.
Cela signifie que vous pouvez utiliser l'instruction sur un vecteur de flottants pour un comportement similaire à SIMD, mais en interne, l'instruction est exécutée sur chaque élément du vecteur en séquence.
Bien que le temps global requis pour l'instruction en soit réduit en raison de l'instruction de chargement unique, le VFP a encore besoin de temps pour traiter tous les éléments du vecteur.
Le vrai SIMD gagnera plus de performances en virgule flottante nette, mais l'utilisation du VFP avec des vecteurs est encore plus rapide que son utilisation purement séquentielle.