检测预处理器中的ARM NEON可用性?

jww*_*jww 5 macros gcc arm neon c-preprocessor

根据ARM ARM,__ARM_NEON__定义了可用的Neon SIMD指令.我无法让GCC提供它.

在运行Debian 8.2的BananaPi Pro开发板上可以使用霓虹灯:

$ cat /proc/cpuinfo | grep neon
Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt 
Run Code Online (Sandbox Code Playgroud)

我正在使用GCC 4.9:

$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Run Code Online (Sandbox Code Playgroud)

试试GCC并-march=native:

$ g++ -march=native -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4
Run Code Online (Sandbox Code Playgroud)

好的,在为Neon构建时尝试Google用于Android的内容:

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

也许ARMv7-a有一个硬浮点数:

$ g++ -march=armv7-a -mfloat-abi=hard -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

有可能:

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

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

$ cpp -dM </dev/null | grep -i neon
#define __ARM_NEON 1
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*lgh 12

这里隐藏着许多问题,我会尝试依次提取它们......

根据ARM ARM,__ARM_NEON__定义了可用的Neon SIMD指令.我无法让GCC提供它.

这是ARM编译器[旧版本]的编译器文档,而不是ARM Architceture参考手册.将检查是否存在高级SIMD指令的更好的宏__ARM_NEON,这是在ARM C语言扩展中定义的.

试试GCC并-march=native:

可能已经找到了.ARM目标的GCC分离-march(对于GCC应该生成代码的体系结构修订版),-mfpu(对于可用的浮点/高级SIMD单元)和-mfloat-abi(如何传递浮点参数,以及是否存在浮点单位).最后是-mtune(这要求GCC来尝试优化为特定的处理器)和-mcpu(充当的组合-mtune-march).

通过要求-march=native您要求GCC生成适合您所运行的处理器的检测到的体系结构的代码.这对-mfpu设置没有影响,因此不一定能够生成高级SIMD指令.

请注意,上述内容仅适用于以AArch32为目标的编译器.AArch64 GCC不支持-mfpu并将检测是否存在高级SIMD支持-march=native.

好的,在为Neon构建时尝试Google用于Android的内容:

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

这些构建标志不足以支持高级SIMD指令,您的注释可能不完整.在GCC 4.9.2 -mfpu 支持旗帜中,我期待以下任何一种:

neon,neon-fp16,neon-vfpv4,neon-fp-armv8,crypto-neon-fp-armv8

给你你想要的.

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

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

  • 您链接的 Godbolt 编译器看起来像是以不同的方式配置的(用 -v 确认)。您可以通过在命令行中添加 `-mfloat-abi=hard` 来启用 Neon 支持。您可能希望将此配置差异报告为服务所有者的错误。`__ARM_FEATURE_SIMD32` 指的是指令集的不同部分 - 那些对 32 位寄存器中的打包 8 位值进行操作的部分,因此不能替代 `__ARM_NEON`。 (2认同)