51

Rust 1.27支持SIMD

 5 years ago
source link: http://www.infoq.com/cn/news/2018/06/rust-1.27-simd-support?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

SIMD支持是 Rust 1.27 中最值得一提的新特性,这一版本的Rust同时还带来了更为明确的trait语法。

在语言层面支持SIMD意味着开发人员可以在更高级别上表达矢量化计算,并在编译器不够智能时超越编译器来应用自动矢量化。下面的例子展示了如何表示两个向量(或切片)的总,这两个向量分别包含了16个元素,每个元素为一个字节长度(u8)。每个切片可放入一个128位寄存器,因此我们可以将这两个片放入两个寄存器,并使用新的 std :: arch模块 将它们添加到单个CPU指令中:

#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"),
      target_feature = "avx2"))]
fn foo() {
    #[cfg(target_arch = "x86")]
    use std::arch::x86::_mm256_add_epi64;
    #[cfg(target_arch = "x86_64")]
    use std::arch::x86_64::_mm256_add_epi64;

    unsafe {
        _mm256_add_epi64(...);
    }
}

上面的代码片段还展示了如何为特定平台定制你的SIMD指令,因为不是所有运行你的代码的平台都可以支持SIMD操作。第一个cfg标记仅为指定平台(x86或x86_64支持AVX2)输出以下代码,而里面那个cfg标记将为特定平台选择正确的_mm256_add_epi64指令。

通过std :: arch提供支持SIMD只是Rust在SIMD支持方面迈出的第一步。事实上,Rust已经计划了另一个模块std :: simd,它将提供更高级别的操作。在std :: simd中可以通过 faster crate,如用户可以使用simd_iter代替iter,或使用simd_map代替map等,来完成SIMD版本的基本矢量操作。

该语言的另一个新功能旨在让trait语法更加明确,当给定trait对象对应一个或两个指针时,让表示更加清晰。trait对象的表示语法如下:

Box<Foo>

这个语法隐藏了一个事实,即当Foo是一个结构时,它将被简单地嵌入到Box中。相反,如果它是一个trait,将被分配到堆上,并且一个指向它的vtable的指针将被分配到栈上。这是由于Rust中的vtable并不是与数据保存在一起的,而是分开存储,这个与C++不一样。为了让这些更加明确,现在Rust支持一个新的trait语法(dyn trait):

Box<dyn Foo>
    &dyn Foo
    &mut dyn Foo

旧的语法将保持不变,并且没有计划要弃用它。

最后,#[must_use]属性现在可以用在函数上,让编译器标记这些忽略了函数返回值的情况:

#[must_use]
fn double(x: i32) -> i32 {
    2 * x
}

fn main() {
    double(4); // warning: unused return value of `double` which must be used

    let _ = double(4); // (no warning)
}

要详细了解Rust 1.27,请不要错过官方发布说明。

查看英文原文: Rust 1.27 Adds Support for SIMD


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK