ARMCC et GCC logiciel de compilateur à virgule flottante et à virgule flottante problèmes matériels Code ARM

Cet article décrit les différents points flottant lorsque doux (-Softfloat) lorsque le code est compilé et à virgule flottante de matériel ARM (disque flottant) et la mise en œuvre de la compilation lien. Du concept à virgule flottante est introduit dans un doux (-flotteur doux) unité à virgule flottante matériel VFP et à virgule flottante (dur flottant), puis les paramètres de traduction à GCC spécifique et de la chaîne d'outils ARMCC RVCT.

VFP (vecteur à virgule flottante)

ARMv5 dès le début, il y a un module optionnel virgule flottante Vector (VFP), bien sûr, comme la dernière Cortex-A8, Cortex-A9 et Cortex-A5 peuvent être configurés sans le mode VFP pour les fabricants de puces à choisir. VFP Après plusieurs années de développement, ont le VFPv2 (nombre ARM9 / ARM11), VFPv3-D16 (seulement 16 registres à virgule flottante, valeur par défaut est 32) et VFPv3 + NEON (comme la plupart de la puce Cortex-A8). Pour la puce ARM comprenant NEON, NEON et VFP registre commun général.

Dur à virgule flottante dur flottant

Le compilateur au code de compilation pour transmettre directement au matériel en virgule flottante coprocesseur (Floating Point Unit FPU) à exécuter. FPU ensemble généralement complète des registres à virgule flottante à passage et le calcul des paramètres supplémentaires. En utilisant le matériel réel unité à virgule flottante cours de FPU apportera des améliorations de performance. Comme il est souvent un appel de fonction ou d'un virgule flottante prend plusieurs dizaines de cycles d'horloge.

Logiciel à virgule flottante Soft-flotteur

Le compilateur convertit le virgule flottante aux appels de fonction arithmétique à virgule flottante et les appels bibliothèque, sans l'appel d'instructions FPU, aucun paramètre sont transmis au registre à virgule flottante. paramètres à virgule flottante sont transmis par le registre de bras ou d'une pile est terminée. Maintenant, Linux compilateur par défaut du système choisir d'utiliser des disques flottant, même si le système ne dispose pas d'unité de traitement à virgule flottante, ce qui génère une instruction illégale et exceptions. Ainsi, une image du système général sont utilisées sans processeur logiciel VFP compatible à virgule flottante.

et armel armhf ABI
à armel, les calculs à virgule flottante sur l'accord, il y a trois. Dans un gcc exemple, trois -mfloat-abi valeurs des paramètres correspondants sont: doux, softfp, dur. fait référence à tout point flottant doux tout mis en œuvre dans la couche logicielle, le rendement élevé ne sont pas bien sûr, il ne sera plus nécessaire à l' entier en virgule flottante, virgule flottante à la conversion de nombre entier, non seulement pour le processeur unité de virgule flottante début ARM; softfp le réglage par défaut est armel, il calculs en virgule flottante FPU à traiter, mais les paramètres de la fonction de transfert général utilisés à la place du nombre entier registres registre FPU; Disque FPU registre à virgule flottante est utilisé pour transmettre des paramètres à la fonction de traitement de la FPU. Notez que, dans la compatibilité, les deux sont compatibles avec les modes incompatibles doux mais durs et softfp. Par défaut, armel utilisé softfp, armel ainsi le mode dur comme abi séparé, appelé armhf. L'utilisation du mode dur, chaque fois que la virgule flottante appel de la fonction de corrélation, permet d' économiser une moyenne de 20 cycles de processeur. Alors que chaque cycle est très important pour l'architecture ARM, une telle mise à niveau sera énorme. Dans le cas ne change pas à la source et organisé, dans certaines applications, 20% peut être obtenue en utilisant armhf --25% d' augmentation de la performance. Certains programmes reposent en grande partie sur les opérations à virgule flottante, est jusqu'à 300% d' amélioration de la performance.

Soft-float et les options du compilateur dur float

