通过 Rust 语言计算加速技术突破图片识别性能瓶颈​​(下)

简介: Rust 是一门享誉中外的安全和高效的系统编程语言,业界各大平台包括华为选择和引入 Rust 这门语言作为自己的产品的开发语言。

stdarch 的主要工作——SIMD 接口的实现

两种接口实现方式

相同点:都是让用户可以用一般函数调用和传参的方式使用 SIMD 接口,其中需要使用编译器和 LLVM

区别:交互方式

第一种:通过 FFI 静态链接的方式,生成特定的函数签名,由编译器将其翻译成正确的 SIMD LLVM IR 并在 LLVM 生成汇编室,根据 IR 终极静态链接填入相应的汇编指令集。

这种方法和 C 中使用的方法比较类似,相对来说比较直接。缺点:需要开发者对 LLVM 有一定的使用经验,而且对 LLVM IR 有严格的使用要求。

由于 Rust 编译器本身会内置部分通用的 SIMD 指令,如加减乘除、位运算、元素重排等等;通过关键 platform 和 intrinsic 进行使用。使用可以有多条这样的指令组合成可以由 LLVM 的自动向量优化机制识别的一些组合接口。

使用用例:

下面是使用 SIMD 计算 0 到 len 中所有整数点的平方根之和

其他配套工具:

  1. 硬件特性检测 std-dect
  2. 自动化函数生成工具 stdarch-gen
  3. 接口验证工具 stdarch-verify

Rust 中 SIMD 多平台适配库

portable-simd 是多架构通用加速库:http://github.com/rust-lang/portable-simd

发展历程:packed_simd –> packed_simd2 –> portable-simd

编译器提供 platform-intrinsics

然后定义了一套 SIMD 数据结构和方法:sum()、reduce() 、select() 和运算符重载

使用示例:

Rust SIMD 的展望

  1. portable-simd 功能的完善
  2. 自动向量长度与指令选择
  3. 指令集扩展
  4. 新架构支持
  5. 丰富、场景化的 API 接口
  6. 自组合 SIMD 函数

其他计算加速技术

其他计算加速技术:迭代器

  1. 避免越界检测
  2. 循环展开
  3. 惰性计算
  4. 更好的编辑器 pass 优化

其他计算加速技术:并行化

  1. rayon:一行代码实现并行化缺点:对迭代器类型和被迭代变量的要求较严格
  2. async/await、tokio 异步计算技术

其他计算加速技术:编译器优化技术

  1. 内联汇编
  2. MIR 优化
  3. 自动向量化
  4. 计算图

高性能代码重构实践

识别重构关键点定位

  1. 重构关键点 1:数据存取通过一次性读取多个数据,用以减少缓存次数,提升程序效率。

    不仅仅是顺序读取,可以单次读取多数据,使用 vld4q_s32 SIMD ,比每次读取一次数据提高了 16 倍速率。

网络异常,图片无法展示
|


  1. 重构关键点 2:非前后依赖型数据计算,使用 vmlaq_s32 计算三个数组元素,获得 4 倍效率。
  2. 重构关键点 3:特殊场景—— AES 加解密、哈希算法、矩阵乘法、复数运算等都有专门为其开发的 SIMD 指令。可以直接使用。

重构方法

  1. 指令替换
  2. SIMD 接口组合
  3. 计算逻辑拆分

脏污检测算法代码重构案例

实践 1:迭代器的优化

左边的例子中分别要对 res 、resPrev 、resSum 三个数组进行迭代

而右边的代码通过 zip 方法获得了三个数组的联合迭代器,然后使用 for_each 方法进行循环计算,循环内的取值和计算逻辑保持不变的情况下,效率提升了 20% 左右。

实践 2:SIMD 优化

左边是一段连续的三段代码,可以按照顺序分为三个部分,每个部分都对应了 SIMD 优化的方式:

  1. 红色部分是数组的访问,也就是访存指令,可以使用 SIMD 指令进行加速,一次读取多个数据
  2. 绿色部分是乘法和加法的计算,可以使用 SIMD 指令的加法和乘法进行接口的替换和组合
  3. 蓝色部分是条件判断部分,这部分需要使用布尔型向量(包含全 0 或全 1 元素)存储判断条件,这种向量中每个元素的长度和计算数据类型保持一致,然后使用选择指令实现判断分支

