pub struct Product;Expand description
Multiplicative reduction: computes ∏ data[i].
Identity element is T::ONE. Uses SIMD mul to accumulate lane products, then
reduces horizontally via a scalar lane-extraction loop (no prod_reduce on
SimdKernel — the hardware does not expose one universally).
§Zero-Cost Guarantee
size_of::<Product>() == 0. All branching over Product vs other ops is
eliminated via DCE during monomorphization.
Trait Implementations§
impl Copy for Product
impl Eq for Product
Source§impl<T> ReductionOp<T> for Productwhere
T: NumericElement,
impl<T> ReductionOp<T> for Productwhere
T: NumericElement,
Source§unsafe fn accumulate<Arch>(
acc: <Arch as SimdKernel<T>>::Vector,
v: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
unsafe fn accumulate<Arch>(
acc: <Arch as SimdKernel<T>>::Vector,
v: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
Accumulate: acc = acc * v (lane-wise multiply).
§Safety
Processor must support the target feature of Arch.
Source§unsafe fn finalize<Arch>(acc: <Arch as SimdKernel<T>>::Vector) -> Twhere
Arch: SimdKernel<T>,
unsafe fn finalize<Arch>(acc: <Arch as SimdKernel<T>>::Vector) -> Twhere
Arch: SimdKernel<T>,
Finalize: store the accumulated product vector and reduce over lanes.
There is no universal prod_reduce intrinsic, so this falls back to:
- Store the
LANE_COUNTpartial products into a local stack array. - Scalar-fold with
*.
For Scalar arch this is always a single-element store + identity.
§Safety
Processor must support the target feature of Arch.
Source§fn identity_scalar() -> T
fn identity_scalar() -> T
The identity element for this reduction as a scalar. Read more
Source§fn scalar_combine(a: T, b: T) -> T
fn scalar_combine(a: T, b: T) -> T
Combine two scalar partial results using this reduction. Read more
Source§unsafe fn fma_pair_accumulate<Arch>(
acc: <Arch as SimdKernel<T>>::Vector,
a: <Arch as SimdKernel<T>>::Vector,
b: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
unsafe fn fma_pair_accumulate<Arch>(
acc: <Arch as SimdKernel<T>>::Vector,
a: <Arch as SimdKernel<T>>::Vector,
b: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
FMA-aware pairwise accumulation:
acc = fuse(acc, a, b) where fuse may use
a single fused multiply-add instruction rather than a separate mul + accumulate. Read moreSource§fn scalar_accumulate(acc: T, elem: T) -> T
fn scalar_accumulate(acc: T, elem: T) -> T
Source§unsafe fn identity_vector<Arch>() -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
unsafe fn identity_vector<Arch>() -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
Splat the identity element into a vector register. Read more
Source§unsafe fn transform_vector<Arch>(
v: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
unsafe fn transform_vector<Arch>(
v: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
Per-element lane transform applied before combining (identity by default). Read more
Source§unsafe fn combine_vectors<Arch>(
a: <Arch as SimdKernel<T>>::Vector,
b: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
unsafe fn combine_vectors<Arch>(
a: <Arch as SimdKernel<T>>::Vector,
b: <Arch as SimdKernel<T>>::Vector,
) -> <Arch as SimdKernel<T>>::Vectorwhere
Arch: SimdKernel<T>,
Merge two partial accumulators WITHOUT the per-element transform. Read more
impl StructuralPartialEq for Product
Auto Trait Implementations§
impl Freeze for Product
impl RefUnwindSafe for Product
impl Send for Product
impl Sync for Product
impl Unpin for Product
impl UnsafeUnpin for Product
impl UnwindSafe for Product
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
The archived version of the pointer metadata for this type.
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Converts some archived metadata to the pointer metadata for itself.
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Returns the layout of the type.
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Returns whether the given value has been niched. Read more
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
Writes data to
out indicating that a T is niched.