在预处理器中检测 ARM NEON 可用性?
Detect ARM NEON availability in the preprocessor?
根据ARM ARM,当Neon SIMD 指令可用时定义__ARM_NEON__
。我无法让 GCC 提供它。
Neon 在此 BananaPi Pro 开发板上可用 运行 Debian 8.2:
$ 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
好的,试试 Google 在构建 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__
?
- 如何检测预处理器中的 Neon 可用性?
也许:
- 我应该使用哪些 GCC 开关来启用 Neon SIMD 指令?
相关,在 LeMaker HiKey 上,即 AARCH64/ARM64 运行 Linaro with GCC 4.9.2,这是预处理器的输出:
$ 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
这里隐藏了很多问题,我会试着依次提取...
According to the ARM ARM, __ARM_NEON__
is defined when Neon SIMD instructions are available. I'm having trouble getting GCC to provide it.
那是[旧版本]ARM 编译器的编译器文档,而不是 ARM 体系结构参考手册。用于检查高级 SIMD 指令是否存在的更好宏是 __ARM_NEON
,它在 ARM C Language Extensions.
中定义
Try GCC and -march=native
:
和你一样may have found。 ARM 目标的 GCC 分离出 -march
(对于 GCC 应为其生成代码的体系结构修订版)、-mfpu
(对于可用的浮动 point/Advanced SIMD 单元)和 -mfloat-abi
(关于应该如何传递浮点参数,以及是否存在浮点单元)。最后是 -mtune
(要求 GCC 尝试针对特定处理器进行优化)和 -mcpu
(作为 -mtune
和 -march
的组合)。
通过请求 -march=native
,您是在请求 GCC 生成适用于检测到的您所在的处理器架构的代码 运行。这对 -mfpu
设置没有影响,因此不一定启用高级 SIMD 指令生成。
请注意,以上仅适用于针对 AArch32 的编译器。 AArch64 GCC 不支持 -mfpu
并将通过 -march=native
.
检测是否存在高级 SIMD 支持
OK, try what Google uses for Android when building for Neon:
$ 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
给你想要的。
According to ARM, this board does have Advanced SIMD instructions even though:
看起来您 运行 在 AArch64 内核上,它通过 asimd
功能公开了对高级 SIMD 的支持 - 如您的示例输出所示。
根据ARM ARM,当Neon SIMD 指令可用时定义__ARM_NEON__
。我无法让 GCC 提供它。
Neon 在此 BananaPi Pro 开发板上可用 运行 Debian 8.2:
$ 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
好的,试试 Google 在构建 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__
? - 如何检测预处理器中的 Neon 可用性?
也许:
- 我应该使用哪些 GCC 开关来启用 Neon SIMD 指令?
相关,在 LeMaker HiKey 上,即 AARCH64/ARM64 运行 Linaro with GCC 4.9.2,这是预处理器的输出:
$ 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
这里隐藏了很多问题,我会试着依次提取...
According to the ARM ARM,
__ARM_NEON__
is defined when Neon SIMD instructions are available. I'm having trouble getting GCC to provide it.
那是[旧版本]ARM 编译器的编译器文档,而不是 ARM 体系结构参考手册。用于检查高级 SIMD 指令是否存在的更好宏是 __ARM_NEON
,它在 ARM C Language Extensions.
Try GCC and
-march=native
:
和你一样may have found。 ARM 目标的 GCC 分离出 -march
(对于 GCC 应为其生成代码的体系结构修订版)、-mfpu
(对于可用的浮动 point/Advanced SIMD 单元)和 -mfloat-abi
(关于应该如何传递浮点参数,以及是否存在浮点单元)。最后是 -mtune
(要求 GCC 尝试针对特定处理器进行优化)和 -mcpu
(作为 -mtune
和 -march
的组合)。
通过请求 -march=native
,您是在请求 GCC 生成适用于检测到的您所在的处理器架构的代码 运行。这对 -mfpu
设置没有影响,因此不一定启用高级 SIMD 指令生成。
请注意,以上仅适用于针对 AArch32 的编译器。 AArch64 GCC 不支持 -mfpu
并将通过 -march=native
.
OK, try what Google uses for Android when building for Neon:
$ 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
给你想要的。
According to ARM, this board does have Advanced SIMD instructions even though:
看起来您 运行 在 AArch64 内核上,它通过 asimd
功能公开了对高级 SIMD 的支持 - 如您的示例输出所示。