ARM 浮点运算详解

2023-11-09

一:早期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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM 浮点运算详解 的相关文章

  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 如何从对Web服务发出的请求中获取客户端IP地址

    我的 IIS 中托管有一个 Web 服务 当客户端直接使用我的服务时 我需要找出客户端 IP 地址 like http MyIpAddress MyApplication MyWebServiceClass asmx http MyIpAd
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • 为什么迭代器类型推导失败? [复制]

    这个问题在这里已经有答案了 为什么这在 C 中不起作用 为什么我不能限制foo的参数为std vector
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 我们什么时候应该在.NET中使用NativeMemory.Alloc()? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 NET6 C 引入NativeMemory类 但我不知道什么时候应该使用NativeMemory Alloc 而不是普通的数组实例化
  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • Xcode 新手无法用 C++ 打开文件?

    我一直在我参加的课程中使用 Windows 但我正在尝试运行基本代码来弄清楚如何从 Xcode 上的文件打开 关闭 输入 输出 而我通常在 Visual Studio 上使用的代码不是不知道为什么 谢谢 include
  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th
  • 这个元组创建习惯有名字吗?

    On the 增加邮件列表 http lists boost org Archives boost 2014 06 214213 php LouisDionne 最近发布了以下创建类似元组的实体的巧妙技巧 include
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int
  • 使用 ImageResizer 获取图像尺寸的最佳方法

    我正在将现有的 MVC 4 网站从自制用户文件上传切换为在上传时使用 ImageResizer 调整文件大小 我在文档中看到我不应该使用 System Drawing 但我无法找出任何其他获取图像尺寸的方法 尺寸是来自原始图像还是调整大小的
  • 从最大到最小的3个整数

    我是 C 初学者 我使用 编程 使用 C 的原理与实践 第二版 问题如下 编写一个程序 提示用户输入三个整数值 然后以逗号分隔的数字顺序输出这些值 如果两个值相同 则应将它们排列在一起 include
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐

  • WPFPasswordBox绑定问题

    PassWordBox的Password属性为什么不能绑定 Introduction WPF中的PassWordBox是用于输入密码的控件 它的Password属性是用于获取或设置PassWordBox中的密码 但是 有很多开发者在使用WP
  • 【CSS】回流/重排与重绘

    回流 重排与重绘 回流 重排 回流的基本概念 会引起浏览器回流的操作 重绘 重绘的概念 浏览器优化机制 如何减少回流和重绘 隐藏元素的方法 浏览器使用流式布局模型 Flow Based Layout 浏览器会把HTML解析成DOM 把CSS
  • 虹软24届校招--AIGC&;图像处理&;产品经理&;算法优化

    比亚迪求职意向分类 8 19美团笔试 外卖骑手一面面经 外卖骑手一面面经 比亚迪求职意向分类 比亚迪开了但没完全开 比亚迪已开 外卖骑手一面面经 比亚迪 地平线校招正式批 美团测开校招一面 2023 华为笔试题 0830 美团 测开 到店事
  • Python中的map()函数

    前言 今天做题时遇到了map 函数 来学习一下 如果感觉博主的文章还不错的话 还请关注 点赞 收藏三连支持一下博主哦 目录 map函数 描述 语法 返回值 实例 map函数 描述 map在这里不是地图的意思 在编程领域 map一般作 映射
  • 富文本组件VueQuill添加源代码编辑功能

    文章目录 前言 一 VueQuill地址 二 Module quill html edit button 的位置 二 使用步骤 1 安装依赖 2 修改富文本组件 src components Editor index vue 3 验证 总结
  • Linux生成dumpcore并进行调试,以及addr2line的用法

    1 在终端中输入ulimit c 如果结果为0 说明当程序崩溃时 系统并不能生成core dump 2 使用ulimit c unlimited命令 开启core dump功能 并且不限制生成core dump文件的大小 如果需要限制 加数
  • Android 重写系统Crash处理类,保存Crash信息到SD卡 和 完美退出程序的方法

    转载时注明地址 http blog csdn net xiaanming article details 9344703 我们开发Android应用的时候 当出现Crash的时候 系统弹出一个警告框 如下图一 有些手机会黑屏几秒钟然后还伴随
  • C语言:分支语句和循环语句(超详解)

    目录 编辑 什么是语句 分支语句 选择结构 if语句 应该注意的是 switch语句 运用练习 循环语句 while循环 for循环 break和continue在for循环中 for循环的变换使用 do while 循环 do while
  • Eclipse的switch workspace删除多余workspace

    很多朋友很懊恼 如何删除eclipse里的switch workspace不要的workspace 这里来介绍一个简单的操作方法 方法 步骤 第一步 删除项目文件夹 找到目录下的项目文件夹 右键删除或者 Delete 按钮 第二步 修改or
  • 查看数据库某个schema下哪张表占的空间大

    为了查询schema下某个表占用的空间问题 以便处理分析问题 直接复制粘贴 改schema 即可 select TABLE NAME concat truncate data length 1024 1024 2 MB as data si
  • Cpu运作原理与机制,那么CPU如何跑的更快?

    前言 代码都是由 CPU 跑起来的 我们代码写的好与坏就决定了 CPU 的执行效率 特别是在编写计算密集型的程序 更要注重 CPU 的执行效率 否则将会大大影响系统性能 CPU 内部嵌入了 CPU Cache 高速缓存 它的存储容量很小 但
  • 数学建模中的常见模型

    数学建模中比较常见的几种模型 一 预测与预报 1 灰色预测模型 必须掌握 满足两个条件可用 数据样本点个数少 6 15个 数据呈现指数或曲线的形式 例如 可以通过极值点和稳定点来预测下一次稳定点和极值点出现的时间点 2 微分方程预测 高大上
  • 怎样改变input被选中时边框颜色

    1 当input获得焦点时 input focus outline 1px solid 000 2 输入合法时 input valid border 1px solid green 3 输入不合法时 input invalid border
  • ElasticSearch 入门教程笔记

    视频教程 狂神说Java ElasticSearch7 6 x最新完整教程通俗易懂 视频地址 https www bilibili com video BV17a4y1x7zq 拒绝白嫖 感谢狂神分享的视频教程 ElasticSearch
  • Echarts 给pie圆饼图series.data 赋值

    1 如何去掉字符串最外层的双引号 使其变成数组 var data id 32 wd 20 3 jd 113 3 id 321 wd 20 3 jd 113 3 var yy var mm yy data split for var i 0
  • 数据挖掘算法与现实生活中的应用案例

    如何分辨出垃圾邮件 如何判断一笔交易是否属于欺诈 如何判断红酒的品质和档次 扫描王是如何做到文字识别的 如何判断佚名的著作是否出自某位名家之手 如何判断一个细胞是否属于肿瘤细胞 等等 这些问题似乎都很专业 都不太好回答 但是 如果了解一点点
  • 归因分析计算因子贡献度常见的方法

    在归因分析中 我们一般都需要计算出每个因子的贡献度是多少 比如产品DAU上升 对年龄段维度进行拆解 看是不同年龄段的用户对DAU上升的贡献度是多少 一般根据指标的类型 计算贡献度的方法也不一样 下面就列出一些常见的归因分析贡献度的计算方法
  • mt4服务器显示无连接,MT4登录显示“无效账户”,“无法连接”怎么解决

    MT4账户分为实盘账户和模拟账户 小编每天都会收到很多客户实盘账号登入不上去的申请 有的客户反应账户显示登录无效 或者无连接 没有数据流 客户就会问 是不是我的账号过期不能使用 其实不是的 账户登入不上有如下几个原因 首先我先要告诉大家 一
  • ISP(图像信号处理)算法概述、工作原理、架构、处理流程

    转自 https zhuanlan zhihu com p 115321553 ISP的主要内部构成 ISP内部包含 CPU SUP IP 各种功能模块的通称 IF 等设备 ISP的控制结构 1 ISP逻辑 2 运行在其上的firmware
  • ARM 浮点运算详解

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