我的目标平台是启用了VFP / neon的ARM cortex-A7,我在目标平台上运行的系统软件并不总是打开VPF /霓虹灯,而是仅按需打开VPF / neon(通过调用某些系统API) 。
我的工具链是pc-cygwin主机(arm-none-eabi)上的裸机GCC-4.7.4交叉编译器。
我们有一个C源文件a.c
,当系统软件关闭VPF / neon时,代码可能会运行。此a.c
代码为纯整数,具有密集的long long
(64位整数)运算。如果应用GCC选项-mfloat-abi=hard
或-mfloat-abi=softfp
来编译a.c
,则会生成一些使用VFP / neon寄存器的指令(例如,vldr d7,[..]
,vstr d7,[sp,..]
等)。如果在VFP / neon关闭时运行此生成的代码,则目标平台上会发生未定义的故障。如果应用GCC选项-mfloat-abi=soft
来编译a.c
,则不会使用VFP / neon寄存器来解决未定义的故障问题。
另一方面,还有另一个C源文件b.c
,它包含浮点/向量(VFP / neon)操作,并且仅在系统软件打开VFP / neon时运行。出于性能原因,我想使用GCC选项b.c
而不是-mfloat-abi=hard
编译-mfloat-abi=softfp
。
如果使用b.c
编译-mfloat-abi=hard
并使用a.c
选项编译-mfloat-abi=soft
,则无法将它们链接在一起,链接器会抱怨:“...使用VFP注册参数,XXX不“。
是否有任何方法(使用工具链GCC选项,安装配置,版本)来编译与硬浮点ABI兼容的所述纯整数a.c
(通过VFP / neon寄存器传递浮点参数)但不生成任何VFP / neon指令或纯整数运算寄存器?
a.c
选项-mfloat-abi=soft
和b.c
选项-mfloat-abi=softfp
可以关联,但效果较差。-mneon-for-64bits
选项重新打开它。这似乎与我的问题有关,但我使用的是GCC 4.7.4。答案 0 :(得分:0)
你应该坚持使用softfp
选项。
事实上,当没有传递hard
类型的参数时,softfp
和float
之间没有区别。
即使是这种情况,softfp
在可能的循环之外的开头会产生非常小的开销。 (将ARM寄存器的内容移动到VFP寄存器,当有超过四个参数时最终从堆栈中加载一些负载)
由于vfp不支持int64
,因此以v
开头的说明必须是NEON。您应该尝试使用-fno-tree-vectorize
来禁用使用-o3
选项自动启用的愚蠢的自动版本。
PS:如果您对性能有所了解,为什么不编写优化的NEON代码?正确的手写NEON代码会使令人惊讶的下颌差异不同于那些完全无用的恼人的自动矢量化代码。