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

时间:2016-05-05 12:23:00

标签: gcc macros arm c-preprocessor neon

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

在运行Debian 8.2的BananaPi Pro开发板上提供了霓虹灯:

$ 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

好的,在为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

可能是一个带有硬浮动的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上,运行带有GCC 4.9.2的Linaro的AARCH64 / ARM64,这里是预处理器的输出:

$ 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

1 个答案:

答案 0 :(得分:10)

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

  

根据ARM ARM,当有可用的霓虹SIMD指令时,__ARM_NEON__被定义。我无法让GCC提供它。

这是ARM编译器[旧版本]的编译器文档,而不是ARM Architceture参考手册。检查高级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支持。

  

好的,在为Neon构建时尝试Google用于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的支持 - 如示例输出中所示。