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

推荐答案

答案是肯定的,但要注意:

  • 它在stable for x86和x86_64 through the core::arch module上可用,重新出口为std::arch.
  • 其他CPU目前需要使用夜间编译器.
  • 并非所有指令都可以通过core::arch获得,在这种情况下,内联汇编是必要的,这也需要一个夜间编译器.

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

正如文件中所指出的,在future 的某个时候,std::simd(可能还有core::simd)下可能会提供更高级别的API;预告片有the stdsimd crate个版本:

人体工程学

重要的是要注意,使用arch模块并不是世界上最简单的事情,所以如果你想try 一下,你可能需要准备一些冗长的内容!

本模块的主要目的是在 crate 上启用稳定的 crate .io建立了更多的人体工程学抽象概念,最终在引擎盖下使用SIMD.随着时间的推移,这些抽象可能也会转移到标准库本身中,但目前这个模块的任务是提供在稳定的数据库上使用供应商内部函数所需的最低限度.

Note: you may also possibly use the FFI to link in a library that does so for you; for example 100 uses such a strategy to access cpu features at runtime.

Rust相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

什么是谓词的简短和简洁类型

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

包含嵌套 struct 的CSV

trait声明中的生命周期参数

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

取得本地对象字段的所有权

Rust中WPARAM和VIRTUAL_KEY的比较

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

Rust 如何返回大类型(优化前)?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

borrow 匹配手臂内部的可变

如何递归传递闭包作为参数?

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

Rust,使用枚举从 HashMap 获取值

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

如何迭代调用可能会失败的函数?操作员?