Trait faster::zip::PackedZippedIterator
[−]
[src]
pub trait PackedZippedIterator: ExactSizeIterator + Sized { type Scalars: Copy + Sized; type Vectors: Copy + Sized; fn width(&self) -> usize; fn scalar_len(&self) -> usize; fn scalar_position(&self) -> usize; fn next_vectors(&mut self) -> Option<Self::Vectors>; fn next_partials(
&mut self,
default: Self::Vectors
) -> Option<(Self::Vectors, usize)>; fn next_splats(&mut self) -> Option<Self::Vectors>; fn simd_map<B, F>(
self,
defaults: Self::Vectors,
func: F
) -> PackedZipMap<Self, F>
where
F: FnMut(Self::Vectors) -> B, { ... } fn simd_reduce<A, F>(
&mut self,
start: A,
default: Self::Vectors,
func: F
) -> A
where
F: FnMut(A, Self::Vectors) -> A, { ... } }
A collection of packed iterators of the same scalar length and vector width, which may be iterated over in lockstep.
Associated Types
Required Methods
fn width(&self) -> usize
Return the width of this iterator's constitutent vectors.
fn scalar_len(&self) -> usize
Return the length of this iterator, measured in scalar elements.
fn scalar_position(&self) -> usize
Return the current position of this iterator, measured in scalar elements.
fn next_vectors(&mut self) -> Option<Self::Vectors>
Pack and return a vector containing the next self.width()
elements
of the iterator, or return None if there aren't enough elements left
fn next_partials(
&mut self,
default: Self::Vectors
) -> Option<(Self::Vectors, usize)>
&mut self,
default: Self::Vectors
) -> Option<(Self::Vectors, usize)>
Pack and return a partially full vector containing upto the next
self.width()
of the iterator, or None if no elements are left.
Elements which are not filled are instead initialized to default.
fn next_splats(&mut self) -> Option<Self::Vectors>
Pack and return a splatted vector containing the next element of the iterator, or None if no elements are left.
Provided Methods
fn simd_map<B, F>(
self,
defaults: Self::Vectors,
func: F
) -> PackedZipMap<Self, F> where
F: FnMut(Self::Vectors) -> B,
self,
defaults: Self::Vectors,
func: F
) -> PackedZipMap<Self, F> where
F: FnMut(Self::Vectors) -> B,
Return an iterator which calls func
on vectors of elements.
fn simd_reduce<A, F>(&mut self, start: A, default: Self::Vectors, func: F) -> A where
F: FnMut(A, Self::Vectors) -> A,
F: FnMut(A, Self::Vectors) -> A,
Return a vector generated by reducing func
over accumulator start
and the values of this iterator, initializing all vectors to default
before populating them with elements of the iterator.
Examples
extern crate faster; use faster::*; let reduced = (&[2.0f32; 100][..]).simd_iter() .simd_reduce(f32s::splat(0.0), f32s::splat(0.0), |acc, v| acc + v);
In this example, on a machine with 4-element vectors, the argument to the last call of the closure is
[ 2.0 | 2.0 | 2.0 | 2.0 ]
and the result of the reduction is
[ 50.0 | 50.0 | 50.0 | 50.0 ]
whereas on a machine with 8-element vectors, the last call is passed
[ 2.0 | 2.0 | 2.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 ]
and the result of the reduction is
[ 26.0 | 26.0 | 26.0 | 26.0 | 24.0 | 24.0 | 24.0 | 24.0 ]
Footgun Warning
The results of simd_reduce
are not portable, and it is your
responsibility to interepret the result in such a way that the it is
consistent across different architectures. See Packed::sum
and
Packed::product
for built-in functions which may be helpful.
Implementors
impl<Z, A, B> PackedZippedIterator for PackedZip<(A, B)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector); type Scalars = (A::Scalar, B::Scalar);impl<Z, A, B, C> PackedZippedIterator for PackedZip<(A, B, C)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar);impl<Z, A, B, C, D> PackedZippedIterator for PackedZip<(A, B, C, D)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar);impl<Z, A, B, C, D, E> PackedZippedIterator for PackedZip<(A, B, C, D, E)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar);impl<Z, A, B, C, D, E, F> PackedZippedIterator for PackedZip<(A, B, C, D, E, F)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar);impl<Z, A, B, C, D, E, F, G> PackedZippedIterator for PackedZip<(A, B, C, D, E, F, G)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
G: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector, G::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar, G::Scalar);impl<Z, A, B, C, D, E, F, G, H> PackedZippedIterator for PackedZip<(A, B, C, D, E, F, G, H)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
G: PackedIterator<Scalar = Z, Item = Z>,
H: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector, G::Vector, H::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar, G::Scalar, H::Scalar);impl<Z, A, B, C, D, E, F, G, H, I> PackedZippedIterator for PackedZip<(A, B, C, D, E, F, G, H, I)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
G: PackedIterator<Scalar = Z, Item = Z>,
H: PackedIterator<Scalar = Z, Item = Z>,
I: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector, G::Vector, H::Vector, I::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar, G::Scalar, H::Scalar, I::Scalar);impl<Z, A, B, C, D, E, F, G, H, I, J> PackedZippedIterator for PackedZip<(A, B, C, D, E, F, G, H, I, J)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
G: PackedIterator<Scalar = Z, Item = Z>,
H: PackedIterator<Scalar = Z, Item = Z>,
I: PackedIterator<Scalar = Z, Item = Z>,
J: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector, G::Vector, H::Vector, I::Vector, J::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar, G::Scalar, H::Scalar, I::Scalar, J::Scalar);impl<Z, A, B, C, D, E, F, G, H, I, J, K> PackedZippedIterator for PackedZip<(A, B, C, D, E, F, G, H, I, J, K)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
G: PackedIterator<Scalar = Z, Item = Z>,
H: PackedIterator<Scalar = Z, Item = Z>,
I: PackedIterator<Scalar = Z, Item = Z>,
J: PackedIterator<Scalar = Z, Item = Z>,
K: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector, G::Vector, H::Vector, I::Vector, J::Vector, K::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar, G::Scalar, H::Scalar, I::Scalar, J::Scalar, K::Scalar);impl<Z, A, B, C, D, E, F, G, H, I, J, K, L> PackedZippedIterator for PackedZip<(A, B, C, D, E, F, G, H, I, J, K, L)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
G: PackedIterator<Scalar = Z, Item = Z>,
H: PackedIterator<Scalar = Z, Item = Z>,
I: PackedIterator<Scalar = Z, Item = Z>,
J: PackedIterator<Scalar = Z, Item = Z>,
K: PackedIterator<Scalar = Z, Item = Z>,
L: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector, G::Vector, H::Vector, I::Vector, J::Vector, K::Vector, L::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar, G::Scalar, H::Scalar, I::Scalar, J::Scalar, K::Scalar, L::Scalar);impl<Z, A, B, C, D, E, F, G, H, I, J, K, L, M> PackedZippedIterator for PackedZip<(A, B, C, D, E, F, G, H, I, J, K, L, M)> where
A: PackedIterator<Scalar = Z, Item = Z>,
B: PackedIterator<Scalar = Z, Item = Z>,
C: PackedIterator<Scalar = Z, Item = Z>,
D: PackedIterator<Scalar = Z, Item = Z>,
E: PackedIterator<Scalar = Z, Item = Z>,
F: PackedIterator<Scalar = Z, Item = Z>,
G: PackedIterator<Scalar = Z, Item = Z>,
H: PackedIterator<Scalar = Z, Item = Z>,
I: PackedIterator<Scalar = Z, Item = Z>,
J: PackedIterator<Scalar = Z, Item = Z>,
K: PackedIterator<Scalar = Z, Item = Z>,
L: PackedIterator<Scalar = Z, Item = Z>,
M: PackedIterator<Scalar = Z, Item = Z>,
Z: Packable, type Vectors = (A::Vector, B::Vector, C::Vector, D::Vector, E::Vector, F::Vector, G::Vector, H::Vector, I::Vector, J::Vector, K::Vector, L::Vector, M::Vector); type Scalars = (A::Scalar, B::Scalar, C::Scalar, D::Scalar, E::Scalar, F::Scalar, G::Scalar, H::Scalar, I::Scalar, J::Scalar, K::Scalar, L::Scalar, M::Scalar);