Crates.io | uv_patch_packed_simd |
lib.rs | uv_patch_packed_simd |
version | 0.3.5 |
source | src |
created_at | 2020-08-28 06:09:20.682365 |
updated_at | 2020-08-28 06:26:37.568243 |
description | Portable Packed SIMD vectors. Temporary fork implementing asin and acos for `ultraviolet` to unblock release. |
homepage | |
repository | https://github.com/termhn/packed_simd |
max_upload_size | |
id | 281729 |
size | 660,798 |
Simd<[T; N]>
std::simd
This aims to be a 100% conforming implementation of Rust RFC 2366 for stabilization.
WARNING: this crate only supports the most recent nightly Rust toolchain.
master
branch)docs.rs
)std::simd
: - contains motivation, design rationale,
discussion, etc.Most of the examples come with both a scalar and a vectorized implementation.
aobench
fannkuch_redux
matrix inverse
mandelbrot
n-body
options_pricing
spectral_norm
triangle transform
stencil
vector dot product
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.
core_arch
(default: disabled): enable this feature to recompile core::arch
for the target-features enabled. packed_simd
includes optimizations for some
target feature combinations that are enabled by this feature. Note, however,
that this is an unstable dependency, that rustc might break at any time.
sleef-sys
(default: disabled - x86_64
only): internally uses the SLEEF
short-vector math library when profitable via the sleef-sys
crate. SLEEF is licensed under the Boost Software License
v1.0, an extremely permissive license, and can be statically
linked without issues.
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".
The following table describes the supported platforms: build
shows whether the
library compiles without issues for a given target, while run
shows whether
the full testsuite passes on the target.
Linux targets: | 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 targets: | build | run |
x86_64-apple-darwin |
✓ | ✓ |
i686-apple-darwin |
✓ | ✓ |
Windows targets: | build | run |
x86_64-pc-windows-msvc |
✓ | ✓ |
i686-pc-windows-msvc |
✓ | ✓ |
x86_64-pc-windows-gnu |
✗ | ✗ |
i686-pc-windows-gnu |
✗ | ✗ |
WebAssembly targets: | build | run |
wasm32-unknown-unknown |
✓ | ✓ |
Android targets: | build | run |
x86_64-linux-android |
✓ | ✓ |
arm-linux-androideabi |
✓ | ✓ |
aarch64-linux-android |
✓ | ✗ |
thumbv7neon-linux-androideabi |
✓ | ✓ |
iOS targets: | build | run |
i386-apple-ios |
✓ | ✗ |
x86_64-apple-ios |
✓ | ✗ |
armv7-apple-ios |
✓ | ✗** |
aarch64-apple-ios |
✓ | ✗** |
xBSD targets: | build | run |
i686-unknown-freebsd |
✗ | ✗** |
x86_64-unknown-freebsd |
✗ | ✗** |
x86_64-unknown-netbsd |
✗ | ✗** |
Solaris targets: | build | run |
x86_64-sun-solaris |
✗ | ✗** |
[*] most of the test suite passes correctly on these platform but there are correctness bugs open in the issue tracker.
[**] it is currently not easily possible to run these platforms on CI.
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.
This project is licensed under either of
at your option.
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.