• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Akagi201
I like ACM && Linux
博客园    首页    新随笔    联系   管理    订阅  订阅

VFP--ARM浮点体系结构机介绍

ARM 浮点体系结构 (VFP) 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。它完全符合 IEEE 754 标准,并提供完全软件库支持。 ARM VFP 的浮点功能为汽车动力系统、车身控制应用和图像应用(如打印中的缩放、转换和字体生成以及图形中的 3D 转换、FFT 和过滤)中使用的浮点运算提供增强的性能。下一代消费类产品(如 Internet 设备、机顶盒和家庭网关)可直接从 ARM VFP 受益。

浮点

    ARM 浮点体系结构 (VFP) 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。它完全符合 IEEE 754 标准,并提供完全软件库支持。

ARM VFP 的浮点功能为汽车动力系统、车身控制应用和图像应用(如打印中的缩放、转换和字体生成以及图形中的 3D 转换、FFT 和过滤)中使用的浮点运算提供增强的性能。下一代消费类产品(如 Internet 设备、机顶盒和家庭网关)可直接从 ARM VFP 受益。

VFP 应用

  • 汽车控制应用
    • 动力系统
    • ABS、牵引控制和主动悬架
  • 3D 图形
    • 数字消费类产品
    • 机顶盒、游戏机
  • 图像
    • 激光打印机、静态数码相机、数码摄像机
  • 工业控制系统
    • 运动控制

工业和汽车领域中的许多实时控制应用都得益于 ARM VFP 提供的浮点的动态范围和准确性。汽车动力系统、防抱死制动系统、牵引控制和主动悬架系统都是关键业务应用,它们对准确性和可预测性的要求必不可少。

VFP 体系结构版本

    在 ARMv7 体系结构之前,VFP 代表矢量浮点体系结构,并曾用于矢量运算。

    对于许多应用来说,设置硬件浮点至关重要,并且硬件浮点可用作使用高级设计工具(如 MatLab、MATRIXx 和 LabVIEW)直接对系统建模和派生应用程序代码的片上系统 (SoC) 设计流程的一部分。在与 NEON™ 多媒体处理功能结合使用时,硬件浮点可用于增强图像应用程序的性能(如缩放、2D 和 3D 转换、字体生成和数字过滤)。

迄今为止,VFP 主要有三个版本:

<ol>
  • VFPv1 已废弃。要获取详细信息,可向 ARM 发送相关请求。
  • VFPv2 是对 ARMv5TE、ARMv5TEJ 和 ARMv6 体系结构中 ARM 指令集的可选扩展。
  • VFPv3 是对 ARMv7-A 和 ARMv7-R 配置文件中 ARM、Thumb&reg; 和 ThumbEE 指令集的可选扩展。可使用 32 个或 16 个双字长寄存器实现 VFPv3。术语 VFPv3-D32 和 VFPv3-D16 用于区别这两个实现选项。可通过半精度扩展对 VFPv3 进行扩展,这些扩展可在半精度浮点和单精度浮点之间提供双向转换功能。</ol>

 

VFP9-S

ARM VFP9-S 可合成矢量浮点 (VFP) 协处理器与所有 ARM9E™ 系列处理器内核兼容。它支持单精度和双精度浮点;使 ARM 支持软件完全符合 IEEE754,或仅使硬件大致符合 IEEE754。支持代码包含两个组件:例行程序库和一组异常处理程序,前者执行未实现函数(如超越函数)和一些支持的函数(如除法),后者用于处理异常情况。

VFP9-S 功能

  • ARM VFPv2 ISA
  • 16 个双精度或 32 个单精度寄存器
  • 使 ARM 支持代码完全符合 IEEE754
  • 大致符合 IEEE754 的快速运行模式(仅硬件)
  • 与 VFP10 和 VFP11 保持二进制兼容
  • 可使用支持工具和单元库移植到任何工艺
  • 100 - 130K 门
  • 1.3Mflops/MHz
  • 面积 <1.0mm2 TSMC 0.13µm G
  • 180 - 210MHz(最坏情况)TSMC 0.13µm G
  • <0.4mW/MHz(典型情况)功耗 TSMC 0.13µm G

VFP9-S 优点

ARM VFP9-S 的矢量处理功能对汽车动力系统、车身控制应用和图像应用(如打印中的缩放、转换和字体生成以及图形中的 3D 转换、FFT 和过滤)中使用的浮点体系结构提供增强的性能。下一代消费类产品(如 Internet 设备、机顶盒和家庭网关)可直接从 ARM VFP9 受益。

VFP9-S 应用

  • 汽车控制应用:
    • 动力系统
    • ABS、牵引控制和主动悬架
  • 3D 图形
  • 数字消费类产品
    • 机顶盒、游戏机
  • 图像
    • 激光打印机、静态数码相机、数码摄像机
  • 工业控制系统
    • 运动控制

