FPU与VFP最全面解释

news2025/2/2 2:56:21

本文希望能将FPU以及ARM中的FPU介绍清楚。

1. FPU(Floating-Point Unit)

浮点运算单元是处理器内部用于执行浮点数计算的逻辑部件,或者说硬件电路。不是所有的处理器都有该功能。浮点运算满足IEEE 754的标准,所谓IEEE 754标准,定义了浮点数字的存储和计算方式、计算异常等,比如IEEE 754标准准确地定义了单精度(32位)和双精度(64位)浮点格式。
对于含有FPU的处理器,我们可以通过控制编译选项的方式使编译器编译出的代码使用FPU指令。

2. -mfloat-abi=name来指定浮点运算处理方式

gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。

  1. soft是指所有浮点运算全部在软件层实现,比如ARM提供了一个「浮点支持软件库」用于计算浮点数:fplib。使用软件的方式来计算浮点最终是通过执行了很多的指令来完成一次运算,不仅慢而且程序体积大。fplib提供的 API 以__aeabi开头,比如:__aeabi_fadd:计算两个float型浮点数加法(float占4个字节,32位)
  2. softfp是指浮点运算的实际计算是在FPU上来做,但是传递浮点运算的参数是用整形的通用寄存器(r0-r3)来传递的。比如float fadd(float a, float b),a和b实际上是通过r0,r1传入到被调函数的,结果也是通过r0传出的。
  3. hard与softfp的区别是不仅运算实际发生在FPU上,浮点参数的传递使用的也是浮点专用寄存器。以上同样的例子,a和b是通过s0, s1寄存器来传的,结果是通过s0传出的。softfp和hard两种模式不兼容,所以你不能将一个使用softfp方式的库和另外一个使用hard的库或目标文件链接起来。因为如此,armv7有些编译好的库(比如glibc使用softfp)没法在使用另一种使用hard的应用中编译。
    在这里插入图片描述

使用软件库编译出的代码实例:
在这里插入图片描述
使用hard编译出的使用FPU的代码实例:
在这里插入图片描述

3. -mfpu=name来指定浮点协处理的类型

在ARM中的FPU被称为VFP(Vector Floating Point),即向量浮点运算,之所以称为“向量”浮点是因为在ARMv6及以前这个扩展不只是用于增加浮点数计算处理,同时也用于类似向量的SIMD浮点数计算处理。在ARMv7架构中,这种使用VFP来处理向量浮点数据的方式不建议采用,相关的功能可以使用“先进SIMD扩展”来替代。而vfp经过几代的发展和完善,出现了vfpv3, vfpv4, fpv5等多个版本,每个版本又可以配置为不同的使用方式,所以,这个-mfpu参数就是指定所采用的vfp硬件。
在文档《Arm Compiler for Embedded Reference Guide》中列举了可以使用的值,可选类型如none, softvfp,vfpv3,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd, neon, vfpv4,fpv4-sp-d16,fpv5-d16,fpv5-sp-d16等。简单从文档中摘出几个:

  • none, softvfp: Use either -mfpu=none or -mfpu=softvfp to prevent the compiler from using hardware-based floating-point functions. If the compiler encounters floating-point types in the source code, it uses software-based floating-point library functions. This option is similar to the -mfloatabi=soft option.
  • vfpv3: Enable the Armv7 VFPv3 Floating-point Extension. Disable the Advanced SIMD extension.
  • vfpv3-d16: Enable the Armv7 VFPv3-D16 Floating-point Extension. Disable the Advanced SIMD extension.
  • vfpv3-fp16: Enable the Armv7 VFPv3 Floating-point Extension, including the optional half-precision extensions. Disable the Advanced SIMD extension.
  • vfpv4:Enable the Armv7 VFPv4 Floating-point Extension. Disable the Advanced SIMD extension.
  • neon-vfpv4:Enable the Armv7 VFPv4 Floating-point Extension and the Advanced SIMD extension.
  • fpv5-sp-d16: Enable the Armv7 FPv5-SP-D16 Floating-point Extension for single precision only.