Sur les paramètres de traduction gcc CodeSourcery utilisant -mfloat = ABI- nom pour indiquer l' approche à virgule flottante. = -Mfpu nom pour spécifier le type de coprocesseur à virgule flottante. Le type optionnel FPA, fpe2, fpe3, maverick, VFP, vfpv3, vfpv3-FP16, vfpv3-d16, d16-vfpv3-FP16, vfpv3xd, vfpv3xd-FP16, le néon, le néon-FP16, vfpv4, vfpv4-d16, fpv4- sp-D16, néon vfpv4 comme. Utilisation -mfloat-abi = dur (équivalent à -mhard-flotteur)  -mfpu = VFP matériel virgule flottante choisi compilé. Utilisez -mfloat-abi = softfp capable de matériels et logiciels compatibles avec les implémentations de VFP soft-flotteur, le connecteur Ld.so pour sélectionner l' unité d'exploitation est un appel direct au matériel lors de l' exécution des opérations à virgule flottante ou bibliothèque d' exécution appel de fonction est exécutée sous la libm / lib ou / lib / VFP. -mfloat-abi = doux (équivalent à -msoft-float) les appels directs à mettre en œuvre la bibliothèque à virgule flottante logiciel.

Dans la chaîne d'outils ARM RVCT, FPU défini modes:

? --fpu softvfp
? --fpu softvfp + vfpv2
? --fpu softvfp + vfpv3
? --fpu softvfp + vfpv_fp16
? --fpu softvfp + vfpv_d16
? --fpu softvfp + vfpv_d16_fp16.

Définir le type d'opérations à virgule flottante

--fpmode ieee_full: Tous flotteur simple précision, et les doubles standards de l'IEEE double précision et le même, le mode spécifique peuvent être spécifiés dynamiquement lors de l'exécution;

--fpmode ieee_fixed: arrondi standard IEEE au plus proche mis en œuvre sans exception inexacte;

--fpmode ieee_no_fenv: arrondi standard IEEE au plus proche mis en œuvre sans exception;

--fpmode std: Nombre de flush non standard à zéro, arrondi à la mise en œuvre le plus proche norme IEEE, sans exception;

--fpmode rapide: une optimisation plus agressive, peut être un peu de perte de précision.

 

Virgule flottante pour obtenir un lien souple exemple de compilation

__softfp_cos IMPORTATION

BL __softfp_cos

La bibliothèque de virgule flottante ARMCC

type de données à virgule flottante double __aeabi_dadd addition, __ aeabi_fdiv simple précision division à virgule flottante.

Annexe: configuration de la puce commune et VFP

référence partielle de SoC et les normes ISA pris en charge

fabricant  http://houh-1984.blog.163.com/

SoC

architecture

VFP

SIMD

Remarques

Freescale

iMX5x

ARMv7

VFPv3

NÉON

Cortex-A8NEON  fiable que dans la bande-Out 3 ou au- dessus

Nvidia

tegra2

ARMv7

VFPv3 D16

aucun

 

Marvell

Colombe

ARMv7

VFPv3 D16

iwMMXt

 

Texas Instruments

OMAP3xxx

ARMv7

VFPv3

NÉON

Cortex-A8

Texas Instruments

OMAP4xxx

ARMv7

VFPv3

NÉON

Cortex-A9

Texas Instruments

OMAP5xxx

ARMv7

VFPv4

NÉON

Cortex-A15  (ARMv7-A) +  Cortex-M4  (ARMv7-ME)

Qualcomm

Muflier

ARMv7

VFPv3

NEON [1]

Qualcomm "Scorpion" core

Samsung

S5PC100

ARMv7

VFPv3

NÉON

Cortex-A8

Allwinner

A1X

ARMv7

VFPv3

NÉON

Cortex-A8

Référence

http://houh-1984.blog.163.com/

http://wiki.debian.org/ArmHardFloatPort

http://www.claudxiao.net/2012/02/armhf/

http://armin762.wordpress.com/2010/12/09/arm-hardfloat-and-gentoo/

Cet article décrit les différents points flottant lorsque doux (-Softfloat) lorsque le code est compilé et à virgule flottante de matériel ARM (disque flottant) et la mise en œuvre de la compilation lien. Du concept à virgule flottante est introduit dans un doux (-flotteur doux) unité à virgule flottante matériel VFP et à virgule flottante (dur flottant), puis les paramètres de traduction à GCC spécifique et de la chaîne d'outils ARMCC RVCT.

 

Transfert: https://blog.csdn.net/hunanchenxingyu/article/details/47003279

Publié 264 articles originaux · éloge de won 520 · Vues 3 millions +

Je suppose que tu aimes

Origine blog.csdn.net/phenixyf/article/details/103156451
conseillé
Classement