工业和汽车领域中的许多实时控制应用都得益于 ARM VFP9-S 提供的浮点的动态范围和准确性。汽车动力系统、防抱死制动系统、牵引控制和主动悬架系统都是关键业务应用,它们对准确性和可预测性的要求必不可少。

将 VFP9-S 整合到 SoC 设计中后,可使开发速度更快、性能更可靠,因为技术计算工具(MatLab、MATRIxx 等)可用于直接对系统建模和派生应用程序代码,从而确保系统设计行为更准确、可靠和可预测。

 

VFP10

ARM VFP10 是硬宏单元矢量浮点 (VFP) 协处理器,与所有 ARM10E™ 系列的 CPU 内核兼容。它支持单精度和双精度浮点;使 ARM 支持软件完全符合 IEEE754,或仅使硬件大致符合 IEEE754。支持代码包含两个组件:例行程序库和一组异常处理程序,前者执行未实现功能(如超越函数)和一些支持的功能(如分割),后者用于处理异常情况。

VFP10 功能

  • ISA 是 ARM VFPv2
  • 16 个双精度或 32 个单精度寄存器
  • 具有 64 位 LD/ST 接口的大型独立寄存器文件
  • 使 ARM 支持代码完全符合 IEEE754
  • 大致符合 IEEE754 的快速运行模式(仅硬件)
  • 与 VFP9 和 VFP11 保持二进制兼容
  • 标量和矢量操作支持(FP DSP 的理想选择)
  • 并行 LD/ST、FMAC 和 DIV/SQRT 执行引擎
  • 2.0Mflops/MHz
  • 面积 ~1.16mm 2 TSMC 0.13µm LV
  • 最多 325MHz(最坏情况)TSMC 0.13µm LV
  • <0.4mW/MHz(典型情况)功耗 TSMC 0.13µm LV

VFP10 指令集 (VFPv2)

  • 运算:
    • Add、Sub、Mult、Neg-Mult、Negate、Abs Value、Compare、Div、Square Root
  • FMAC(单版本和双版本):
    • Multiply-Add、Multiply-Subtract、Neg-Multiply-Add、Neg-Multiply-Subtract
  • 类型转换
  • 加载/存储标量和矢量,64 位/周期

VFP10 优点

ARM VFP10 的矢量处理功能为汽车动力系统、车身控制应用和图像应用(如打印中的缩放、转换和字体生成以及图形中的 3D 转换、FFT 和过滤)中使用的浮点体系结构提供增强的性能。下一代消费类产品(如 Internet 设备、机顶盒和家庭)可直接从 ARM VFP10 受益。

许多应用程序本身可从浮点的动态范围和准确性中受益。许多应用程序将移至到嵌入式应用程序,这些应用程序多年来始终基于浮点。推出 VFP10 后,可使用技术计算工具(如 MatLab 或 MATRIxx)轻松转换到嵌入式领域。

VFP10 应用

汽车控制应用

  • 动力系统
  • ABS
  • 牵引控制和主动悬架
  • 数字消费类产品
    • 机顶盒、游戏机
  • 3D 图形
    • FFT 和 FIR 过滤
  • 图像
    • 激光打印机、静态数码相机、数码摄像机
  • 工业控制系统
    • 运动控制

工业和汽车领域中的许多实时控制应用程序均从 ARM VFP10 提供的动态范围和准确性中受益。汽车动力系统、防抱死制动系统、牵引控制和主动悬架系统都是关键业务应用程序,它们对准确性和可预测性的要求必不可少。将 VFP10 整合到 SoC 设计中后,可使开发速度更快、性能更可靠,因为技术计算工具(MatLab、MATRIxx 等)可用于直接对系统建模和派生应用程序代码,从而确保系统设计行为更准确、可靠和可预测。

 

查看http://linux.chinaunix.net/bbs/thread-1125926-1-1.html可能有所收获

///////////////////////////////////////

一:早期ARM上的浮点模拟器:

早期的ARM没有协处理器,所以浮点运算是由CPU来模拟的,即所需浮点运算均在浮点运算模拟器(float math emulation)上进行,需要的浮点运算,常要耗费数千个循环才能执行完毕,因此特别缓慢。

直到今天,在ARM Kernel配置时,都有如下选项:

Floating point emulation --->

[ ] NWFPE math emulation

[ ] FastFPE math emulation (EXPERIMENTAL)

在这里,可以配置ARM 浮点模拟器。

 

浮点模拟器 模拟浮点是利用了undefined instrction handler,在运算过程中遇到浮点计算是产生异常中断,这么做带来的后果是带来极频繁的exception,大大增加中断延迟,降低系统实时性。

 

二:软浮点技术:

