ARMv8(aarch64)平台GCC软件模拟浮点运算的编译方法问询
背景
我在搭载Ubuntu 20.04 LTS aarch64系统的Raspberry Pi 4 Model B Rev 1.4上做编译测试。lscpu命令输出如下:
Architecture: aarch64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Vendor ID: ARM Model name: Cortex-A72 Model: 3 Thread(s) per core: 1 Core(s) per cluster: 4 Socket(s): - Cluster(s): 1 Stepping: r0p3 CPU max MHz: 1800.0000 CPU min MHz: 600.0000 BogoMIPS: 108.00 Flags: fp asimd evtstrm crc32 cpuid
当前环境下GCC的目标架构是aarch64-linux-gnu,我清楚Cortex-A72具备浮点硬件,且aarch64不支持-mfloat-abi=soft编译选项。
需求
我正在用C语言实现定点算术版的atan()函数,想对比这个定点实现和通过软件例程模拟浮点运算的atan()函数的运行性能:
- 已有一个包含定点函数实现的
.c文件,仅使用整数参数; - 已有一个引用文件
.c,调用数学库中接收浮点参数的atan()函数。
问题
有没有GCC编译选项能在当前环境下把浮点指令转换成软件模拟实现?这可行吗?还是必须更换无浮点硬件支持的平台?
我的定点实现可正常编译(无需特殊选项,无浮点指令需模拟),但希望编译调用浮点参数的引用函数时,将其转换成模拟浮点行为的定点汇编指令。
解决方案
在aarch64架构下确实没法用-mfloat-abi=soft,但有两种可行方式实现软件模拟浮点运算:
- 指定无FP的aarch64架构变体:编译引用文件时加上
-march=armv8-a+nofp选项,GCC会生成完全不依赖浮点硬件的代码,所有浮点操作都会通过软件模拟实现,正好满足你对比性能的需求。 - 链接软浮点数学库:如果系统中有软浮点版本的数学库(比如
libmsoft.a),编译时加上-lmsoft选项,强制链接软浮点库以替代默认的硬件加速浮点库。如果系统没有该库,可能需要自行编译带软浮点支持的GCC工具链。
注意事项
- 仅给引用文件使用上述编译选项,定点实现的文件保持原编译方式,避免不必要的性能损耗。
- 使用
-march=armv8-a+nofp时,生成的代码兼容性更广,但性能会显著下降,这正是你需要的测试场景。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

