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

总结
边栏推荐
- ESP32-添加多目录的自定义组件
- memcached基础
- Statistical Hypothesis Testing
- BootstrapBlazor + FreeSql实战 Chart 图表使用(2)
- 3-wire SPI screen driving mode
- 05 | 規範設計(下):commit 信息風格迥异、難以閱讀,如何規範?
- Network in network (dolls)
- IIS deploy static web site and FTP service
- find_circ详细使用指南
- How to control the quality of HD slip ring in the production process
猜你喜欢
Law of Large Numbers
LeetCode 142. 环形链表 II
3线spi屏幕驱动方式
Generate flow chart with code, and how to use markdown
Moher College -x-forwarded-for injection vulnerability practice
Solve the problem that stc8g1k08 program cannot run and port configuration
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]
C#程序结构预览最基础入门
网络中的网络(套娃)
About Random Numbers
随机推荐
目前哪个证券公司炒股开户是最好最安全的?
leetcode 1143. Longest common subsequence (medium)
What is the difference between the working principle of gas-liquid slip ring and other slip rings
ESP32-SOLO开发教程,解决CONFIG_FREERTOS_UNICORE问题
XML learning notes
memcached基础6
Database interview questions +sql statement analysis
Modeling specifications: environment settings
Lwip之定时机制
Great health industry annual must attend event, 2022 Shandong International Great Health Industry Expo
统一结果集的封装
网上开通证券账户安全吗 手机炒股靠谱吗
Skills needing attention in selection and purchase of slip ring
自定义MVC(导成jar包)+与三层架构的区别+反射+面试题
CEC-I 中华学习机使用说明与问答
buuctf-pwn write-ups (6)
自定义JSP[if,foreach,数据,select]标签
小白看MySQL--windows环境安装MySQL
Employment prospect of GIS and remote sensing specialty and ranking selection of universities in 2022
Esp32 add multi directory custom component