首页 > 解决方案 > ARMv8 是否内置了 NEON 和 VFPV3?

问题描述

我一直在研究如何在 ARMv8 系统上优化使用 OpenCV。

通过谷歌搜索几个教程,我发现从源代码构建 OpenCV 时,很多时候 VFPV3 或 NEON 选项都没有激活。

然后我被告知“通常 GCC 将处理与处理器匹配的扩展。ARMv7 有不同的处理器版本,有些支持 VFPV3 和 NEON,因此有标志。所有 ARMv8,如 Xavier AGX,都有内置的,所以 GCC 足够聪明遇到时使用它们/编译它们。”

这是否意味着在为 ARMv8 系统构建 OpenCV 时不需要指定 VFPV3 或 NEON?这些默认情况下是否处于活动状态?

标签: opencvneonarmv8

解决方案


根据ARM 文档- AArch64 Floating-point and NEON

Both floating-point and NEON are required in all standard ARMv8 implementations. However, implementations targeting specialized markets may support the following combinations:

    No NEON or floating-point.
    Full floating-point and SIMD support with exception trapping.
    Full floating-point and SIMD support without exception trapping. 

也就是说,如果您使用的 Armv8-a 实现是“标准的”,而且很可能是,它应该支持全浮点和 SIMD,如果您指定-march=armv8-a+simd.

似乎结果与 gcc 10.2.0 相同:

操作码:

double op( double value)
{
  double v3 = v1 + v2 + value;
  return v3;
}

/opt/arm/10/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc  -march=armv8 -S op.c
cat op.s
       .arch armv8-a
        .file   "op.c"
        .text
        .section        .rodata
        .align  3
        .type   v1, %object
        .size   v1, 8
v1:
        .word   0
        .word   1072693248
        .align  3
        .type   v2, %object
        .size   v2, 8
v2:
        .word   0
        .word   1073741824
        .text
        .align  2
        .global op
        .type   op, %function
op:
.LFB0:
        .cfi_startproc
        sub     sp, sp, #32
        .cfi_def_cfa_offset 32
        str     d0, [sp, 8]
        fmov    d1, 1.0e+0
        fmov    d0, 2.0e+0
        fadd    d0, d1, d0
        ldr     d1, [sp, 8]
        fadd    d0, d1, d0
        str     d0, [sp, 24]
        ldr     d0, [sp, 24]
        add     sp, sp, 32
        .cfi_def_cfa_offset 0
        ret
        .cfi_endproc
.LFE0:
        .size   op, .-op
        .ident  "GCC: (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16)) 10.2.1 20201103"
.section        .note.GNU-stack,"",@progbits

/opt/arm/10/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc  -march=armv8-a+simd -S op.c
cat op.s
        .arch armv8-a
        .file   "a.c"
        .text
        .section        .rodata
        .align  3
        .type   v1, %object
        .size   v1, 8
v1:
        .word   0
        .word   1072693248
        .align  3
        .type   v2, %object
        .size   v2, 8
v2:
        .word   0
        .word   1073741824
        .text
        .align  2
        .global op
        .type   op, %function
op:
.LFB0:
        .cfi_startproc
        sub     sp, sp, #32
        .cfi_def_cfa_offset 32
        str     d0, [sp, 8]
        fmov    d1, 1.0e+0
        fmov    d0, 2.0e+0
        fadd    d0, d1, d0
        ldr     d1, [sp, 8]
        fadd    d0, d1, d0
        str     d0, [sp, 24]
        ldr     d0, [sp, 24]
        add     sp, sp, 32
        .cfi_def_cfa_offset 0
        ret
        .cfi_endproc
.LFE0:
        .size   op, .-op
        .ident  "GCC: (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16)) 10.2.1 20201103"
        .section        .note.GNU-stack,"",@progbits

推荐阅读