Question

Dans ARM Cortex-A8, je comprends ce que NEON est, il est un co-processeur SIMD.

Mais est-unité VFP (Vector virgule flottante), qui est aussi un co-processeur, fonctionne comme un processeur SIMD? Si oui, lequel est préférable d'utiliser?

Je lis quelques liens tels que -

  1. Link1

  2. Lien2 .

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 je lis ce qui suit - « l'architecture VFP prend également en charge l'exécution d'instructions à court vecteur, mais ceux-ci fonctionnent sur chaque élément vectoriel séquentiellement et donc n'offrent pas les performances du vrai parallélisme SIMD (Single Instruction multiple de données). "

Il donc pas clair ce qu'il faut croire, peut-on élaborer plus sur ce sujet?

Était-ce utile?

La solution

Il y a un certain écart entre les deux. Enseigne lumineuse est un processeur d'accélérateur SIMD (Single Instruction Multiple Data) dans le cadre du noyau ARM. Cela signifie que pendant l'exécution d'une instruction de la même opération se fera sur un maximum de 16 ensembles en parallèle de données. Comme il est le parallélisme à l'intérieur du néon, vous pouvez obtenir plus MIPS ou Flops de Neon que vous pouvez un processeur standard SISD fonctionnant à la même fréquence d'horloge.

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

VFP est un accélérateur matériel à virgule flottante classique. Il n'est pas une architecture parallèle comme Neon. Fondamentalement, il effectue une opération sur une série d'entrées et renvoie une sortie. Il a pour objectif d'accélérer les calculs en virgule flottante. Il prend en charge à virgule flottante simple et double précision.

Vous avez 3 possibilités d'utiliser Neon:

  • utiliser les fonctions #inclure intrinsèques "arm_neon.h"
  • en ligne le code assembleur
  • laisser le gcc faire les optimisations pour vous en fournissant -mfpu=neon comme argument (gcc 4.5 est bon à ce sujet)

Autres conseils

Architecturalement, VFP (il n'a pas été appelé à virgule flottante vecteur pour rien) a en effet une disposition pour agir sur un vecteur à virgule flottante en une seule instruction. Je ne pense pas que jamais exécute en fait réaliser de multiples opérations simultanément (comme vrai SIMD), mais il pourrait économiser la taille du code. Cependant, si vous lisez le manuel ARM architecture de référence dans l'aide Shark (comme je décris dans mon introduction à NEON, lien 1 dans la question), vous verrez à la section A2.6 que la fonction de vecteur de VFP est dépréciée dans ARMv7 (qui est ce que les outils Cortex A8), et le logiciel devrait utiliser Advanced SIMD pour les opérations de vecteur à virgule flottante.

Pire encore, dans la mise en œuvre Cortex A8, VFP est mis en oeuvre avec une unité d'exécution Lite VFP (lu lite comme occupant une petite surface de silicium, et non pas comme ayant moins de fonctionnalités), ce qui signifie qu'il est en fait plus lentement que sur le ARM11, pour exemple! Heureusement, la plupart des instructions de VFP simple précision sont exécutées par l'unité de NEON, mais je suis pas sûr opérations vecteur de VFP faire; et même si elles le font, ils exécutent certainement plus lent que les instructions NEON.

L'espoir qui efface chose up!

Pour ARMv7 ISA (et variantes)

Le NEON est un SIMD et des données parallèles unité de traitement de nombre entier et en virgule flottante données de point et l'VFP agit d'une unité à virgule flottante compatible IEEE-754. En particulier sur l'A8, l'unité de NEON est beaucoup plus rapide pour à peu près tout, même si vous ne disposez pas de données hautement parallèles, puisque la

VFP est non-pipe-line.

Alors, pourquoi voulez-vous jamais utiliser le VFP!

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

En second lieu, il y a quelques instructions spécialisées que cette offre VFP qu'il n'y a pas d'implémentations équivalentes dans l'unité de NEON. RACINE vient à l'esprit, peut-être quelques conversions de type.

Mais la différence la plus importante non mentionné dans la réponse de Cosmin est que le pipeline à virgule flottante NEON est pas tout à fait conforme à la norme IEEE-754. La meilleure description des différences sont dans le FPSCR Description du registre .

Parce qu'il n'est pas conforme IEEE-754, un compilateur ne peut pas générer ces instructions, sauf si vous dites au compilateur que vous n'êtes pas intéressé dans le plein respect. Cela peut se faire de plusieurs façons.

  1. En utilisant une fonction intrinsèque pour forcer l'utilisation de NEON, par exemple voir le GCC Liste des fonctions Neon intrinsèque.
  2. Demandez au compilateur, très bien. Même les nouvelles versions de GCC avec -mfpu=neon ne génère pas flottante instructions NEON point à moins que vous spécifiez également -funsafe-math-optimizations.

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

NEON est maintenant entièrement compatible IEE-754 et d'un programmeur (et du compilateur) point de vue, il n'y a en fait pas trop de différence. Double précision a été vectorisé. D'un point de vue micro-architecture que je sorte de doute, ils sont même différentes unités matérielles. ARM fait des instructions documents scalaire et vectoriel séparément, mais les deux font partie de la « Advanced SIMD ».

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

Cela signifie que vous pouvez utiliser l'instruction sur un vecteur de flotteurs pour comportement comme SIMD, mais à l'intérieur, l'instruction est effectuée sur chaque élément du vecteur dans l'ordre .

Alors que le temps total nécessaire pour l'instruction est réduite par cela à cause de l'instruction de chargement unique, le VFP a encore besoin de temps pour traiter tous les éléments du vecteur.

True SIMD gagnera plus net des performances en virgule flottante, mais en utilisant le VFP avec des vecteurs est encore plus rapide puis en utilisant purement séquentiel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top