根据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__
?也许:
相关的,在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
答案 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中,我期待以下任何一项:
neon
,neon-fp16
,neon-vfpv4
,neon-fp-armv8
,crypto-neon-fp-armv8
给你你想要的东西。
根据ARM的说法,该主板确实具有高级SIMD指令,即使:
看起来您正在AArch64内核上运行,该内核通过asimd
功能公开了对高级SIMD的支持 - 如示例输出中所示。