如果你对d16之类的后缀感兴趣,下面这张浮点寄存器表可能解答你的疑惑,其中D代表double,64bit寄存器,sp表示single precision, 表示只允许32位单精度浮点计算:
在这里插入图片描述
还有个小问题就是vfpv3, vfpv4, vfpv5之间有什么区别呢?从维基百科ARM architecture family 4.10章节中摘录如下:https://en.wikipedia.org/wiki/ARM_architecture_family#Floating-point_(VFP)

  • VFPv1
    Obsolete
  • VFPv2
    An optional extension to the ARM instruction set in the ARMv5TE, ARMv5TEJ and ARMv6 architectures. VFPv2 has 16 64-bit FPU registers.
  • VFPv3 or VFPv3-D32
    Implemented on most Cortex-A8 and A9 ARMv7 processors. It is backward-compatible with VFPv2, except that it cannot trap floating-point exceptions. VFPv3 has 32 64-bit FPU registers as standard, adds VCVT instructions to convert between scalar, float and double, adds immediate mode to VMOV such that constants can be loaded into FPU registers.
  • VFPv3-D16
    As above, but with only 16 64-bit FPU registers. Implemented on Cortex-R4 and R5 processors and the Tegra 2 (Cortex-A9).
  • VFPv3-F16
    Uncommon; it supports IEEE754-2008 half-precision (16-bit) floating point as a storage format.
  • VFPv4 or VFPv4-D32
    Implemented on Cortex-A12 and A15 ARMv7 processors, Cortex-A7 optionally has VFPv4-D32 in the case of an FPU with Neon. VFPv4 has 32 64-bit FPU registers as standard, adds both half-precision support as a storage format and fused multiply-accumulate instructions to the features of VFPv3. 相比v3增加了半精度和乘加指令的支持。
  • VFPv4-D16
    As above, but it has only 16 64-bit FPU registers. Implemented on Cortex-A5 and A7 processors in the case of an FPU without Neon.
  • VFPv5-D16-M
    Implemented on Cortex-M7 when single and double-precision floating-point core option exists. 单双精度可以选择。

此外,关于VFP架构和功能上的一些解释可以参考:《ARM Compiler armasm User Guide Version 5.06》 VFP Programming一节,写得比较清楚: https://developer.arm.com/documentation/dui0473/m/vfp-programming/architecture-support-for-vfp

4. NEON和VFP

在上面的一些介绍中,可以看到NEON经常和VFP一起出现,ARM中的NEON即SIMD(单指令多数据)技术,是一种真正的向量化运算方式,他们之所以耦合在一起是因为他们公用浮点寄存器。
在这里插入图片描述在这里插入图片描述
这里插一句题外话,如果想入门ARM SIMD编程,【张先轶】SIMD向量化编程入门——https://www.bilibili.com/video/BV1KZ4y1Y7VH/?spm_id_from=333.337.search-card.all.click&vd_source=d9ead405209236cb507b6c90c75777f9 这个课程可以借鉴。

以下是NEON与VFP的几点异同。

  1. ARM架构中支持 没有NEON和VFP, 只有VFP,NEON和VFP都有 三种配置,不支持只有NEON的配置。
  2. NEON使用32个双精度浮点寄存器,即32D,因此如果一些VFP配置D16则就无法使用NEON了。
  3. NEON不支持双精度浮点的计算,也不支持如square root和divide等一些比较复杂的浮点运算。

5. 编译工具中配置FPU

在上述2和3中描述了如何配置编译选项能够让编译器编译出来使用FPU指令的代码,那对于没有makefile的GUI用户如何设置呢?
MDK:
在这里插入图片描述
IAR:
在这里插入图片描述
ARM Cortex - M4内核中将 FPU 作为协处理器设计的,所以通过设置协处理器访问控制(CPACR,Co-processor access control register)来控制是否使能FPU。在这些工具软件中使能FPU后,编译器会设置宏定义__FPU_USED == 1,该配置将在代码中启用FPU硬件。

#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
 SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
#endif

