自 2024 年 5 月 Arm KleidiCV 发布以来,该项目取得了显著进展。Arm 于 2024 年 9 月发布了 0.2.0 版本,并于同年 12 月发布了 0.3.0 版本。这些更新都带来了许多新功能,并实现了性能提升。
随着移动设备上摄像头数量的不断增加,摄像头管线和图像处理已然成为当今最热门的计算任务之一。OpenCV 是众多此类管线的核心,并运行在数亿台设备上。而现在,在安卓系统上,OpenCV 4.11 已默认启用 KleidiCV。
KleidiCV 0.2.0 和 0.3.0 的新增功能
多线程支持
KleidiCV 0.2.0 最显著的新增功能之一是引入了多线程支持。KleidiCV 0.1.0 发布时仅支持单线程函数,应用开发者需要在更高级别上自行设置多线程。而 KleidiCV 0.2.0 已集成到 OpenCV 现有的多线程框架中,因此每个操作都能实现多线程处理,无需应用开发者额外投入精力。图像处理是一个“易于并行处理”的问题,因此 KleidiCV 中许多函数的处理速度几乎与 CPU 数量呈线性关系。例如,在一台拥有 16 个可用 CPU 的 Linux 服务器上运行时,启用多线程后,许多 KleidiCV 函数的运行速度预计可提升近 16 倍。
增强与 OpenCV 4.11 的集成
KleidiCV 新增的多线程支持,再加上其原本就出色的性能提升,使得在 OpenCV 中启用 KleidiCV 成为自然而然的选择。Arm 与 OpenCV 的优秀团队合作,在安卓系统上的 OpenCV 4.11 中默认启用了 KleidiCV。对于从源代码构建 OpenCV 4.10 的用户来说,他们之前就已经能通过设置单个配置标记,轻松启用 KleidiCV 了,该选项在 OpenCV 4.11 中依然保留,在 Linux 系统上运行 OpenCV 时仍需要设置该标记来启用 KleidiCV。不过,对于安卓系统,该标记现在已默认开启。这意味着,所有使用 OpenCV 的安卓应用一旦升级到 OpenCV 4.11,即可享受 KleidiCV 0.3.0 带来的性能优势。将 OpenCV 与 KleidiCV 集成到安卓应用中最简便的方法是通过 OpenCV Maven 包。
OpenCV Maven 包:https://central.sonatype.com/...
扩展的功能集
更多的 OpenCV 函数得到了加速,包括 cv::exp()、cv::pyrDown()、cv::buildOpticalFlowPyramid() 等。此外,已支持函数的功能也得到了进一步扩展,例如 cv::resize 中的 float32 图像,以及 cv::GaussianBlur 中更多的内核大小。完整列表请查看更新日志。
更新日志:https://gitlab.arm.com/kleidi...
性能提升
得益于新增的多线程支持,我们看到了比之前报告中更为显著的速度提升。Sobel 的基准测试显示,速度提升超过了 400%,这意味着性能提高了五倍多!
上述测试比较了在三星 Galaxy S22 SM-S901B 的两个 Cortex-A710 核心上,OpenCV 4.11 在禁用和启用 KleidiCV 时的运行情况。除非另有说明,否则基准测试均针对 1080p 图像进行。若想要详细了解如何运行基准测试,可以在 KleidiCV 代码仓库中查看 Arm 使用的脚本。
脚本:https://gitlab.arm.com/kleidi...
在 OpenCV 项目中充分利用 KleidiCV
KleidiCV 可以加速一部分 OpenCV 功能。在某些情况下,这与你的应用需求相匹配,而在其他情况下则不然。为了充分利用 KleidiCV,你可以对应用进行一些小的改动,以匹配 KleidiCV 所提供的功能。具体要求可在 KleidiCV 的 OpenCV 文档中找到,以下是一些示例:
KleidiCV 的 OpenCV 文档:https://gitlab.arm.com/kleidi...
使用分离的源图像和目标图像
高斯模糊等操作会针对目标图像中的每个像素读取源图像中的多个像素。如果源图像和目标图像相同,则必须进行额外的操作来避免读取已改变的像素。因此,为了让 KleidiCV 采用最有效的处理方式,它仅支持使用分离的源图像和目标图像。如果源图像和目标图像相同,则会使用 OpenCV 的常规高斯模糊,这样就无法获得性能提升。
使用最佳高斯模糊参数
OpenCV 支持将 sigmaX 和 sigmaY 指定为 0。在这种情况下,KleidiCV 将使用根据内核大小计算出的 sigma 值,这能使其运行速度比使用非零 sigma 值时快很多。如果 sigmaX 或 sigmaY 必须非零值,但又不需要精确到比特的模糊效果,则可以将提示参数(OpenCV 4.11 中的新功能)设置为 ALGO_HINT_APPROX,这样仍能让 KleidiCV 实现大幅加速。内核大小必须与 KleidiCV 能够加速的内核大小之一相匹配,在 KleidiCV 0.3.0 中,这些内核大小为 3x3、5x5、7x7 和 15x15。
使用支持的边界类型
一些 OpenCV 函数将边界模式作为参数,例如 reflect 或 wrap。每个 KleidiCV 函数都支持其中的一部分边界模式,这些模式可能与 OpenCV 的默认边界模式相同,也可能不同。例如,KleidiCV 的 Sobel 函数速度极快,但要在 OpenCV 中使用它,就需要显式指定边界模式为复制。
Arm Learning Path 提供了一个详细示例,展示了如何构建一个充分利用 KleidiCV 性能提升的安卓应用。
Learning Path: https://learn.arm.com/learnin...
展望
在未来的版本中,Arm 将继续扩展 KleidiCV 的能力,以更全面地加速 OpenCV 功能,并消除上述一些限制。而用户的需求对于 KleidiCV 的发展至关重要,我们欢迎开发者通过 Arm 的 GitLab 代码仓库提交反馈。
GitLab 代码仓库:https://gitlab.arm.com/kleidi...
END
作者:Arm 工程部资深软件工程师 Mark Horvath;Arm 工程部资深软件工程师 Michael Platings
文章来源:Arm社区
推荐阅读
- 如何在基于 Arm Neoverse 平台的 Kubernetes 集群上实现实时情绪分析
- Armv9 技术讲堂 | Arm A 系列架构 2024 进展
- 在AWS Graviton4 CPU上运行Llama 3 70B模型,执行速度超过人类可读性水平
- 详解 Arm Cortex-A320,针对物联网优化的超高能效 Armv9 CPU
欢迎大家点赞留言,更多 Arm 技术文章动态请关注极术社区 Arm 技术专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。