...论坛和博客文章,每个人似乎都同意使用 NEON 比使用 VFP 或至少混合 NEON 更好(例如,使用 instrinsics 在 SIMD 中实现一些算法)并且 VFP 不是一个好主意
我不确定这是否正确。根据 ARM 在介绍 NEON 开发文章 | NEON 寄存器:
NEON 寄存器组由 32 个 64 位寄存器组成。如果同时实现了 Advanced SIMD 和 VFPv3,它们共享这个寄存器组。在这种情况下,VFPv3 以支持 32 个双精度浮点寄存器的 VFPv3-D32 形式实现。这种集成简化了上下文切换支持的实现,因为保存和恢复 VFP 上下文的相同例程也保存和恢复 NEON 上下文。
NEON 单元可以查看相同的寄存器组:
- 十六个 128 位四字寄存器,Q0-Q15
- 三十二个 64 位双字寄存器,D0-D31。
NEON D0-D31 寄存器与 VFPv3 D0-D31 寄存器相同,每个 Q0-Q15 寄存器映射到一对 D 寄存器。图 1.3 显示了共享 NEON 和 VFP 寄存器组的不同视图。所有这些视图都可以随时访问。软件不必在它们之间显式切换,因为使用的指令决定了适当的视图。
寄存器不竞争;相反,它们作为注册库的视图共存。没有办法吐出 NEON 和 FPU 装备。
与此相关,我正在使用以下编译标志:
-O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
-O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp
这就是我所做的;你的旅费可能会改变。它源自从平台和编译器收集的信息的混搭。
gnueabihf
告诉我平台使用硬浮点数,可以加快程序调用。如果有疑问,请使用它,softfp
因为它与硬浮点兼容。
BeagleBone 黑色:
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
model name : ARMv7 Processor rev 2 (v7l)
Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32
...
所以 BeagleBone 使用:
-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard
CubieTruck v5:
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
Processor : ARMv7 Processor rev 5 (v7l)
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4
所以 CubieTruck 使用:
-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
香蕉派专业版:
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
Processor : ARMv7 Processor rev 4 (v7l)
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
所以香蕉派使用:
-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
树莓派 3:
RPI3 的独特之处在于它的 ARMv8,但它运行的是 32 位操作系统。这意味着它实际上是 32 位 ARM或Aarch32。32 位 ARM 与 Aarch32 相比,还有更多,但这将向您展示 Aarch32 标志
此外,RPI3 使用 Broadcom A53 SoC,它具有 NEON 和可选的 CRC32 指令,但缺少可选的 Crypto 扩展。
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
model name : ARMv7 Processor rev 4 (v7l)
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
...
所以树莓派可以使用:
-march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
或者它可以使用(我不知道该用于什么-mtune
):
-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard
ODROID C2:
ODROID C2 使用 Amlogic A53 SoC,但它使用 64 位操作系统。ODROID C2,它具有 NEON 和可选的 CRC32 指令,但缺少可选的加密扩展(类似于 RPI3 的配置)。
$ gcc -v 2>&1 | grep Target
Target: aarch64-linux-gnu
$ cat /proc/cpuinfo
Features : fp asimd evtstrm crc32
所以 ODROID 使用:
-march=armv8-a+crc -mtune=cortex-a53
在上面的食谱中,我通过查看数据表了解了 ARM 处理器(如 Cortex A9 或 A53)。根据Unix and Linux Stack Exchange上的这个答案,它解读了以下输出/proc/cpuinfo
:
CPU 部件:部件号。0xd03 表示 Cortex-A53 处理器。
所以我们也许可以从数据库中查找值。我不知道它是否存在或它的位置。