zoukankan      html  css  js  c++  java
  • VFPARM浮点体系结构机介绍

    浮点

        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.

  • 相关阅读:
    Redis 发布与订阅模式
    JS回调函数全解析教程
    如何让你的SQL运行得更快
    Apache设置禁止访问目录
    Ext.Ajax.request提交实现waitMsg效果
    sublime的快捷键整理
    Sublime Text 2插件[这个不错哦]
    mysql如何开启对外连接?
    Javascript之旅——终点站:困惑的settimeout
    Javascript之旅——第十一站:原型也不好理解?
  • 原文地址:https://www.cnblogs.com/Akagi201/p/2427063.html
Copyright © 2011-2022 走看看