当前位置:网站首页>通过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 进行计算

总结
边栏推荐
- 05 | 规范设计(下):commit 信息风格迥异、难以阅读,如何规范?
- 玩转OLED,U8g2动画,增长数字和随机三角形等
- 3线spi屏幕驱动方式
- Generate flow chart with code, and how to use markdown
- Custom jsp[if, foreach, data, select] tag
- JSON parsing, esp32 easy access to time, temperature and weather
- Other service registration and discovery
- 史上最难618,TCL夺得电视行业京东和天猫份额双第一
- Flink 实战问题(七):No Watermark(Watermarks are only available EventTime is used)
- Kept to implement redis autofailover (redisha) 11
猜你喜欢

Lambda expression

可视化介绍 Matplotlib 和 Plotnine

Network in network (dolls)

buuctf-pwn write-ups (6)

一键加速索尼相机SD卡文件的复制操作,文件操作批处理教程

3線spi屏幕驅動方式

What are the skills and methods for slip ring installation

超越锂电池——未来电池的概念
![Count the logarithm of points that cannot reach each other in an undirected graph [classic adjacency table building +dfs Statistics - > query set optimization] [query set manual / write details]](/img/cc/a0be58eddc72c22a9a6ee5c61eb81a.png)
Count the logarithm of points that cannot reach each other in an undirected graph [classic adjacency table building +dfs Statistics - > query set optimization] [query set manual / write details]

IIS 部署静态网站和 FTP 服务
随机推荐
疫情期间居家办公的总结体会 |社区征文
Lwip之定时机制
Solve the problem that only one line of text is displayed or not displayed in u8glib
气液滑环与其他滑环的工作原理有什么区别
How to control the quality of HD slip ring in the production process
自定义类加载器对类加密解密
Lwip之ARP模块实现
大白话高并发(一)
memcached基础5
直播回顾 | 子芽&CCF TF:云原生场景下软件供应链风险治理技术浅谈
memcached基础1
idea 热启动失效解决方案
统一结果集的封装
温故知新--常温常新
对象的访问机制及其他
leetcode 1143. Longest common subsequence (medium)
寻找旋转排序数组中的最小值 II[经典抽象二分 + 如何破局左中右三者相等]
07 | workflow design: how to design a reasonable multi person development mode?
Redis detailed tutorial
IIS deploy static web site and FTP service