编译配置(1)——ARMv7,ARMv8(AArch64) 浮点配置等相关知识
Neon(ARM架构处理器扩展结构)Neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。FPU:(Float Point Unit,浮点运算单元)FPU是专用于浮点运算的处理器,以前的FPU是一种单独芯片,在486之后,英特尔把FPU集成在CPU之内。-mfpu -mfloat-ab
-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类型而产生很大变化的值。
更多推荐
所有评论(0)