答案将取决于gcc的版本,这可能会在未来发生变化。在中的当前代码将NEON/VFP描述为一个组合单元。该行代码是:
(define_cpu_unit "ca9_issue_vfp_neon, cortex_a9_ls" "cortex_a9")
带有注释的代码:
;; The Cortex-A9 core is modelled as a dual issue pipeline that has
;; the following components.
;; 1. 1 Load Store Pipeline.
;; 2. P0 / main pipeline for data processing instructions.
;; 3. P1 / Dual pipeline for Data processing instructions.
;; 4. MAC pipeline for multiply as well as multiply
;; and accumulate instructions.
;; 5. 1 VFP and an optional Neon unit.
;; The Load/Store, VFP and Neon issue pipeline are multiplexed.
;; The P0 / main pipeline and M1 stage of the MAC pipeline are
;; multiplexed.
;; The P1 / dual pipeline and M2 stage of the MAC pipeline are
;; multiplexed.
;; There are only 4 integer register read ports and hence at any point of
;; time we can't have issue down the E1 and the E2 ports unless
;; of course there are bypass paths that get exercised.
;; Both P0 and P1 have 2 stages E1 and E2.
;; Data processing instructions issue to E1 or E2 depending on
;; whether they have an early shift or not.
而ca9_issue_vfp_neon
单元用于描述NEON和VFP指令。因此,调度程序在计算成本时不会知道这些指令可以进行流水线处理。但是,它可能会同时生成这两种指令,如果幸运的话,它们就会被流水线处理。
在“arm.c”中,有许多实例使用NEON来传输数据。如果您的代码具有许多结构的浮点数,编译器可能会混合使用NEON和VFP代码,其中NEON用于移动数据。
像exynos这样的机器具有一些自定义调整,例如使用NEON进行字符串操作,而您的Zync CPU将无法获得该调整描述在arm.c中。
另外,如果您没有指定-mfpu = neon-vfpv3
,则任何带有“vfpv3”指令的内联汇编都将无效。
根据GCC版本的不同,情况会有所改变。但是,您可以在“cortex-a9.md”中查找CPU描述,以查看编译器是否可能以不同的方式安排指令。此外,“arm.c”文件执行指令成本计算;如果NEON成本未在其中实现,则编译器将永远不会生成指令。
即使这样做是可行的,在处理更简单的ARMv5 DSP指令时也会遇到困难,您会发现只有1-2%的指令会发生变化。在多兆字节的图像中,这样的选项只会改变几百个操作码,原因是其他人已经给出了共享寄存器、“C”浮点语义等(的限制)。
但是,如果-mfpu = neon-vfpv3
确实描述了您的CPU,为什么不将其用于嵌入式应用程序呢?通用选项旨在生成可以在多种设备上运行的代码。
-ffast-math
来进行自动向量化,因为ARMv7 NEON 不支持denormal(非规格化数),因此不完全符合IEEE标准。(或类似的原因;你需要使用-ffast-math
来进行自动向量化,但是你可以在不使用-ffast-math
的情况下使用NEON指令)。 - Peter Cordes-funsafe-math-optimizations
也可以进行向量化。但我想知道对于非向量化代码或同时包含向量化和非向量化变体的代码,是否可以通过利用两个流水线来提高性能。 - Johannes Schaub - litbarmv8
64位也是如此吗? - Danijel-ffast-math
对于armv8
不是必需的。 - Danijel