gecko-dev/third_party/rust/packed_simd
Henri Sivonen 78a66d15e6 Bug 1719674 - Make packed_simd compile with Rust 1.54. r=glandium
Cherry-pick upstream commits
58ba720df8
728d47506f
to update the shuffle API for const generics and to remove the unnecessary `const_fn`
feature gate.

Differential Revision: https://phabricator.services.mozilla.com/D119538
2021-07-15 08:42:08 +00:00
..
ci Bug 1622846 - Update BlendFactor API in WebGPU r=webidl,jimb,smaug 2021-04-22 19:18:49 +00:00
perf-guide
src Bug 1719674 - Make packed_simd compile with Rust 1.54. r=glandium 2021-07-15 08:42:08 +00:00
tests
.appveyor.yml
.cargo-checksum.json Bug 1719674 - Make packed_simd compile with Rust 1.54. r=glandium 2021-07-15 08:42:08 +00:00
.travis.yml
bors.toml
build.rs
Cargo.toml
contributing.md
LICENSE-APACHE
LICENSE-MIT
README.md
rustfmt.toml

Simd<[T; N]>

Implementation of Rust RFC #2366: std::simd

Travis-CI Status Appveyor Status Latest Version docs

WARNING: this crate only supports the most recent nightly Rust toolchain and will be superceded by stdsimd.

Documentation

Examples

Most of the examples come with both a scalar and a vectorized implementation.

Cargo features

  • into_bits (default: disabled): enables FromBits/IntoBits trait implementations for the vector types. These allow reinterpreting the bits of a vector type as those of another vector type safely by just using the .into_bits() method.

Performance

The following ISPC examples are also part of packed_simd's examples/ directory, where packed_simd+rayon are used to emulate ISPC's Single-Program-Multiple-Data (SPMD) programming model. The performance results on different hardware is shown in the readme.md of each example. The following table summarizes the performance ranges, where + means speed-up and - slowdown:

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

While SPMD is not the intended use case for packed_simd, it is possible to combine the library with rayon to poorly emulate ISPC's SPMD programming model in Rust. Writing performant code is not as straightforward as with ISPC, but with some care (e.g. see the Performance Guide) one can easily match and often out-perform ISPC's "default performance".

Platform support

The following table describes the supported platforms: build shows whether the library compiles without issues for a given target, while run shows whether the test suite passes for a given target.

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
Android build run
x86_64-linux-android
arm-linux-androideabi
aarch64-linux-android
thumbv7neon-linux-androideabi
iOS build run
x86_64-apple-ios
aarch64-apple-ios

Machine code verification

The verify/ crate tests disassembles the portable packed vector APIs at run-time and compares the generated machine code against the desired one to make sure that this crate remains efficient.

License

This project is licensed under either of

at your option.

Contributing

We welcome all people who want to contribute. Please see the contributing instructions for more information.

Contributions in any form (issues, pull requests, etc.) to this project must adhere to Rust's Code of Conduct.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in packed_simd by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.