Cortex A9 NÉON vs VFP l'utilisation de la confusion
Je suis en train de construire une bibliothèque pour un Cortex A9 processeur ARM(un OMAP4 pour être plus précis) et je suis dans un peu de confusion quant à ce qui\lors de l'utilisation de NÉON vs VFP dans le contexte des opérations en virgule flottante et SIMD. À noter que je sais faire la différence entre les 2 matériel coprocesseur unités(ainsi qu'il est décrit ici DONC), je viens d'avoir une certaine incompréhension quant à leur utilisation correcte.
Liées à cela, je suis en utilisant les drapeaux de compilation suivantes:
GCC
-O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
-O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp
ARMCC
--cpu=Cortex-A9 --apcs=/softfp
--cpu=Cortex-A9 --fpu=VFPv3 --apcs=/softfp
J'ai lu dans les BRAS de la documentation, un lot de wiki(comme celui-ci), du forum et des articles de blog et tout le monde semble d'accord que l'utilisation de NÉON est mieux que l'aide de VFP
ou au moins le mélange NÉON(par exemple à l'aide de la instrinsics de mettre en œuvre certains algos en SIMD) et VFP n'est pas une bonne idée; je ne suis pas sûr à 100% encore, si cela s'applique dans le contexte de l'ensemble de l'application\bibliothèque ou tout simplement à des endroits spécifiques(fonctions) dans le code.
Donc je suis en utilisant le néon comme la FPU pour mon application que je veux aussi utiliser le intrinsèques. En conséquence, je suis un peu de l'ennui et ma confusion sur la façon d'utiliser au mieux ces caractéristiques(NÉON vs VFP) sur le Cortex A9 juste approfondit davantage au lieu de l'éclaircir. J'ai un code qui fait référence pour mon application et utilise certaines custom made classes timer
dans lequel les calculs sont basés sur virgule flottante double précision. À l'aide de NÉON comme la FPU donne totalement inapproprié de résultats(en essayant d'imprimer ces valeurs résultats d'impression pour la plupart inf et NaN; le même code fonctionne sans accroc lors de la construction pour l'architecture x86). J'ai donc changé mes calculs, à utiliser en virgule flottante simple précision que est documenté que le NÉON ne gère pas en virgule flottante double précision. Mes repères ne donne pas de bon résultats(et ce qui est pire, c'est que maintenant il ne fonctionne plus sur x86; je pense que c'est à cause de la perte de précision, mais je ne suis pas sûr). Donc, je suis presque complètement perdu: d'une part, je veux utiliser NÉON pour le SIMD capacités et en l'utilisant comme le FPU ne donne pas le bon résultats, d'autre part en la mélangeant avec de la VFP ne semble pas une très bonne idée.
Tous les conseils dans ce domaine sera grandement apprécié !!
J'ai trouvé dans l'article ci-dessus mentionné wiki un résumé de ce qui devrait être fait pour virgule flottante d'optimisation dans le contexte de NÉON:
"
- Utiliser uniquement en virgule flottante simple précision
- Au NÉON intrinsèques /ASM quand jamais vous trouvez un goulet d'étranglement FP fonction. Vous pouvez faire mieux que le compilateur.
- Minimiser Les Branches Conditionnelles
- Permettre RunFast mode
Pour softfp:
- Inline code de nombres flottants (sauf son très grand)
- Passer FP arguments via des pointeurs au lieu d'une valeur de nombre entier de travail entre les appels de fonction.
"
Je ne peux pas utiliser dur pour le flotteur ABI que je ne peux pas le lien avec les bibliothèques dont je dispose.
La plupart des recommandations de sens pour moi(à l'exception de la "runfast mode" dont je ne comprends pas exactement ce qu'il doit faire et le fait que, à ce moment dans le temps, je pourrais faire mieux que le compilateur) mais je continue à obtenir des résultats incohérents et je ne suis pas sûr de rien en ce moment.
Quelqu'un pourrait jeter une certaine lumière sur la façon d'utiliser correctement les nombres à virgule flottante et les NÉONS pour le Cortex A9/A8 et qui options de compilation dois-je utiliser?
- Donner de l'auto-vectorisation un coup de trop. Si vous utilisez le BRAS RVCT compilateur, ajoutez --vectoriser à la ligne de commande (Vous pourriez avoir besoin d'un professionnel RVCT licence afin d'essayer ce bien, ainsi les pls garder cela à l'esprit)
- Votre suggestion est liée à la SIMD. Ma question est sur la bonne manière d'utiliser la virgule flottante capacités de NÉON de la VFP unité.
- Voir aussi le BRAS de Blog et ARM Cortex-Un des Processeurs et de la GCC en ligne de Commande.
Vous devez vous connecter pour publier un commentaire.
Je pense que cette question devrait être divisé en plusieurs, en ajoutant des exemples de code et les détails plate-forme cible et les versions de toolchains utilisé.
Mais pour couvrir une partie de la confusion:
La recommandation d'utiliser le NÉON comme la FPU" sonne comme un malentendu. Le NÉON est un moteur SIMD, le VFP est une FPU. Vous pouvez utiliser des NÉONS pour single-precision floating-point operations sur 4 en simple précision les valeurs en parallèle, ce qui (si possible) est bon pour la performance.
-mfpu=neon
peut être vu comme un raccourci pour-mfpu=neon-vfpv3
.Voir http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html pour plus d'informations.
Je ne suis pas sûr que ce soit correct. Selon le BRAS à L'introduction de NÉON Développement Article | NEON registres:
Les registres ne sont pas en concurrence, mais plutôt co-exister en tant que vue sur le registre de la banque. Il n'y a pas moyen de remettre le NÉON et la FPU engins.
Voici ce que je fais, votre kilométrage peut varier. Sa dérivée à partir d'un mashup de l'information recueillie à partir de la plate-forme et le compilateur.
gnueabihf
me dit la plate-forme de l'utilisation de flotteurs, ce qui peut accélérer la procédure d'appels. En cas de doute, utilisezsoftfp
car il est compatible avec dur flotteurs.BeagleBone Black:
De sorte que le BeagleBone utilise:
CubieTruck v5:
De sorte que le CubieTruck utilise:
Banana Pi Pro:
De sorte que le Banana Pi utilise:
Raspberry Pi 3:
La RPI3 est unique en ce que son ARMv8, mais son exécution d'un 32-bit OS. Cela signifie qu'elle est efficacement 32-bit ARM ou Aarch32. Il y a un peu plus de 32-bit ARM vs Aarch32, mais cela va vous montrer la Aarch32 drapeaux
Aussi, le RPI3 utilise une Broadcom A53 SoC, et il a le NÉON et l'option CRC32 instructions, mais il lui manque l'option de Chiffrement extensions.
De sorte que le Raspberry Pi peut utiliser:
Ou il peut utiliser (je ne sais pas quoi utiliser pour
-mtune
):ODROID C2:
ODROID C2 utilise un Amlogic A53 SoC, mais il utilise un système d'exploitation 64 bits. Le ODROID C2, il a le NÉON et l'option CRC32 instructions, mais il lui manque l'option de Chiffrement des extensions (config similaire à RPI3).
De sorte que le ODROID utilise:
Au-dessus de recettes, j'ai appris le processeur ARM (comme Cortex A9 ou A53) en examinant les fiches de données. Selon cette réponse sur Unix et Linux Stack Exchange, qui décrypte la sortie de
/proc/cpuinfo
:Afin que nous puissions être en mesure de rechercher la valeur la forme d'une base de données. Je ne sais pas si il existe ou lorsqu'il se trouve.
Je voudrais rester à l'écart de VFP. Il est juste comme la Thmub mode : C'est censé être pour les compilateurs. Il n'y a aucun point dans l'optimisation de la pour eux.
Il peut paraître impoli, mais je ne vois pas l'intérêt de NÉON intrinsèques soit. C'est plus d'ennuis que de l'aide - si tout.
Investir seulement deux ou trois jours, dans de base, BRAS de montage: vous avez seulement besoin d'apprendre quelques instructions pour la boucle de contrôle/de résiliation.
Alors vous pouvez commencer à écrire natif NÉON codes sans se soucier de le compilateur de faire quelque chose astral de cracher des tonnes d'erreurs/avertissements.
Apprentissage NÉON instructions est moins exigeant que tous ceux intrinsèques des macros. Et tous les ci-dessus, les résultats sont tellement mieux.
Entièrement optimisé NÉON natif codes généralement exécuté plus de deux fois plus rapide que bien écrit intrinsèques homologues.
Il suffit de comparer les OP de la version avec le mien dans le lien ci-dessous, vous saurez ce que je veux dire.
L'optimisation de RVBA8888 à RGB565 de conversion avec des NÉONS
ce qui concerne
-march=armv7-a
ou-mcpu=cortex-an
que l'option de compilation. Et si vous pensez que ces options en fait aider d'une certaine manière, vous n'avez jamais pris un coup d'oeil au démontage. La main de le dérouler et de la planification est la bonne façon.LITTLE
cluster. La partie la plus ennuyeuse de SIMD programmation est probablement traiter avec les résidus, et c'est exactement où il est beaucoup plus commode et plus efficace dans l'assemblée.