gpt4 book ai didi

c - 将硬 float 链接到 softfp 不良性能

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:22 24 4
gpt4 key购买 nike

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

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

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

如何优化这些库调用?

谢谢!

一些注意事项:

  • 库接口(interface)仅由整数、字符串和指针构建,并且运行良好。
  • 加速约为 8 倍,有利于 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)

最佳答案

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

通常,您甚至不能在hardfp 系统上使用softfp 进程,除非您将所有 库复制到不同的 lib 目录(即“multiarch”)。

如果您的代码碰巧没有在函数参数中使用 floatdouble 类型,那么您可能会发现它实际上确实有效,但您仍然 不应该这样做,否则你就是在玩火。

无论如何,如果您的代码完全基于整数,那么这些选项将不会对生成的代码产生任何影响,因此性能变化一定来自其他地方。当您意外指定 -mfloat-abi 选项时,您使用的编译器可能会自动选择不同的 multilib 或不同的 CPU(尤其是 GCC 有切换回默认 multilib 的习惯)。也许您错误地打开了 NEON,或者从 A8 调谐切换到 A9?

关于c - 将硬 float 链接到 softfp 不良性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25060115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com