参考:

  1. ARM技术杂谈:何谓FPU、VFP、ASE、NEON、MPE、SVE、SME以及MVE —— https://www.eefocus.com/article/521046.html
  2. Armv8上不弃不离的NEON/FPU —— https://www.jianshu.com/p/a19cc2ca59da
  3. ARM FPU 加速浮点计算 介绍 —— https://blog.csdn.net/u014436243/article/details/122078377
  4. ARM Cortex-A Series Programmer’s Guide for ARMv7-A —— https://developer.arm.com/documentation/den0013/d/Introducing-NEON/NEON-architecture-overview/Commonality-with-VFP
  5. ARM Cortex-M7 Processor Technical Reference Manual r0p2:About the FPU —— https://developer.arm.com/documentation/ddi0489/b/floating-point-unit/about-the-fpu
  6. IEEE 754浮点数标准详解 —— http://c.biancheng.net/view/314.html
  7. arm浮点运算 —— http://t.zoukankan.com/-9-8-p-9254964.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Linux的动静态库

文章目录什么是动静态库生成静态库生成发布生成动态库发布使用库使用静态库查看系统头文件路径查看系统库文件路径使用库文件和头文件指定路径搜索头文件卸载库使用动态库动态库的运行搜索路径什么是动静态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时…

再携手,齐并进!菊风助力宁波银行坐席PUSH外呼项目

随着“金融数字化”逐步成为金融行业的新浪潮&#xff0c;运用更加灵活的触达手段提升营销效果&#xff0c;促成业务闭环愈发成为银行业等金融机构角逐数字化转型成功的关键。 在此背景下&#xff0c;金融机构对于实时音视频技术的应用也从普遍的「呼入」需求逐步扩展到创新的…

LinkedHashSet源码解析

LinkedHashSet源码解析 问题 &#xff08;1&#xff09;LinkedHashSet 的底层使用什么存储元素&#xff1f; &#xff08;2&#xff09;LinkedHashSet 与 HashSet 有什么不同&#xff1f; &#xff08;3&#xff09;LinkedHashSet 是有序的吗&#xff1f; &#xff08;4&a…

Vue2与Vue3 setup的使用差异与对比

最近一直在做vue2的技术栈升级&#xff0c;于是心血来潮&#xff0c;就想要不写篇文章总结一下vue2和vue3在使用上的不同吧&#xff0c;于是乎&#xff0c;我们这就开始吧&#xff01; 首先说明一下&#xff0c;vue3有多种写法&#xff0c;本文使用setup语法糖&#xff0c;不考…

硬核!Github 星标 79.4K 的阿里强推 Java 面试参考指南到底有多强?

谈到 Java 面试&#xff0c;相信大家第一时间脑子里想到的词肯定是金三银四&#xff0c;金九银十。好像大家的潜意识里做 Java 开发的都得在这个时候才能出去面试&#xff0c;跳槽成功率才高&#xff01;但 LZ 不这么认为&#xff0c;LZ 觉得我们做技术的一生中会遇到很多大大小…

组件技术--设计--jsp+servlet+bean+MySQL 简单的登录注册案例

JavaBeanMySQLjspservlet 简单的登录注册案例登录注册案例需求核心系统组成Javaweb项目框架基本思想BeancounterUserDaoUserDaoservletLoginCljspindex.jspLoginServlet.jspregister.jspregisterMessage.jspwelcome.jsptargetpom.xmlWEB-INFweb.xml登录注册案例需求 本项目利用…

【论文阅读笔记】CycleISP: Real Image Restoration via Improved Data Synthesis

论文地址&#xff1a;https://arxiv.org/abs/2003.07761 代码地址&#xff1a;https://github.com/swz30/CycleISP 论文小结 总的来说&#xff0c;就是现实世界中无法获取有效的图像对。且之前合成噪声的方式是在sRGB上添加高斯白噪声&#xff0c;但对于相机传感器成像管道来说…

工控CTF之协议分析7——OMRON

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

同源策略跨域

目录1.同源策略限制的意义1.请求协议 均为 http2.主机此这为 localhost3.端口号不同 一个 8080 一个 50002.注意3.解决跨域代理服务器 80801.同源策略限制的意义 让前端发送的请求不能随意访问其他端口的服务器&#xff0c;一定程度保护服务器和用户的隐私 1.请求协议 均为 …

nexus上传jar包

