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.
InformationsquelleAutor celavek | 2011-09-01