...论坛和博客文章,每个人似乎都同意使用 NEON 比使用 VFP 更好,或者至少混合 NEON(例如,使用内联函数在 SIMD 中实现一些算法),而 VFP 并不是一个好主意
我不确定这是否正确。根据 ARM 在介绍 NEON 开发文章 |霓虹灯寄存器 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s03s02.html:
NEON 寄存器组由 32 个 64 位寄存器组成。如果两者都
实现了高级SIMD和VFPv3,它们共享该寄存器
银行。在这种情况下,VFPv3 以 VFPv3-D32 形式实现:
支持32个双精度浮点寄存器。这
集成简化了上下文切换支持的实现,因为
保存和恢复 VFP 上下文的相同例程也保存和恢复
恢复 NEON 上下文。
NEON 单元可以将相同的寄存器组视为:
- 16 个 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
立方卡车 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
香蕉派 Pro:
$ 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
所以 Banana Pi 使用:
-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
树莓派3:
RPI3 的独特之处在于它采用 ARMv8,但运行 32 位操作系统。这意味着它实际上是 32 位 ARMorAarch32。 32 位 ARM 与 Aarch32 的区别还有更多,但这将向您显示 Aarch32 标志
此外,RPI3 使用 Broadcom A53 SoC,具有 NEON 和可选的 CRC32 指令,但缺少可选的加密扩展。
$ 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
奥德罗德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 和 Linux 堆栈交换 https://unix.stackexchange.com/a/255615/56041,它破译输出/proc/cpuinfo
:
CPU 部件:部件号。 0xd03 表示 Cortex-A53 处理器。
因此我们可以从数据库中查找该值。我不知道它是否存在或位于何处。