我正在编写c ++代码以在ARM cortex a9 CPU上运行。我的代码链接到一个使用soft-float编译的封闭源第三方库。我正在运行一个cortex-a9 ARM cpu。
我注意到如果我使用gcc标志 -mfloat-abi = softfp编译我的代码,它运行速度比使用-mfloat-abi = hard编译快得多。
我认为hard-float应该总是更快。是否有意义?
如何优化这些库调用?
谢谢!
一些注意事项:
第三方图书馆:
readelf -hA libXXX.so
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: ARM
Version: 0x1
Entry point address: 0x13780
Start of program headers: 52 (bytes into file)
Start of section headers: 1617724 (bytes into file)
Flags: 0x4000002, has entry point, Version4 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 7
Size of section headers: 40 (bytes)
Number of section headers: 28
Section header string table index: 27
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "ARM9TDMI"
Tag_CPU_arch: v4T
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_optimization_goals: Aggressive Speed
我的二进制文件:
readelf -hA XXX
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x1b0d4
Start of program headers: 52 (bytes into file)
Start of section headers: 1392964 (bytes into file)
Flags: 0x5000002, has entry point, Version5 EABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 8
Size of section headers: 40 (bytes)
Number of section headers: 38
Section header string table index: 35
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "Cortex-A9"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-2
Tag_VFP_arch: VFPv3
Tag_NEON_arch: NEONv1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align8_needed: Yes
Tag_ABI_align8_preserved: Yes, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
Tag_ABI_VFP_args: VFP registers
Tag_unknown_34: 1 (0x1)
Tag_unknown_42: 1 (0x1)
Tag_unknown_44: 1 (0x1)
Tag_unknown_68: 1 (0x1)
答案 0 :(得分:0)
-mfloat-abi=softfp
和-mfloat-abi=hard
选择的两个ABI不兼容。你不能混合搭配。
通常,您甚至无法在softfp
系统上使用hardfp
进程,除非您所有库在不同的lib
目录中重复( ie" multiarch")。
如果您的代码在功能参数中没有使用float
或double
类型,那么您可能会发现它实际上确实有效,但您仍 这样做,或者你正在玩火。
在任何情况下,如果您的代码完全基于整数,那么这些选项对生成的代码没有任何影响,因此性能更改必须来自其他地方。当您意外指定-mfloat-abi
选项时,您使用的编译器可能会自动选择不同的multilib或不同的CPU(GCC特别习惯切换回默认的multilib)。也许你错误地打开NEON,或者从A8调到A9?