软浮点支持是由交叉工具链提供的功能,与Linux内核无关。当使用软浮点工具链编译浮点操作时,编译器会用内联的浮点库替换掉浮点操作,使得生成的机器码完全不含浮点指令,但是又能够完成正确的浮点操作。

 

三:浮点协处理器:

在较新版本的ARM中,可以添加协处理器。 一些ARM CPU为了更好的处理浮点计算的需要,添加了浮点协处理器。

并定义了浮点指令集。 如果不存在实际的硬件,则这些指令被截获并由浮点模拟器模块(FPEmulator)来执行。

 

 

四: 硬件浮点协处理器以及对应指令集的使用:

想要使用硬件浮点协处理器来帮助运算Application中的浮点运算。需要以下几个前提条件:

1. Kernel中设置支持硬件协处理器。

2. 编译器支持将浮点运算翻译成硬件浮点运算指令,或者在需要浮点运算的时候手动调用相应的浮点运算指令。

 

1. Kernle的支持:

如果Kernel不支持浮点协处理器,则因为协处理器寄存器等使用权限等问题,协处理器对应指令无法运行。

网络上有位高手指出:

CP15 c1 协处理器访问控制寄存器,这个寄存器规定了用户模式和特权对协处理器的访问权限。我们要使用VFP当然要运行用户模式访问CP10和CP11。
另外一个寄存器是VFP的FPEXC Bit30这是VFP功能的使用位。
其实操作系统在做了这两件事情之后,用户程序就可以使用VFP了。当然,Kernel 除了这2件事外,还处理了其他一些事情。

 

Floating point emulation --->
[*] VFP-format floating point maths

Include VFP support code in the kernel. This is needed IF your hardware includes a VFP unit.

 

2. 编译器指定浮点指令:

编译器可以显式指定将浮点运算翻译成何种浮点指令。

 

如果编译器支持软浮点,则其可能会将浮点运算翻译成编译器中自带的浮点库。则不会有真正的浮点运算。

否则,可以翻译成FPA(Floating Point Accelerator)指令。 FPA指令再去查看是否有浮点模拟器。

还可以将浮点运算指定为VFP(vector floating point)指令或者neon向量浮点指令。

 

 

五. 编译器指定编译硬浮点指令:

测试浮点加减乘除等运算的时间长度:

 

float src_mem_32[1024] = {1.024};


float dst_mem_32[1024] = {0.933};

 

for(j = 0; j < 1024; j++)
{
for(i = 0; i < 1024; i++)
{
src_32 = src_mem_32[i] + dst_mem_32[i];
}
}

通过printf 计算前后毫秒数的差值来看计算能力。

 

编译:

arm-hisiv200-linux-gcc -c -Wall fcpu.c -o fcpu.o

arm-hisiv200-linux-gcc fcpu.o -o FCPU -L./

运行,则得到32位浮点数加1024次所需要时间。

 

如果要使用VFP呢?

arm-hisiv200-linux-gcc -c -Wall -mfpu=vfp -mfloat-abi=softfp fcpu.c -o fcpu.o

arm-hisiv200-linux-gcc -Wall -mfpu=vfp -mfloat-abi=softfp fcpu.o -o FCPU -L./

则运行后发现,所需要时间几乎减小了一半。 说明还是非常有效果的。

关于-mfpu -mfloat-abi讲解:见附录2。

 

另外,如何才能在直观的检查出是否使用VFP呢?

可以通过察看编译出的ASM程序得到结论。

 

#arm-hisiv200-linux-objdump -d fcpu.o

