我们在此宣布启动 Libs 团队内部的 Portable SIMD 项目组。该小组致力于为稳定的 Rust 用户提供可移植的 SIMD API。
Portable SIMD 项目组由以下人员领导:@calebzulawski、@Lokathor 和 @workingjubilee。
什么是项目组?
Rust 使用 项目组 来帮助协调工作。它们是一个让人们参与并帮助塑造对他们而言重要的 Rust 部分的地方。
什么是 SIMD?
SIMD 代表 Single Instruction, Multiple Data(单指令多数据)。它允许 CPU 对数据的“向量”应用单个指令。向量是一个由相同数据类型的多个“通道”(lane)组成的额外宽的 CPU 寄存器。你可以认为它与数组 类似。与单独处理每个通道不同,所有通道都可以 同时 应用相同的操作。这使得数据转换比标准代码快得多。并非所有问题都可以通过“向量化”代码加速,但对于多媒体和列表处理应用程序,可以获得显著的性能提升。
为什么需要使其可移植?
不同的芯片厂商提供不同的 SIMD 指令。其中一些可在 Rust 的 std::arch
模块中找到。你 可以 使用它来构建向量化函数,但这需要为你想支持的每种 CPU 维护一个不同的版本。你也可以选择 不 编写向量化操作,并希望 LLVM 的优化器能“自动向量化”你的代码。然而,自动向量化器很容易混淆,并且可能无法优化那些“显而易见”的向量任务。
可移植的 SIMD API 将允许使用高级 API 只编写一次 SIMD 代码。通过明确地向编译器传达你的意图,它能更好地生成最佳的最终代码。这仍然只是尽力而为的过程。如果你的目标平台不支持所需的 SIMD 操作,编译器将退回到使用标量代码,一次处理一个通道。可用的具体内容取决于构建目标。
我们计划将 Portable SIMD API 以 std::simd
的形式发布。我们会涵盖尽可能多的用例,但有时你可能仍然需要直接使用 std::arch
。因此,在需要时,std::simd
类型也将能轻松转换为 std::arch
类型。
我如何参与?
每个人都可以参与!无需任何前期经验。如果你想帮助使可移植 SIMD 成为现实,可以访问我们的 GitHub 仓库 或在 Zulip 上联系我们并打个招呼!:wave