根据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
标志中,我希望有以下任何一个:
neon
、neon-fp16
、neon-vfpv4
、neon-fp-armv8
、crypto-neon-fp-armv8
给你想要的。
根据ARM的说法,该板确实有高级SIMD指令,尽管:
看起来您运行的是一个AArch64内核,它通过asimd
特性公开了对Advanced SIMD的支持,如您的示例输出所示。