nexus上传自定义starter1、普通jar包和springboot的starter1.1、starter上传简介1.2、上传方法2.1.1、setting.xml文件2.1.2、项目中的pom文件1.3、具体部署2、父pom文件上传这里我们主要讲解两种&#xff0c;一种是jar包上传&#xff0c;包含普通jar包和springboot的starter包…

jmeter简单压力测试

测试目的&#xff1a;10个用户并发访问一个接口&#xff08;http://127.0.0.1:8080/dfm/login.action&#xff09;&#xff0c;能否正常响应。 一、打开JMeter 二、右击“测试计划”&#xff0c;添加线程组 三、设置线程组的线程数 JMeter中的线程组&#xff0c;类似于LoadRunn…

RCTFweb复现

文章目录filechecker_minieasy_uploadfilechecker_plusfilechecker_pro_maxezbypassezruoyifilechecker_mini 给了附件&#xff0c;代码比较短&#xff0c;先审计一下。 在这里发现了file –b命令&#xff0c;且filepath部分可控&#xff0c;明显的ssti漏洞&#xff0c;没过…

Clickhouse引擎之kafka

Clickhouse kafka引擎需要结合kafka使用&#xff0c;需要确保已经安装clickhouse和kafka 实战环境&#xff1a; Clickhouse-server 版本&#xff1a;22.4.5 Kafka版本&#xff1a;kafka_2.13-3.2.0 Clickhouse数据库执行&#xff1a; 1、使用引擎创建一个kafka消费者 CREA…

【OpenCV+Qt】使用车牌识别系统EasyPR识别车牌号

EasyPR是一个中文的开源车牌识别系统&#xff0c;其车牌识别划分为了两个过程&#xff1a;即车牌检测&#xff08;Plate Detection&#xff09;和字符识别&#xff08;Chars Recognition&#xff09;两个过程&#xff1a; 车牌检测&#xff08;Plate Detection&#xff09;&am…

用于医疗诊断的花青染料ICG-Sulfo-EG8-OSu,

凯新生物产品介绍&#xff1a; (ICG)是一个用于医疗诊断的花青染料。它是用于测定心输出量、肝脏功能、肝血流量,和对于眼科血管造影术。它有一个最大吸收光谱在800nm附近。这些红外波段可以穿透视网膜层,相比荧光素血管造影ICG血管造影图像允许进入更深的血液循环。传统的激活…

华为机试_HJ24 合唱队【中等】【收藏】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码 学习代码 代码一 代码二 收藏点 描述 N 位同学站成一排&#xff0c;音乐老师要请最少的同学出列&#xff0c;使得剩下的 K 位同学排成合唱队形。 设KK位同学从左到右依次编号为 1&#xff0…

想学Redis却不会安装,这有一个快速入门请拿去

一. Redis简介 1.什么是Redis Redis是一个完全开源免费、且遵守BSD协议的&#xff0c;高性能(NOSQL)的key-value数据库。Redis本身使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型&#xff0c;并提供多种语言的API。 2.Redis特点 Redis具有如下特点&#xff1…

DJ13-2 汇编语言程序设计

目录 一、顺序程序设计 二、分支程序设计 1. 用比较/测试命令条件转移指令实现分支 2. 采用跳转表实现多路分支 三、循环程序设计 1. 计数循环程序设计 2. 条件判断循环程序设计 四、子程序设计 1. 子程序设计举例 2. 主程序和子程序设计举例 一、顺序程序设计 举例…

低代码为什么会受到企业青睐?是何原因?

低代码为什么会受到企业青睐&#xff1f;是何原因&#xff1f;回答这个问题&#xff0c;只需用4个“更”字&#xff0c;就能很好的概括。 1、更快&#xff08;开箱即用&#xff09; 2、更省&#xff08;人力、时间成本&#xff09; 3、更合适&#xff08;需求贴合业务&#…

mfc常用控件

mfc在编写桌面客户端应用应用程序&#xff0c;在设计界面时&#xff0c;如果像一般的界面&#xff0c;实施人员或者适配人员使用(特定的用户群体)对界面要求没有那么高&#xff0c;只要软件功能正常&#xff0c;稳定就行&#xff0c;我们在做这些界面时&#xff0c;通常使用原生…