编译配置(1)——ARMv7,ARMv8(AArch64) 浮点配置等相关知识

-mfpu -mfloat-abi

这两个编译器配置选项一般只适用于ARMv7及以下arm架构,对于ARMv8架构,对应的编译器是不能识别这两个编译配置的

arm-linux-gcc -march=armv7-a -mfpu=neon -mfloat-abi=hard -o test test.c
参考链接:
https://blog.csdn.net/u014470361/article/details/87931856

ABI即“application binary interface”,即编译器将c代码编译成汇编代码时使用的一种规则
使用规范如下:
在编译带有浮点参数的函数时,有三种可能的编译选项:
-mfloat-abi=soft
-mfloat-abi=softfp
-mfloat-abi=hard

"soft"选项:表明不使用FPU硬件,而是使用GCC的整数算术运算来模拟浮点运算。

"softfp"选项:表明要使用FPU硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU中。
"hard"选项:表明要使用FPU硬件来做浮点运算,并且,函数的参数直接传递到FPU的寄存器(s0、d0)中。

AArch64

AArch64必须使用高级SIMD(又名NEON),这个架构下neon是默认启动的,因此不用添加这个’-mfpu=neon’的编译器选项来指示编译器使用NEON。

AArch64选项

参考链接:

https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html#AArch64-Options
-mgeneral-regs-only		生成仅使用通用寄存器的代码。这将防止编译器使用浮点和高级SIMD寄存器,但不会对汇编程序施加任何限制。

-march and -mcpu Feature Modifiers
‘fp’
Enable floating-point instructions. This is on by default for all possible values for options -march and -mcpu.
‘simd’
Enable Advanced SIMD instructions. This also enables floating-point instructions. This is on by default for all possible values for options -march and -mcpu.

在这里插入图片描述

查看处理器特性

RK3399

rk3399_all:/ # cat /proc/cpuinfo                                               
processor       : 0
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

...

Serial          : 79139f04652ea2da

s5p4418

# cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 0 (v7l)
processor       : 0
BogoMIPS        : 1581.05

processor       : 1
BogoMIPS        : 1591.29

processor       : 2
BogoMIPS        : 1591.29

processor       : 3
BogoMIPS        : 1591.29

Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc09
CPU revision    : 0

Hardware        : s5p4418
Revision        : 0000
Serial          : 760e92621ed002b70000008004e81234

RK3399是双Cortex-A72+四Cortex-A53 大小核CPU结构,Cortex-A72和Cortex-A53都属于Armv8-A 架构。
s5p4418是Cortex-A9架构,属于ARMv7架构。

3399 CPU:
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
4418 CPU:
Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls

RK3399 CPU Features属性支持fp和asimd,s5p4418 CPU Features属性支持vfp、vfpv3和neon。
对应关系大致如下:
armv7–neon vfpv3
armv8–asimd fp

所以RK3399硬件上支持浮点和asimd,AArch64默认配置了fp和simd,因此RK3399平台默认是支持硬浮点的。

验证

反汇编

运算实例对比测试

TBC

==================================================

部分概念

Neon(ARM架构处理器扩展结构)

Neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。

参考链接:
https://developer.arm.com/architectures/instruction-sets/simd-isas/neon?_ga=2.235784193.1624414071.1615184487-2111980882.1614667282

FPU:(Float Point Unit,浮点运算单元)

FPU是专用于浮点运算的处理器,以前的FPU是一种单独芯片,在486之后,英特尔把FPU集成在CPU之内。

proc文件系统

https://en.wikipedia.org/wiki/Procfs#Linux

/proc/cpuinfo,其中包含有关CPU的信息,例如其供应商(以及CPU系列,型号和型号名称,应允许用户识别CPU)及其速度(CPU时钟速度),缓存大小,同级件数,内核, 和CPU标志。 /proc/cpuinfo包含一个“ bogomips”的值,它经常被误认为是衡量CPU速度的指标(例如基准),但实际上根本没有衡量任何有意义的值(对于最终用户)。 它是内核计时器校准的副作用,即使在相同的时钟速度下,它也会根据CPU类型而产生很大变化的值。

参考资源链接:[ARMv8-A架构详解:ARMv8-A指令集与寄存器指南](https://wenku.csdn.net/doc/6412b70abe7fbd1778d48dfd?utm_source=wenku_answer2doc_content) 在开发基于ARMv8-A架构的软件时,理解AArch64与AArch32指令集的区别对于性能优化和兼容性保证至关重要。AArch64ARMv8-A架构的64位执行状态,为应用程序提供更大的地址空间和更多的寄存器,能够更好地支持高级编程模型和系统级功能,适合执行需要大量数据处理和高并发的应用程序,如服务器、云计算、大数据处理等。 要充分利用AArch64指令集优化性能,开发者应该关注以下几点: 1. 利用增加的寄存器数量,通过寄存器间接寻址减少内存访问次数,提高程序运行效率。 2. 利用AArch64提供的一系列新的指令,如针对SIMD和浮点运算的指令,以提升特定算法的性能。 3. 优化数据对齐和内存访问模式,以减少缓存未命中和内存访问延迟。 AArch32,也称为ARM状态,在ARMv8-A架构中作为32位执行状态存在,主要用于保持对旧版ARM架构的兼容性。它允许在64位的处理器上运行为旧架构编写的32位代码,这对于那些需要向后兼容的应用程序来说非常重要。 为确保应用的兼容性,开发者在编写应用程序时应考虑以下策略: 1. 在可能的情况下,保持代码对AArch32的兼容性,以便能够运行在旧的ARM架构设备上。 2. 使用条件编译或架构检测技术,根据目标设备的架构选择合适的执行状态。 3. 在编写新的应用程序时,主要关注AArch64的性能优势,但在必要时提供AArch32的二进制代码。 开发者可以通过《ARMv8-A架构详解:ARMv8-A指令集与寄存器指南》获取到关于AArch64和AArch32指令集的深入细节,从而更好地掌握如何在性能优化和兼容性之间取得平衡。该手册详细介绍了两种指令集的特点和适用场景,是优化ARMv8-A架构软件的关键参考资料。 参考资源链接:[ARMv8-A架构详解:ARMv8-A指令集与寄存器指南](https://wenku.csdn.net/doc/6412b70abe7fbd1778d48dfd?utm_source=wenku_answer2doc_content)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值