zoukankan      html  css  js  c++  java
  • ARMCC和GCC编译ARM代码的软浮点和硬浮点问题【转】

    转自:https://blog.csdn.net/hunanchenxingyu/article/details/47003279

    本文介绍了ARM代码编译时的软浮点(soft-float)和硬浮点(hard-float)的编译以及链接实现时的不同。从VFP浮点单元的引入到软浮点(soft-float)和硬浮点(hard-float)的概念,然后是在GCC和ARMCC RVCT工具链下的具体编译参数。

    VFP (vector floating-point)

    ARMv5开始,就有可选的 Vector Floating Point (VFP)模块,当然最新的如 Cortex-A8Cortex-A9  Cortex-A5 可以配置成不带VFP的模式供芯片厂商选择。VFP经过若干年的发展,有VFPv2 (一些 ARM9 / ARM11) VFPv3-D16(只使用16个浮点寄存器,默认为32个)和VFPv3+NEON (如大多数的Cortex-A8芯片)。对于包含NEONARM芯片,NEON一般和VFP公用寄存器。

    硬浮点Hard-float

    编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。

    软浮点 Soft-float

    编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。 现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。

    armel和armhf ABI
    armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hardsoft是指所有浮点运算全部在软件层实现,效率当然不高,会存在不必要的浮点到整数、整数到浮点的转换,只适合于早期没有浮点计算单元的ARM处理器;softfp是目前armel的默认设置,它将浮点计算交给FPU处理,但函数参数的传递使用通用的整型寄存器而不是FPU寄存器;hard则使用FPU浮点寄存器将函数参数传递给FPU处理。需要注意的是,在兼容性上,soft与后两者是兼容的,但softfphard两种模式不兼容。默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。而使用hard模式,在每次浮点相关函数调用时,平均能节省20CPU周期。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20%——25%的性能提升。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升。

    Soft-float和hard-float的编译选项

    CodeSourcery gcc的编译参数上,使用-mfloat-abi=name来指定浮点运算处理方式。-mfpu=name来指定浮点协处理的类型。可选类型如fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4等。使用-mfloat-abi=hard (等价于-mhard-float) -mfpu=vfp来选择编译成硬浮点。使用-mfloat-abi=softfp就能兼容带VFP的硬件以及soft-float的软件实现,运行时的连接器ld.so会在执行浮点运算时对于运算单元的选择,是直接的硬件调用还是库函数调用,是执行/lib还是/lib/vfp下的libm。-mfloat-abi=soft (等价于-msoft-float)直接调用软浮点实现库。

    在ARM RVCT工具链下,定义fpu模式:

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

    定义浮点运算类型

    --fpmode ieee_full :所有单精度float和双精度double的精度都要和IEEE标准一致,具体的模式可以在运行时动态指定;

    --fpmode ieee_fixed舍入到最接近的实现的IEEE标准,不带不精确的异常;

    --fpmode ieee_no_fenv:舍入到最接近的实现的IEEE标准,不带异常;

    --fpmode std:非规格数flush0、舍入到最接近的实现的IEEE标准,不带异常;

    --fpmode fast更积极的优化,可能会有一点精度损失。

    一个浮点软链接实现的汇编例子

    IMPORT __softfp_cos

    BL __softfp_cos

    ARMCC fplib浮点运算库

    __aeabi_dadd 浮点double类型数据的加法,__aeabi_fdiv 单精度浮点除法。

    附录:常见的芯片和VFP配置

    Partial reference of SoC and supported ISAs

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

    SoC

    architecture

    VFP

    SIMD

    Notes

    Freescale

    iMX5x

    armv7

    VFPv3

    NEON

    Cortex-A8NEON only reliable in Tape-Out 3 or above

    Nvidia

    Tegra2

    armv7

    VFPv3 D16

    none

     

    Marvell

    Dove

    armv7

    VFPv3 D16

    iwMMXt

     

    Texas Instruments

    OMAP3xxx

    armv7

    VFPv3

    NEON

    Cortex-A8

    Texas Instruments

    OMAP4xxx

    armv7

    VFPv3

    NEON

    Cortex-A9

    Texas Instruments

    OMAP5xxx

    armv7

    VFPv4

    NEON

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

    Qualcomm

    Snapdragon

    armv7

    VFPv3

    NEON[1]

    Qualcomm "Scorpion" core

    Samsung

    S5PC100

    armv7

    VFPv3

    NEON

    Cortex-A8

    Allwinner

    A1x

    armv7

    VFPv3

    NEON

    Cortex-A8

    Reference

    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/

    本文介绍了ARM代码编译时的软浮点(soft-float)和硬浮点(hard-float)的编译以及链接实现时的不同。从VFP浮点单元的引入到软浮点(soft-float)和硬浮点(hard-float)的概念,然后是在GCC和ARMCC RVCT工具链下的具体编译参数。

  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13389998.html
Copyright © 2011-2022 走看看