ARM Linux Kernel浮点运算(软浮点、硬浮点)

硬浮点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,那么编译会使用硬件浮点指令集