将硬浮动链接到softfp不良性能

时间:2014-07-31 13:28:16

标签: c gcc arm elf eabi

我正在编写c ++代码以在ARM cortex a9 CPU上运行。我的代码链接到一个使用soft-float编译的封闭源第三方库。我正在运行一个cortex-a9 ARM cpu。

我注意到如果我使用gcc标志 -mfloat-abi = softfp编译我的代码,它运行速度比使用-mfloat-abi = hard编译快得多。

我认为hard-float应该总是更快。是否有意义?

如何优化这些库调用?

谢谢!

一些注意事项:

  • 库接口仅由整数,字符串和指针构成,并且工作正常。
  • 加速大约是x8,支持softfp。
  • 有关二进制文件的readelf平台相关信息:

第三方图书馆:

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)

1 个答案:

答案 0 :(得分:0)

-mfloat-abi=softfp-mfloat-abi=hard 选择的两个ABI不兼容。你不能混合搭配。

通常,您甚至无法在softfp系统上使用hardfp进程,除非您所有库在不同的lib目录中重复( ie" multiarch")。

如果您的代码在功能参数中没有使用floatdouble类型,那么您可能会发现它实际上确实有效,但您仍 这样做,或者你正在玩火。

在任何情况下,如果您的代码完全基于整数,那么这些选项对生成的代码没有任何影响,因此性能更改必须来自其他地方。当您意外指定-mfloat-abi选项时,您使用的编译器可能会自动选择不同的multilib或不同的CPU(GCC特别习惯切换回默认的multilib)。也许你错误地打开NEON,或者从A8调到A9?