【发布时间】:2017-12-12 08:54:09
【问题描述】:
我的 Zynq-7000 ARM Cortex-A9 处理器同时具有 NEON 和 VFPv3 扩展,并且 Zynq-7000-TRM 表示处理器配置为具有“用于 VFPv3 和高级 SIMD 指令的独立管道” em>。
到目前为止,我使用 Linaro GCC 6.3-2017.05 和 -mfpu=neon 选项编译了我的程序,以利用 SIMD 指令。但是在编译器也有非SIMD操作要发出的情况下,使用-mfpu=neon-vfpv3会有区别吗? GCC 的指令选择和调度器是否会为这两个版本发出指令,以便它可以利用这两个流水线来提高 CPU 的利用率?
【问题讨论】:
-
您还需要
-ffast-math进行自动矢量化,因为 ARMv7 NEON 不支持非规范化,因此不完全符合 IEEE。 (或类似的东西;您需要-ffast-math进行自动矢量化,但您可以在没有-ffast-math的情况下使用 NEON 内在函数)。 -
@PeterCordes 是的,它甚至用
-funsafe-math-optimizations进行了矢量化。但我想知道对于非矢量化代码,或者同时包含矢量化和非矢量化变体的代码,是否可以通过利用这两个管道来提高性能。 -
我只知道 x86 CPU 的那种微架构细节,不知道 ARM。这么好的问题,这就是我投票的原因。希望有人会回答。它有点类似于 x86
-march=sse+387,它可以生成一些笨重的代码,但它们使用不同的架构寄存器。 VFP and NEON use the same registers,所以对好的代码生成有更多的希望。 -
@PeterCordes 这“需要 -ffast-math 进行自动矢量化,因为 ARMv7 NEON 不支持非规范化,因此不完全符合 IEEE”今天也成立吗?
armv864 位也适用吗? -
@Danijel:IIRC,AArch64 SIMD 支持 denomrals aka subnormals。我忘记了 ARMv7 是否有控制位,但 32 位模式下的 ARMv8 可能具有符合 IEEE 标准的 SIMD。
标签: gcc assembly arm neon armv7