我的Zynq-7000 ARM Cortex-A9处理器同时具有NEON和VFPv3扩展,而Zynq-7000-TRM则将处理器配置为具有“用于VFPv3和高级SIMD指令的独立管道”。
到目前为止,我已经使用Linaro GCC 6.3-2017.05和-mfpu=neon
选项编译了程序,以利用SIMD指令。但是,如果编译器还具有要发出的非SIMD操作,使用-mfpu=neon-vfpv3
会有所不同吗? GCC的指令选择和调度程序是否会同时针对这两个版本发出指令,以便可以同时使用这两个流水线来提高CPU的利用率?
最佳答案
从技术上讲,是的。
现实,不。
NEON在ARMv7上是可选的。
被许可方可以从以下选择一种配置:
与NEON不同,ARMv7上有不同的VFP版本,Cortex-A8上的VFP-lite是最臭名昭著的非流水线版本,因此速度非常慢。
因此,从技术上讲,通过编译器选项指定CPU配置和体系结构版本是有意义的,以便编译器可以针对该特定体系结构/配置生成最优化的机器代码。
但是实际上,如今的编译器忽略了大多数这些构建选项,甚至忽略了指令。
而且,将VFP和NEON指令分配给不同的流水线并没有多大帮助,因为它们都共享寄存器组。
通过利用尽可能多的寄存器来提高NEON的性能,将带来远远超过让VFP并行运行的好处。
令我感到困惑的是,这些天为什么以及有如此多的人对免费编译器如此信任。
可用的最佳ARM编译器是值(value)6k美元以上的DS-5 Ultimate Edition附带的ARM编译器。他们的支持非常出色,但我不确定这是否证明价格合理。