网络异常,图片无法展示
|



  1. 实践 3:运算拆分优化

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


网络异常,图片无法展示
|


虽然这段代码只有简单的 5 行,但我们可以通过这种方式实现了最好的优化效果。


总结

本文介绍了如何通过 Rust 语言计算加速技术突破识别性能瓶颈,我们都看到 Rust 是一门声名渐起的语言,有着高效和安全的特点,然后介绍 Rust 语言中的 SIMD 技术包括其架构设计、专业指令加速库 stdarch 和接口实现和未来展望。

除了 SIMD 指令加速技术,文中还介绍了其他计算加速技术:迭代器、并行化、编辑器优化技术。

最后在以实践中的例子介绍了如何编写高性能代码重构的方法和案例,希望本文的内容能对你有所帮助,谢谢!

相关文章
|
1月前
|
Rust 安全 Java
探索Rust语言的并发编程模型
探索Rust语言的并发编程模型
|
1月前
|
Rust 安全 区块链
探索Rust语言:系统编程的新选择
【10月更文挑战第27天】Rust语言以其安全性、性能和并发性在系统编程领域受到广泛关注。本文介绍了Rust的核心特性,如内存安全、高性能和强大的并发模型,以及开发技巧和实用工具,展示了Rust如何改变系统编程的面貌,并展望了其在WebAssembly、区块链和嵌入式系统等领域的未来应用。
|
1月前
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
72 1
|
1月前
|
Rust 安全 编译器
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第26天】Rust语言诞生于2006年,由Mozilla公司的Graydon Hoare发起。作为一门系统编程语言,Rust专注于安全和高性能。通过所有权系统和生命周期管理,Rust在编译期就能消除内存泄漏等问题,适用于操作系统、嵌入式系统等高可靠性场景。
91 2
|
1月前
|
Rust 安全
深入理解Rust语言的所有权系统
深入理解Rust语言的所有权系统
36 0
|
1月前
|
Rust 安全 前端开发
探索Rust语言的异步编程模型
探索Rust语言的异步编程模型
|
1月前
|
Rust 安全 云计算
Rust语言入门:安全性与并发性的完美结合
【10月更文挑战第25天】Rust 是一种系统级编程语言,以其独特的安全性和并发性保障而著称。它提供了与 C 和 C++ 相当的性能,同时确保内存安全,避免了常见的安全问题。Rust 的所有权系统通过编译时检查保证内存安全,其零成本抽象设计使得抽象不会带来额外的性能开销。Rust 还提供了强大的并发编程工具,如线程、消息传递和原子操作,确保了数据竞争的编译时检测。这些特性使 Rust 成为编写高效、安全并发代码的理想选择。
29 0
|
2月前
|
Rust 安全 网络安全
在 Rust 语言中,寻找企业上网行为管理软件的突破
在数字化企业环境中,上网行为管理软件对于保障网络安全和提升工作效率至关重要。Rust 语言凭借其安全性、高性能和并发性,为开发此类软件提供了新机遇。本文通过几个 Rust 代码示例,展示了如何实现网址检查、访问频率统计及访问控制等功能,旨在探索 Rust 在企业上网行为管理中的应用潜力。
42 0
|
3月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习
|
4月前
|
开发者 vr&ar 机器学习/深度学习
Xamarin 开发者的未来趋势展望:掌握跨平台开发新机遇,引领移动应用创新潮流与技术变革方向
【8月更文挑战第31天】Xamarin 作为领先的跨平台开发框架,通过 C# 和 .NET 框架实现一次编写、多平台运行,简化了 iOS、Android 和 Windows 应用的开发流程。未来几年,Xamarin 开发者将面临跨平台开发普及、云集成、机器学习、AR/VR、性能优化及安全性等关键趋势。通过学习新技术并积极采用新工具,开发者能够提升应用质量和用户体验,如利用 Azure AD B2C 实现身份认证,从而在竞争激烈的市场中脱颖而出。
68 0