1 个不稳定版本
0.3.5 | 2020 年 8 月 28 日 |
---|---|
0.3.4 |
|
#1129 在 硬件支持
590KB
12K SLoC
Simd<[T; N]>
Rust RFC #2366 的实现:Rust RFC #2366
本库旨在为 Rust RFC 2366 提供完全符合标准的实现,以稳定化。
警告:此 crate 仅支持最新的 nightly Rust 工具链。
文档
- API 文档(master 分支)
- 性能指南
- API 文档(docs.rs)
- RFC2366:包含动机、设计原理、讨论等。
示例
大部分示例都提供了标量和向量化的实现。
Cargo 功能
-
into_bits
(默认:禁用):启用FromBits
/IntoBits
特性实现,允许通过使用.into_bits()
方法安全地将向量类型的位重新解释为另一种向量类型的位。 -
core_arch
(默认:禁用):启用此功能以针对启用目标功能重新编译core::arch
。packed_simd
包含针对此功能启用的某些目标功能组合的优化。请注意,这是一个不稳定依赖项,rustc 可能随时破坏。 -
sleef-sys
(默认:禁用 - 仅适用于x86_64
):当通过sleef-sys
crate 有利时,内部使用 SLEEF 短向量数学库。 SLEEF 以下 Boost 软件许可证 v1.0 许可,这是一个非常宽容的许可证,可以无问题地静态链接。
性能
以下ISPC示例也是packed_simd
的examples/
目录的一部分,其中使用了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