For the complete documentation index, see llms.txt. Markdown versions of all pages are available by appending .md to any URL (e.g. /max/get-started.md).
Mojo struct
ReduceProduct
struct ReduceProduct[dtype: DType, W: Int = simd_width_of[dtype]()]
Product reduction monoid: (self, x) -> self * x.
Single-field state: acc: SIMD[dtype, W]. accumulate is one
expression β acc *= Self.pad[...](val). The horizontal collapse to
scalar happens once at reduce, in acc[0]. No hardware-fast
Reducer.product, so join_parallel falls through to the generic
combiner after the SIMD collapse.
Parametersβ
- βdtype (
DType): The accumulator dtype. - βW (
Int): SIMD width of the lane-wise accumulator. Defaults to the target'ssimd_width_of[dtype].
Fieldsβ
- βacc (
SIMD[dtype, W]): Lane-wise SIMD accumulator.reducereduces to scalar (placed inacc[0]); bodies readacc[0].
Implemented traitsβ
AnyType,
Copyable,
ImplicitlyCopyable,
ImplicitlyDeletable,
Movable,
ReduceOp,
RegisterPassable,
TrivialRegisterPassable
comptime membersβ
Singleβ
comptime Single = ReduceProduct[dtype, Int(1)]
widthβ
comptime width = W
Methodsβ
__init__β
def __init__() -> Self
Identity: acc = 1_W.
__getitem__β
def __getitem__(self, j: Int) -> Self.Single
Returns lane j as a width-1 monoid.
Returns:
Self.Single
__setitem__β
def __setitem__(mut self, j: Int, s: ReduceProduct[dtype, Int(1)])
Writes width-1 monoid s into lane j.
accumulateβ
def accumulate[val_dtype: DType, w: Int](mut self, val: SIMD[val_dtype, w], idx: SIMD[DType.int64, w] = 0)
Folds a SIMD tile into acc lane-wise. Partial tiles get identity-padded (1) via Self.pad.
Parameters:
Args:
- βval (
SIMD[val_dtype, w]): The SIMD tile to fold. - βidx (
SIMD[DType.int64, w]): Unused (Product is index-agnostic).
joinβ
def join(mut self, other: Self)
Sequential combine: lane-wise product.
Args:
- βother (
Self): The state to combine intoself.
reduceβ
def reduce(self) -> Self.Single
Multiplies the W lane partials via the reduce_mul intrinsic.
Overrides the default lane-fold so the vectorized horizontal product is emitted explicitly rather than reconstructed from a scalar chain by the optimizer (a measured CPU win; GPU-neutral).
Returns:
Self.Single: A width-1 ReduceProduct holding the product in acc[0].
join_parallelβ
def join_parallel[R: Reducer](mut self, reducer: R)
Cross-thread combine. No hardware-fast scalar product, so this goes through reducer.generic. Runs after reduce, so acc[0] already holds the within-thread product; reduce a width-1 ReduceProduct (1 uint32 word) so the combine takes the register shuffle-butterfly (<= _WARP_SHUFFLE_MAX_WORDS) rather than the shmem tree a wider state falls into, then splat the result back.
Parameters:
- βR (
Reducer): The parallel scalar reducer.
Args:
- βreducer (
R): The reducer instance.
Was this page helpful?
Thank you! We'll create more content like this.
Thank you for helping us improve!