opencv - ARMv8 是否内置了 NEON 和 VFPV3?
问题描述
我一直在研究如何在 ARMv8 系统上优化使用 OpenCV。
通过谷歌搜索几个教程,我发现从源代码构建 OpenCV 时,很多时候 VFPV3 或 NEON 选项都没有激活。
然后我被告知“通常 GCC 将处理与处理器匹配的扩展。ARMv7 有不同的处理器版本,有些支持 VFPV3 和 NEON,因此有标志。所有 ARMv8,如 Xavier AGX,都有内置的,所以 GCC 足够聪明遇到时使用它们/编译它们。”
这是否意味着在为 ARMv8 系统构建 OpenCV 时不需要指定 VFPV3 或 NEON?这些默认情况下是否处于活动状态?
解决方案
根据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
推荐阅读
- python - 将初始 json 数据加载到 flask-sqlalchemy 项目时出现问题:sqlite3.InterfaceError: Error binding parameter 0 - 可能是不受支持的类型
- gradle - 让gradle在每次设置时执行一个finalizedBy任务(多次)
- php - 使用 eloquent 从多对多关系中获取数据
- javascript - 使用 marker.remove() 清除并再次添加标记
- html - 带有 2 个图像和一个分隔符的 Div
- javascript - 自动播放随机 youtube 视频并非每次都有效
- visual-studio-code - 我可以像 Atom 一样通过 USB 通过 REPL 连接来通过 VSCode 连接 ESP32 吗?
- openstreetmap - 获取城市中所有街道的正确立交桥涡轮查询是什么?
- bash - 转义斜杠和制表符
- c# - Unity 3D:如何存储和替换网格中的预制件?