当前位置:网站首页>通过Rust语言计算加速技术突破图片识别性能瓶颈
通过Rust语言计算加速技术突破图片识别性能瓶颈
2022-06-27 00:34:00 【InfoQ】
前言
Rust 语言计算加速效果图


什么是 SIMD 技术


SIMD 技术业界优秀实践
- Numpy:多维数组计算开发库,主流用 Python 语言做数字计算开发,它的实现中有许多地方做了 SIMD 开发优化。
- OpenCV:计算机视觉库,它的核心Universal Intrinsics API基本都是基于 SIMD 来实现的。
- IPP:IntelIPP,因特尔的多媒体计算库,里面的函数实现都使用了SIMD指令进行优化。
- OpenBLAS:一个开源的矩阵计算库,包含了诸多的精度和形式的矩阵计算算法。
- KML:华为自研的数学库,鲲鹏数学库(Kunpeng Math Library,以下简称KML)是基于华为鲲鹏处理器的高性能数学计算加速库,提供了基于鲲鹏平台优化的数学函数。
- 可以说,只要是以计算性能为核心竞争力的软件,SIMD 都是不可绕开的核心技术。
Rust 语言中的 SIMD
架构设计
社区重点工作——专业指令加速库 stdarch

stdarch 的主要工作——SIMD 接口的实现
- 硬件特性检测std-dect
- 自动化函数生成工具stdarch-gen
- 接口验证工具stdarch-verify
Rust 中 SIMD 多平台适配库
Rust SIMD 的展望
- portable-simd 功能的完善
- 自动向量长度与指令选择
- 指令集扩展
- 新架构支持
- 丰富、场景化的 API 接口
- 自组合 SIMD 函数
其他计算加速技术
其他计算加速技术:迭代器
- 避免越界检测
- 循环展开
- 惰性计算
- 更好的编辑器 pass 优化
其他计算加速技术:并行化
- rayon:一行代码实现并行化缺点:对迭代器类型和被迭代变量的要求较严格
- async/await、tokio 异步计算技术
其他计算加速技术:编译器优化技术
- 内联汇编
- MIR 优化
- 自动向量化
- 计算图
高性能代码重构实践
识别重构关键点定位
- 重构关键点 1:数据存取通过一次性读取多个数据,用以减少缓存次数,提升程序效率。
- 不仅仅是顺序读取,可以单次读取多数据,使用vld4q_s32 SIMD ,比每次读取一次数据提高了 16 倍速率。

- 重构关键点 2:非前后依赖型数据计算,使用 vmlaq_s32 计算三个数组元素,获得 4 倍效率。
- 重构关键点 3:特殊场景—— AES 加解密、哈希算法、矩阵乘法、复数运算等都有专门为其开发的 SIMD 指令。可以直接使用。
重构方法
- 指令替换
- SIMD 接口组合
- 计算逻辑拆分
脏污检测算法代码重构案例
- 红色部分是数组的访问,也就是访存指令,可以使用 SIMD 指令进行加速,一次读取多个数据
- 绿色部分是乘法和加法的计算,可以使用 SIMD 指令的加法和乘法进行接口的替换和组合
- 蓝色部分是条件判断部分,这部分需要使用布尔型向量(包含全 0 或全 1 元素)存储判断条件,这种向量中每个元素的长度和计算数据类型保持一致,然后使用选择指令实现判断分支

- 实践 3:运算拆分优化
- 接下来看一段运算拆分优化的例子,左边的代码可以分为三个部分:
- 绿色部分包含自乘计算、访存、类型转换,都可以用 SIMD 指令进行加速
- 红色部分属于累加计算,不可以用 SIMD
- 蓝色部分属于向量加计算,也可以用 SIMD 进行计算

总结
边栏推荐
猜你喜欢

温故知新--常温常新

用代码生成流程图,Markdown的使用方法

07 | workflow design: how to design a reasonable multi person development mode?

CPU的异常处理

30《MySQL 教程》MySQL 存储引擎概述

Hid device descriptor and keyboard key value corresponding coding table in USB protocol

可视化介绍 Matplotlib 和 Plotnine

简单快速的数网络(网络中的网络套娃)

ESP32-添加多目录的自定义组件

JSON parsing, esp32 easy access to time, temperature and weather
随机推荐
Other service registration and discovery
Keepalived 实现 Redis AutoFailover (RedisHA)13
Flink 实战问题(七):No Watermark(Watermarks are only available EventTime is used)
Implementation of ARP module in LwIP
leetcode 1143. Longest common subsequence (medium)
Timing mechanism of LwIP
find_circ详细使用指南
Review the old and know the new -- constant renewal at normal temperature
memcached基础
Law of Large Numbers
How to measure the thickness of glass substrate by spectral confocal
Lambda表达式
Find the minimum value in the rotation sort array ii[classical Abstract dichotomy + how to break the game left, middle and right are equal]
Keepalived 实现 Redis AutoFailover (RedisHA)16
高清滑环生产过程当中的质量如何把控
About Random Numbers
Unable to create a folder to save the sketch: MKDIR sketch
05 | standard design (Part 2): how to standardize the different styles of commit information, which are difficult to read?
Lwip之定时机制
find_ Detailed use guide of CIRC