00000000 <test_F32bit_addition>:
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e24dd00c sub sp, sp, #12
c: e3a03000 mov r3, #0
10: e50b300c str r3, [fp, #-12]
14: e3a03000 mov r3, #0
18: e50b3008 str r3, [fp, #-8]
1c: e3a03000 mov r3, #0
20: e50b3008 str r3, [fp, #-8]
24: ea000017 b 88 <test_F32bit_addition+0x88>
28: e3a03000 mov r3, #0
2c: e50b300c str r3, [fp, #-12]
30: ea00000d b 6c <test_F32bit_addition+0x6c>
34: e51b200c ldr r2, [fp, #-12]
38: e59f3064 ldr r3, [pc, #100] ; a4 <test_F32bit_addition+0xa4>
3c: e0831102 add r1, r3, r2, lsl #2
40: ed917a00 vldr s14, [r1]
44: e51b200c ldr r2, [fp, #-12]
48: e59f3058 ldr r3, [pc, #88] ; a8 <test_F32bit_addition+0xa8>
4c: e0831102 add r1, r3, r2, lsl #2
50: edd17a00 vldr s15, [r1]
54: ee777a27 vadd.f32 s15, s14, s15
58: e59f304c ldr r3, [pc, #76] ; ac <test_F32bit_addition+0xac>
5c: edc37a00 vstr s15, [r3]
60: e51b300c ldr r3, [fp, #-12]
64: e2833001 add r3, r3, #1
68: e50b300c str r3, [fp, #-12]
6c: e51b200c ldr r2, [fp, #-12]
70: e59f3038 ldr r3, [pc, #56] ; b0 <test_F32bit_addition+0xb0>
74: e1520003 cmp r2, r3
78: daffffed ble 34 <test_F32bit_addition+0x34>
7c: e51b3008 ldr r3, [fp, #-8]
80: e2833001 add r3, r3, #1
84: e50b3008 str r3, [fp, #-8]
88: e51b2008 ldr r2, [fp, #-8]
8c: e59f301c ldr r3, [pc, #28] ; b0 <test_F32bit_addition+0xb0>
90: e1520003 cmp r2, r3
94: daffffe3 ble 28 <test_F32bit_addition+0x28>
98: e28bd000 add sp, fp, #0
9c: e49db004 pop {fp} ; (ldr fp, [sp], #4)
a0: e12fff1e bx lr

 

这里明显包含vfp指令。 所以是使用vfp指令的:

arm-hisiv200-linux-gcc -c -Wall -mfpu=vfp -mfloat-abi=softfp fcpu.c -o fcpu.o

注意:VFP 指令指令在附录1中。

 

 

如果使用:

arm-hisiv200-linux-gcc -c -Wall fcpu.c -o fcpu.o

 

#arm-hisiv200-linux-objdump -d fcpu.o

00000000 <test_F32bit_addition>:
0: e92d4800 push {fp, lr}
4: e28db004 add fp, sp, #4
8: e24dd008 sub sp, sp, #8
c: e3a03000 mov r3, #0
10: e50b300c str r3, [fp, #-12]
14: e3a03000 mov r3, #0
18: e50b3008 str r3, [fp, #-8]
1c: e3a03000 mov r3, #0
20: e50b3008 str r3, [fp, #-8]
24: ea000019 b 90 <test_F32bit_addition+0x90>
28: e3a03000 mov r3, #0
2c: e50b300c str r3, [fp, #-12]
30: ea00000f b 74 <test_F32bit_addition+0x74>
34: e51b200c ldr r2, [fp, #-12]
38: e59f3068 ldr r3, [pc, #104] ; a8 <test_F32bit_addition+0xa8>
3c: e7932102 ldr r2, [r3, r2, lsl #2]
40: e51b100c ldr r1, [fp, #-12]
44: e59f3060 ldr r3, [pc, #96] ; ac <test_F32bit_addition+0xac>
48: e7933101 ldr r3, [r3, r1, lsl #2]
4c: e1a00002 mov r0, r2
50: e1a01003 mov r1, r3
54: ebfffffe bl 0 <__aeabi_fadd>
58: e1a03000 mov r3, r0
5c: e1a02003 mov r2, r3
60: e59f3048 ldr r3, [pc, #72] ; b0 <test_F32bit_addition+0xb0>
64: e5832000 str r2, [r3]
68: e51b300c ldr r3, [fp, #-12]
6c: e2833001 add r3, r3, #1
70: e50b300c str r3, [fp, #-12]
74: e51b200c ldr r2, [fp, #-12]
78: e59f3034 ldr r3, [pc, #52] ; b4 <test_F32bit_addition+0xb4>
7c: e1520003 cmp r2, r3
80: daffffeb ble 34 <test_F32bit_addition+0x34>
84: e51b3008 ldr r3, [fp, #-8]
88: e2833001 add r3, r3, #1
8c: e50b3008 str r3, [fp, #-8]
90: e51b2008 ldr r2, [fp, #-8]
94: e59f3018 ldr r3, [pc, #24] ; b4 <test_F32bit_addition+0xb4>
98: e1520003 cmp r2, r3
9c: daffffe1 ble 28 <test_F32bit_addition+0x28>
a0: e24bd004 sub sp, fp, #4
a4: e8bd8800 pop {fp, pc}

则不包含VFP指令。

且去调用 __aeabi_fadd

 

 

 

 

 

 

 

 

 

附录1 :VFP 指令

可以查看arm的realView文档。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Bcffbdga.html

 

附录2:

-mfpu=name
-mfpe=number
-mfp=number

This specifies what floating point hardware (or hardware emulation) is available on the target. Permissible names are: fpa, fpe2, fpe3, maverick, vfp. -mfp and -mfpe are synonyms for -mfpu=fpenumber, for compatibility with older versions of GCC.

 

 

 

-mfloat-abi=name
Specifies which ABI to use for floating point values. Permissible values are: soft, softfp and hard.

soft and hard are equivalent to -msoft-float and -mhard-float respectively. softfp allows the generation of floating point instructions, but still uses the soft-float calling conventions.

posted @ 2012-03-31 15:06  Akagi201  阅读(12778)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3