Module simd
Portable SIMD module.
This module offers a portable abstraction for SIMD operations that is not bound to any particular hardware architecture.
What is "portable"?
This module provides a SIMD implementation that is fast and predictable on any target.
Portable SIMD works on every target
Unlike target-specific SIMD in std::arch, portable SIMD compiles for every target.
In this regard, it is just like "regular" Rust.
Portable SIMD is consistent between targets
A program using portable SIMD can expect identical behavior on any target.
In most regards, [Simd<T, N>] can be thought of as a parallelized [T; N] and operates like a sequence of T.
This has one notable exception: a handful of older architectures (e.g. armv7 and powerpc) flush subnormal f32 values to zero.
On these architectures, subnormal f32 input values are replaced with zeros, and any operation producing subnormal f32 values produces zeros instead.
This doesn't affect most architectures or programs.
Operations use the best instructions available
Operations provided by this module compile to the best available SIMD instructions.
Portable SIMD is not a low-level vendor library, and operations in portable SIMD do not necessarily map to a single instruction. Instead, they map to a reasonable implementation of the operation for the target.
Consistency between targets is not compromised to use faster or fewer instructions.
In some cases, std::arch will provide a faster function that has slightly different behavior than the std::simd equivalent.
For example, _mm_min_ps1 can be slightly faster than SimdFloat::simd_min, but does not conform to the IEEE standard also used by f32::min.
When necessary, [Simd<T, N>] can be converted to the types provided by std::arch to make use of target-specific functions.
Many targets simply don't have SIMD, or don't support SIMD for a particular element type. In those cases, regular scalar operations are generated instead.
-
_mm_min_ps(x, y)is equivalent tox.simd_lt(y).select(x, y)↩
Modules
- cmp Traits for comparing and ordering vectors.
- num Traits for vectors with numeric elements.
- prelude The portable SIMD prelude.
- private_methods
- ptr Traits for vectors of pointers.
Structs
Traits
- FixEndianness
- MaskElement Marker trait for types that may be used as SIMD mask elements.
- Select Choose elements from two vectors using a mask.
-
SimdCast
Supporting trait for
Simd::cast. Typically doesn't need to be used directly. - SimdElement Marker trait for types that may be used as SIMD vector elements.
- Swizzle Creates a vector from the elements of another vector.
- ToBytes Converts SIMD vectors to vectors of bytes
Functions
Type Aliases
-
f16x1
A SIMD vector with one element of type
f16. -
f16x16
A SIMD vector with 16 elements of type
f16. -
f16x2
A SIMD vector with two elements of type
f16. -
f16x32
A SIMD vector with 32 elements of type
f16. -
f16x4
A SIMD vector with four elements of type
f16. -
f16x64
A SIMD vector with 64 elements of type
f16. -
f16x8
A SIMD vector with eight elements of type
f16. -
f32x1
A SIMD vector with one element of type
f32. -
f32x16
A SIMD vector with 16 elements of type
f32. -
f32x2
A SIMD vector with two elements of type
f32. -
f32x32
A SIMD vector with 32 elements of type
f32. -
f32x4
A SIMD vector with four elements of type
f32. -
f32x64
A SIMD vector with 64 elements of type
f32. -
f32x8
A SIMD vector with eight elements of type
f32. -
f64x1
A SIMD vector with one element of type
f64. -
f64x16
A SIMD vector with 16 elements of type
f64. -
f64x2
A SIMD vector with two elements of type
f64. -
f64x32
A SIMD vector with 32 elements of type
f64. -
f64x4
A SIMD vector with four elements of type
f64. -
f64x64
A SIMD vector with 64 elements of type
f64. -
f64x8
A SIMD vector with eight elements of type
f64. -
i16x1
A SIMD vector with one element of type
i16. -
i16x16
A SIMD vector with 16 elements of type
i16. -
i16x2
A SIMD vector with two elements of type
i16. -
i16x32
A SIMD vector with 32 elements of type
i16. -
i16x4
A SIMD vector with four elements of type
i16. -
i16x64
A SIMD vector with 64 elements of type
i16. -
i16x8
A SIMD vector with eight elements of type
i16. -
i32x1
A SIMD vector with one element of type
i32. -
i32x16
A SIMD vector with 16 elements of type
i32. -
i32x2
A SIMD vector with two elements of type
i32. -
i32x32
A SIMD vector with 32 elements of type
i32. -
i32x4
A SIMD vector with four elements of type
i32. -
i32x64
A SIMD vector with 64 elements of type
i32. -
i32x8
A SIMD vector with eight elements of type
i32. -
i64x1
A SIMD vector with one element of type
i64. -
i64x16
A SIMD vector with 16 elements of type
i64. -
i64x2
A SIMD vector with two elements of type
i64. -
i64x32
A SIMD vector with 32 elements of type
i64. -
i64x4
A SIMD vector with four elements of type
i64. -
i64x64
A SIMD vector with 64 elements of type
i64. -
i64x8
A SIMD vector with eight elements of type
i64. -
i8x1
A SIMD vector with one element of type
i8. -
i8x16
A SIMD vector with 16 elements of type
i8. -
i8x2
A SIMD vector with two elements of type
i8. -
i8x32
A SIMD vector with 32 elements of type
i8. -
i8x4
A SIMD vector with four elements of type
i8. -
i8x64
A SIMD vector with 64 elements of type
i8. -
i8x8
A SIMD vector with eight elements of type
i8. -
isizex1
A SIMD vector with one element of type
isize. -
isizex16
A SIMD vector with 16 elements of type
isize. -
isizex2
A SIMD vector with two elements of type
isize. -
isizex32
A SIMD vector with 32 elements of type
isize. -
isizex4
A SIMD vector with four elements of type
isize. -
isizex64
A SIMD vector with 64 elements of type
isize. -
isizex8
A SIMD vector with eight elements of type
isize. - mask16x1 A SIMD mask with one element for vectors with 16-bit element types.
- mask16x16 A SIMD mask with 16 elements for vectors with 16-bit element types.
- mask16x2 A SIMD mask with two elements for vectors with 16-bit element types.
- mask16x32 A SIMD mask with 32 elements for vectors with 16-bit element types.
- mask16x4 A SIMD mask with four elements for vectors with 16-bit element types.
- mask16x64 A SIMD mask with 64 elements for vectors with 16-bit element types.
- mask16x8 A SIMD mask with eight elements for vectors with 16-bit element types.
- mask32x1 A SIMD mask with one element for vectors with 32-bit element types.
- mask32x16 A SIMD mask with 16 elements for vectors with 32-bit element types.
- mask32x2 A SIMD mask with two elements for vectors with 32-bit element types.
- mask32x32 A SIMD mask with 32 elements for vectors with 32-bit element types.
- mask32x4 A SIMD mask with four elements for vectors with 32-bit element types.
- mask32x64 A SIMD mask with 64 elements for vectors with 32-bit element types.
- mask32x8 A SIMD mask with eight elements for vectors with 32-bit element types.
- mask64x1 A SIMD mask with one element for vectors with 64-bit element types.
- mask64x16 A SIMD mask with 16 elements for vectors with 64-bit element types.
- mask64x2 A SIMD mask with two elements for vectors with 64-bit element types.
- mask64x32 A SIMD mask with 32 elements for vectors with 64-bit element types.
- mask64x4 A SIMD mask with four elements for vectors with 64-bit element types.
- mask64x64 A SIMD mask with 64 elements for vectors with 64-bit element types.
- mask64x8 A SIMD mask with eight elements for vectors with 64-bit element types.
- mask8x1 A SIMD mask with one element for vectors with 8-bit element types.
- mask8x16 A SIMD mask with 16 elements for vectors with 8-bit element types.
- mask8x2 A SIMD mask with two elements for vectors with 8-bit element types.
- mask8x32 A SIMD mask with 32 elements for vectors with 8-bit element types.
- mask8x4 A SIMD mask with four elements for vectors with 8-bit element types.
- mask8x64 A SIMD mask with 64 elements for vectors with 8-bit element types.
- mask8x8 A SIMD mask with eight elements for vectors with 8-bit element types.
- masksizex1 A SIMD mask with one element for vectors with pointer-sized element types.
- masksizex16 A SIMD mask with 16 elements for vectors with pointer-sized element types.
- masksizex2 A SIMD mask with two elements for vectors with pointer-sized element types.
- masksizex32 A SIMD mask with 32 elements for vectors with pointer-sized element types.
- masksizex4 A SIMD mask with four elements for vectors with pointer-sized element types.
- masksizex64 A SIMD mask with 64 elements for vectors with pointer-sized element types.
- masksizex8 A SIMD mask with eight elements for vectors with pointer-sized element types.
-
u16x1
A SIMD vector with one element of type
u16. -
u16x16
A SIMD vector with 16 elements of type
u16. -
u16x2
A SIMD vector with two elements of type
u16. -
u16x32
A SIMD vector with 32 elements of type
u16. -
u16x4
A SIMD vector with four elements of type
u16. -
u16x64
A SIMD vector with 64 elements of type
u16. -
u16x8
A SIMD vector with eight elements of type
u16. -
u32x1
A SIMD vector with one element of type
u32. -
u32x16
A SIMD vector with 16 elements of type
u32. -
u32x2
A SIMD vector with two elements of type
u32. -
u32x32
A SIMD vector with 32 elements of type
u32. -
u32x4
A SIMD vector with four elements of type
u32. -
u32x64
A SIMD vector with 64 elements of type
u32. -
u32x8
A SIMD vector with eight elements of type
u32. -
u64x1
A SIMD vector with one element of type
u64. -
u64x16
A SIMD vector with 16 elements of type
u64. -
u64x2
A SIMD vector with two elements of type
u64. -
u64x32
A SIMD vector with 32 elements of type
u64. -
u64x4
A SIMD vector with four elements of type
u64. -
u64x64
A SIMD vector with 64 elements of type
u64. -
u64x8
A SIMD vector with eight elements of type
u64. -
u8x1
A SIMD vector with one element of type
u8. -
u8x16
A SIMD vector with 16 elements of type
u8. -
u8x2
A SIMD vector with two elements of type
u8. -
u8x32
A SIMD vector with 32 elements of type
u8. -
u8x4
A SIMD vector with four elements of type
u8. -
u8x64
A SIMD vector with 64 elements of type
u8. -
u8x8
A SIMD vector with eight elements of type
u8. -
usizex1
A SIMD vector with one element of type
usize. -
usizex16
A SIMD vector with 16 elements of type
usize. -
usizex2
A SIMD vector with two elements of type
usize. -
usizex32
A SIMD vector with 32 elements of type
usize. -
usizex4
A SIMD vector with four elements of type
usize. -
usizex64
A SIMD vector with 64 elements of type
usize. -
usizex8
A SIMD vector with eight elements of type
usize.
Macros
- alias
- impl_element
- impl_fix_endianness
- impl_from
- mask_alias
- number
- plural
- simd_swizzle Constructs a new SIMD vector by copying elements from selected elements in other vectors.