高品质的音视频能力是怎样的? | Qcon 全球软件开发大会·上海站邀请函 了解详情
写点什么

Rust 1.27 支持 SIMD

  • 2018-06-27
  • 本文字数:1074 字

    阅读完需:约 4 分钟

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

2018-06-27 03:451598
用户头像

发布了 731 篇内容, 共 406.1 次阅读, 收获喜欢 1966 次。

关注

评论

发布
暂无评论
发现更多内容

线上数据被回滚两次我都做了哪些不正确的操作

Gopher指北

MySQL 后端

LeetCode题解:45. 跳跃游戏 II,贪心正向查找,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

让战略不再”空虚“的战略描述

Alan

战略思考 战略

架构师训练营第十一周学习笔记

一马行千里

学习 极客大学架构师训练营

Flutter Plugin插件开发填坑指南

flutter 经验分享

Spock单元测试框架实战指南三 - f esle 多分支场景测试

Java老k

单元测试 spock

面试被问线程安全怎么保障,我的回答让面试官眼前一亮

996小迁

Java 学习 架构 面试 笔记

甲方日常 63

句子

工作 随笔杂谈 日常

架构师训练营第十一周命题作业

一马行千里

极客大学架构师训练营 命题作业

架构师训练营第 12 周总结

邓昀垚

培训是为了激发学员学习这门课的兴趣

boshi

职业 培训

default-servlet-handler不生效原因,springmvc静态资源拦截方案比较

叫练

springmvc 静态资源拦截 default-servlet-handler 资源配置不生效

roblox 杂记

katichar

DeFi质押挖矿APP系统开发|DeFi质押挖矿软件开发

系统开发

技术博客,从零到数万访问,这两年我都做了什么

android 博客 经验分享

网络入门模拟器:Cisco Packet Tracer

我是怎么教我6岁女儿编程的

勇往直前的胖子

少儿编程

Redis 为什么这么快?这才是最完美的回答

Java架构师迁哥

《程序员数学:使用Python进行3D图形,机器学习和仿真》PDF免费下载

计算机与AI

Python 学习 数学

程序员有必要读研吗?

Java架构师迁哥

架构师视角 | 分布式缓存如何选择 ?

Java架构师迁哥

话题讨论 | Vue凭什么成为2020的一匹黑马?

黑马腾云

话题讨论

史上最实用的Android切片应用库XAOP使用指南

android 开源 aop 框架

区块链防伪溯源平台开发解决方案

t13823115967

区块链+ 区块链产品溯源

二、关于大型复杂系统

数列科技杨德华

传销组织的CTO | 法庭上的CTO(4)

赵新龙

CTO 传销 法庭上的CTO

计算机网络基础

Minar Kotonoha

node.js 大前端 计算机网络 HTTP

自营电商渠道转化率的简单设计思路

boshi

推广

智慧公安大屏可视化决策系统搭建

t13823115967

智慧公安 智慧大屏可视化

JVM垃圾回收?全面详细安排!

程序员的时光

JVM GC

架构师训练营第12周作业

邓昀垚

Rust 1.27支持SIMD_语言 & 开发_Sergio De Simone_InfoQ精选文章