#simd-vector #simd #vector #portability

nightly no-std uv_patch_packed_simd

可移植的打包 SIMD 向量。为释放临时分支实现 ultraviolet 的 asin 和 acos,以便解锁发布。

1 个不稳定版本

0.3.5 2020 年 8 月 28 日
0.3.4 2020 年 8 月 28 日

#1129硬件支持

MIT/Apache

590KB
12K SLoC

Simd<[T; N]>

Rust RFC #2366 的实现:Rust RFC #2366

Travis-CI Status Appveyor Status Latest Version docs

本库旨在为 Rust RFC 2366 提供完全符合标准的实现,以稳定化。

警告:此 crate 仅支持最新的 nightly Rust 工具链。

文档

示例

大部分示例都提供了标量和向量化的实现。

Cargo 功能

  • into_bits(默认:禁用):启用 FromBits/IntoBits 特性实现,允许通过使用 .into_bits() 方法安全地将向量类型的位重新解释为另一种向量类型的位。

  • core_arch(默认:禁用):启用此功能以针对启用目标功能重新编译 core::archpacked_simd 包含针对此功能启用的某些目标功能组合的优化。请注意,这是一个不稳定依赖项,rustc 可能随时破坏。

  • sleef-sys(默认:禁用 - 仅适用于 x86_64):当通过 sleef-sys crate 有利时,内部使用 SLEEF 短向量数学库。 SLEEF 以下 Boost 软件许可证 v1.0 许可,这是一个非常宽容的许可证,可以无问题地静态链接。

性能

以下ISPC示例也是packed_simdexamples/目录的一部分,其中使用了packed_simd+rayon来模拟ISPC的单程序多数据(SPMD)编程模型。不同硬件上的性能结果显示在每个示例的readme.md中。下表总结了性能范围,其中+表示加速,而-表示减速

  • aobench: [-1.02x, +1.53x],
  • stencil: [+1.06x, +1.72x],
  • mandelbrot: [-1.74x, +1.2x],
  • 期权定价:
    • black_scholes: +1.0x
    • binomial_put: +1.4x

虽然SPMD不是packed_simd的预期用例,但可以将库与rayon结合,在Rust中拙劣地模拟ISPC的SPMD编程模型。编写性能良好的代码不像ISPC那样简单,但通过一些注意事项(例如,请参阅性能指南)可以轻松匹配甚至超越ISPC的“默认性能”。

平台支持

以下表格描述了支持的平台:build显示库是否在没有问题的目标上编译,而run显示完整的测试套件是否在目标上通过。

Linux目标 build run
i586-unknown-linux-gnu
i686-unknown-linux-gnu
x86_64-unknown-linux-gnu
arm-unknown-linux-gnueabi
arm-unknown-linux-gnueabihf
armv7-unknown-linux-gnueabi
aarch64-unknown-linux-gnu
mips-unknown-linux-gnu
mipsel-unknown-linux-musl
mips64-unknown-linux-gnuabi64
mips64el-unknown-linux-gnuabi64
powerpc-unknown-linux-gnu
powerpc64-unknown-linux-gnu
powerpc64le-unknown-linux-gnu
s390x-unknown-linux-gnu ✓*
sparc64-unknown-linux-gnu ✓*
thumbv7neon-unknown-linux-gnueabihf
MacOSX目标 build run
x86_64-apple-darwin
i686-apple-darwin
Windows目标 build run
x86_64-pc-windows-msvc
i686-pc-windows-msvc
x86_64-pc-windows-gnu
i686-pc-windows-gnu
WebAssembly目标 build run
wasm32-unknown-unknown
Android目标 build run
x86_64-linux-android
arm-linux-androideabi
aarch64-linux-android
thumbv7neon-linux-androideabi
iOS目标 build run
i386-apple-ios
x86_64-apple-ios
armv7-apple-ios ✗**
aarch64-apple-ios ✗**
xBSD目标 build run
i686-unknown-freebsd ✗**
x86_64-unknown-freebsd ✗**
x86_64-unknown-netbsd ✗**
Solaris目标 build run
x86_64-sun-solaris ✗**

[*] 大多数测试套件在这些平台上正确通过,但在问题跟踪器中存在一些正确性错误。

**[**] 目前无法轻松地在CI上运行这些平台。

机器码验证

verify/ 库在运行时测试可移植打包向量API的反汇编,并将生成的机器码与期望的机器码进行比较,以确保此库保持高效。

许可证

本项目可以在以下任一许可证下使用:

您可根据需要选择。

贡献

我们欢迎所有希望做出贡献的人。请参阅贡献说明获取更多信息。

对本项目的任何形式(问题、pull请求等)的贡献必须遵守Rust的行为准则

除非您明确声明,否则您提交的任何有意包含在 packed_simd 中的贡献,根据Apache-2.0许可证的定义,应双许可如上所述,无需任何附加条款或条件。

依赖关系

~0.4–2.2MB
~35K SLoC