http://blog.csdn.net/songkai320/article/details/53837189
硬浮点Hard-float
编译器将代码直接编译后给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。
软浮点 Soft-float
编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。
软浮点支持是由交叉工具链提供的功能,与Linux内核无关。当使用软浮点工具链编译浮点操作时,编译器会用内联的浮点库替换掉浮点操作,使得生成的机器码完全不含浮点指令,但是又能够完成正确的浮点操作。
在 ARMv7 体系结构之前,VFP 代表矢量浮点体系结构,并曾用于矢量运算。
对于许多应用来说,设置硬件浮点至关重要,在与 NEON™ 多媒体处理功能结合使用时,硬件浮点可用于增强图像应用程序的性能(如缩放、2D 和 3D 转换、字体生成和数字过滤)。
NEON是通用的SIMD(单指令多数据)引擎。通过NEON可以加速多媒体和信号的处理算法。NEON的函数是C语言风格,但是编译后成为汇编语句,这样执行的效率会提高。Neon是ARM核心附带的浮点SIMD引擎,可以把它当一个DSP用。如果不使用Neon,就只能用CPU自带的VFP进行浮点运算。标准A8的VFP没有管线化,速度是比较低的。A9的VFP管线化后,效能有明显提升,但还是不如Neon。
Neon支持与VFP类似,都需要编译器和Kernel双方支持才可以。
Kernel配置中:
Floatingpoint emulation --->
[*]VFP-format floating point maths
[ ] Advanced SIMD (NEON) Extension support
需要选中。
想要使用硬件浮点协处理器来帮助运算Application中的浮点运算。需要以下几个前提条件:
1. Kernel中设置支持硬件协处理器。
2. 编译器支持将浮点运算翻译成硬件浮点运算指令,或者在需要浮点运算的时候手动调用相应的浮点运算指令。
编译选项:
-mfpu =name(neon orvfpvx)指定FPU 单元
-mfloat-abi= name(soft、hard、 softfp):指定软件浮点或硬件浮点或 兼容软浮点调用接口
如果只指定 -mfpu,那么默认编译不会选择选择硬件浮点指令集
如果只指定 -mfloat-abi = hard或者softfp,那么编译会使用硬件浮点指令集