是否可以在Rust中使用SIMD指令?

pyt*_*nic 7 simd avx rust avx2

在C/C++中,您可以将内在函数用于SIMD(例如AVX和AVX2)指令.有没有办法在Rust中使用SIMD?

Mat*_* M. 10

答案是肯定的,并提出警告:

  • 通过core::arch模块在x86和x86_64上稳定可用,重新导出为std::arch.
  • 其他CPU现在需要使用夜间编译器.
  • 并非所有指令都可用core::arch,在这种情况下需要内联汇编,这也需要夜间编译器.

std::arch模块仅提供CPU指令作为内在函数,并且需要使用unsafe块以及特定feature于包含这些指令的函数来正确对齐参数.该文档std::arch是CPU功能的编译时和运行时检测的良好起点.

如文档中所述,未来某些时候可能会提供更高级别的API std::simd(可能core::simd); 在试映中是可用stdsimd箱子:

人体工程学

重要的是要注意使用该arch模块并不是世界上最简单的事情,所以如果你好奇地尝试它,你可能想要为自己的一些冗长做准备!

该模块的主要目的是在crates.io上启用稳定的板条箱,以构建更符合人体工程学的抽象,最终在引擎盖下使用SIMD.随着时间的推移,这些抽象也可能会进入标准库本身,但是现在这个模块的任务是提供在稳定的Rust上使用供应商内在函数所需的最低限度.

注意:您也可以使用FFI链接到为您执行此操作的库中; 例如,Shepmaster的丘比特箱使用这样的策略在运行时访问cpu功能.

  • @Shepmaster:我添加了一条注释;但我个人觉得这不再是“Rust 中的 SIMD”。此外,任何需要过度对齐参数的指令都需要非常小心(除非对齐规范最终可用?);我不知道 FFI 在这方面能提供什么帮助。 (3认同)