【问题标题】:Detect ARM NEON availability in the preprocessor?检测预处理器中的 ARM NEON 可用性?
【发布时间】:2016-08-31 05:42:01
【问题描述】:

根据ARM ARM__ARM_NEON__ 是在 Neon SIMD 指令可用时定义的。我无法让 GCC 提供它。

运行 Debian 8.2 的 BananaPi Pro 开发板上提供了 Neon:

$ cat /proc/cpuinfo | grep neon
Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt 

我使用的是 GCC 4.9:

$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2

试试 GCC 和 -march=native:

$ g++ -march=native -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4

好的,试试 Google 在为 Neon 构建时为 Android 使用的东西:

$ g++ -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4

也许是带有硬浮点的 ARMv7-a:

$ g++ -march=armv7-a -mfloat-abi=hard -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4

我的问题是:

  • 为什么我没有看到__ARM_NEON__
  • 如何在预处理器中检测 Neon 的可用性?

也许:

  • 我应该使用哪些 GCC 开关来启用 Neon SIMD 指令?

LeMaker HiKey 上相关,它是 AARCH64/ARM64,使用 GCC 4.9.2 运行 Linaro,这是预处理器的输出:

$ cpp -dM </dev/null | grep -i neon
#define __ARM_NEON 1

根据 ARM,该板确实具有高级 SIMD 指令,即使:

$ cat /proc/cpuinfo 
Processor   : AArch64 Processor rev 3 (aarch64)
...
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32

【问题讨论】:

  • -mfpu=neon,或者-mfpu=neon-vfpv4
  • 感谢@EOF。我需要仔细检查 Android 构建标志,看看为什么它没有被用于 AOSP 工具链(或者它可能是并且我的笔记不完整/损坏)。

标签: gcc macros arm c-preprocessor neon


【解决方案1】:

这里隐藏了很多问题,我会尝试依次提取...

根据 ARM ARM,__ARM_NEON__ 是在 Neon SIMD 指令可用时定义的。我无法让 GCC 提供它。

这是[旧版本] ARM 编译器的编译器文档,而不是 ARM 架构参考手册。用于检查高级 SIMD 指令是否存在的更好的宏是 __ARM_NEON,它在 ARM C Language Extensions 中定义。

试试 GCC 和 -march=native:

正如你may have found。用于 ARM 目标的 GCC 分离出 -march(对于 GCC 应该为其生成代码的架构版本)、-mfpu(对于可用的浮点/高级 SIMD 单元)和 -mfloat-abi(对于应该如何传递浮点参数,以及是否存在浮点单元)。最后是-mtune(要求 GCC 尝试针对特定处理器进行优化)和-mcpu(作为-mtune-march 的组合)。

通过请求-march=native,您是在请求 GCC 生成适用于检测到的您正在运行的处理器架构的代码。这对-mfpu 设置没有影响,因此不一定会启用高级 SIMD 指令生成。

请注意,以上内容仅适用于针对 AArch32 的编译器。 AArch64 GCC 不支持-mfpu,将通过-march=native 检测是否存在高级 SIMD 支持。

好的,试试 Google 在为 Neon 构建时为 Android 使用的东西:

$ g++ -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -dM -E

这些构建标志不足以支持高级 SIMD 指令,您的注释可能不完整。在 GCC 4.9.2 的 -mfpu flags supported 中,我希望:

neonneon-fp16neon-vfpv4neon-fp-armv8crypto-neon-fp-armv8

给你你想要的。

根据 ARM,该板确实具有高级 SIMD 指令,即使:

看起来您在 AArch64 内核上运行,该内核通过 asimd 功能公开了对高级 SIMD 的支持 - 如您的示例输出所示。

【讨论】:

  • 谢谢詹姆斯。这应该有助于弥补我的一些知识空白。
  • 较新的 gcc 不再定义 __ARM_NEON。较旧的 gcc(如 5.4)同时定义了 __ARM_NEON__ARM_NEON__。 gcc5.4 和 gcc6.3 定义了__ARM_FEATURE_SIMD32 1godbolt.org/g/LmPjDq这是应该检查的吗?
  • 你链接的godbolt编译器看起来像是以不同的方式配置的(用-v确认)。您可以通过在命令行中添加 -mfloat-abi=hard 来启用 Neon 支持。您可能希望将此配置差异报告为服务所有者的错误。 __ARM_FEATURE_SIMD32 指的是指令集的不同部分——那些对 32 位寄存器中压缩的 8 位值进行操作的部分,因此不能替代 __ARM_NEON
猜你喜欢
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多