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



根据ARM ARM,当Neon SIMD指令可用时,定义__ARM_NEON__。我很难让GCC提供它。

Neon可在运行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:构建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__
  • 如何在预处理器中检测霓虹灯的可用性

也许:

  • 我应该使用哪些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

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

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

这是针对[旧版本]ARM编译器的编译器文档,而不是ARM架构设置参考手册。检查高级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,将通过-march=native检测高级SIMD支持的存在。

好吧,试试谷歌在为Neon:构建Android时使用的功能

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

这些内部版本标志不足以支持高级SIMD指令,您的注释可能不完整。在GCC 4.9.2支持的-mfpu标志中,我希望有以下任何一个:

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

给你想要的。

根据ARM的说法,该板确实有高级SIMD指令,尽管:

看起来您运行的是一个AArch64内核,它通过asimd特性公开了对Advanced SIMD的支持,如您的示例输出所示。

最新更新