Trait ReduceInstruction

Source
pub trait ReduceInstruction<P: ReducePrecision>:
    Send
    + Sync
    + 'static
    + Debug
    + CubeType {
    type Config: CubeComptime + Send + Sync;
    type AccumulatorItem: CubeType;
    type SharedAccumulator: SharedAccumulator<Item = Self::AccumulatorItem>;

Show 18 methods // Required methods fn requirements(this: &Self) -> ReduceRequirements; fn from_config(config: Self::Config) -> Self; fn null_input(this: &Self, line_size: u32) -> Line<P::EI>; fn null_accumulator(this: &Self, line_size: u32) -> Self::AccumulatorItem; fn assign_accumulator( this: &Self, destination: &mut Self::AccumulatorItem, source: &Self::AccumulatorItem, ); fn reduce( this: &Self, accumulator: &Self::AccumulatorItem, item: Line<P::EI>, coordinate: ReduceCoordinate, use_planes: bool, ) -> Self::AccumulatorItem; fn fuse_accumulators( this: &Self, lhs: Self::AccumulatorItem, rhs: Self::AccumulatorItem, ) -> Self::AccumulatorItem; fn merge_line<Out: Numeric>( this: &Self, accumulator: Self::AccumulatorItem, shape_axis_reduce: u32, ) -> Out; fn to_output_perpendicular<Out: Numeric>( this: &Self, accumulator: Self::AccumulatorItem, shape_axis_reduce: u32, ) -> Line<Out>; fn __expand_requirements( scope: &mut Scope, this: <Self as CubeType>::ExpandType, ) -> <ReduceRequirements as CubeType>::ExpandType; fn __expand_from_config( scope: &mut Scope, config: Self::Config, ) -> <Self as CubeType>::ExpandType; fn __expand_null_input( scope: &mut Scope, this: <Self as CubeType>::ExpandType, line_size: u32, ) -> <Line<P::EI> as CubeType>::ExpandType; fn __expand_null_accumulator( scope: &mut Scope, this: <Self as CubeType>::ExpandType, line_size: u32, ) -> <Self::AccumulatorItem as CubeType>::ExpandType; fn __expand_assign_accumulator( scope: &mut Scope, this: <Self as CubeType>::ExpandType, destination: <Self::AccumulatorItem as CubeType>::ExpandType, source: <Self::AccumulatorItem as CubeType>::ExpandType, ) -> <() as CubeType>::ExpandType; fn __expand_reduce( scope: &mut Scope, this: <Self as CubeType>::ExpandType, accumulator: <Self::AccumulatorItem as CubeType>::ExpandType, item: <Line<P::EI> as CubeType>::ExpandType, coordinate: <ReduceCoordinate as CubeType>::ExpandType, use_planes: bool, ) -> <Self::AccumulatorItem as CubeType>::ExpandType; fn __expand_fuse_accumulators( scope: &mut Scope, this: <Self as CubeType>::ExpandType, lhs: <Self::AccumulatorItem as CubeType>::ExpandType, rhs: <Self::AccumulatorItem as CubeType>::ExpandType, ) -> <Self::AccumulatorItem as CubeType>::ExpandType; fn __expand_merge_line<Out: Numeric>( scope: &mut Scope, this: <Self as CubeType>::ExpandType, accumulator: <Self::AccumulatorItem as CubeType>::ExpandType, shape_axis_reduce: <u32 as CubeType>::ExpandType, ) -> <Out as CubeType>::ExpandType; fn __expand_to_output_perpendicular<Out: Numeric>( scope: &mut Scope, this: <Self as CubeType>::ExpandType, accumulator: <Self::AccumulatorItem as CubeType>::ExpandType, shape_axis_reduce: <u32 as CubeType>::ExpandType, ) -> <Line<Out> as CubeType>::ExpandType;
}
Expand description

An instruction for a reduce algorithm that works with Line.

See a provided implementation, such as Sum or ArgMax for an example how to implement this trait for a custom instruction.

A reduction works at three levels. First, it takes input data of type In and reduce them with their coordinate into an AccumulatorItem. Then, multiple AccumulatorItem are possibly fused together into a single accumulator that is converted to the expected output type.

Required Associated Types§

Source

type Config: CubeComptime + Send + Sync

Source

type AccumulatorItem: CubeType

The intermediate state into which we accumulate new input elements. This is most likely a Line<T> or a struct or tuple of lines.

Source

type SharedAccumulator: SharedAccumulator<Item = Self::AccumulatorItem>

When multiple agents are collaborating to reduce a single slice, we need a share accumulator to store multiple AccumulatorItem. This is most likely a SharedMemory<Line<T>> or a struct or tuple of lined shared memories.

Required Methods§

Source

fn requirements(this: &Self) -> ReduceRequirements

Requirements of the reduce.

Source

fn from_config(config: Self::Config) -> Self

Source

fn null_input(this: &Self, line_size: u32) -> Line<P::EI>

A input such that Self::reduce(accumulator, Self::null_input(), coordinate, use_planes) is guaranteed to return accumulator unchanged for any choice of coordinate.

Source

fn null_accumulator(this: &Self, line_size: u32) -> Self::AccumulatorItem

A accumulator such that Self::fuse_accumulators(accumulator, Self::null_accumulator() always returns is guaranteed to return accumulator unchanged.

Source

fn assign_accumulator( this: &Self, destination: &mut Self::AccumulatorItem, source: &Self::AccumulatorItem, )

Assign the value of source into destination. In spirit, this is equivalent to destination = source;, but this syntax is not currently supported by CubeCL.

Source

fn reduce( this: &Self, accumulator: &Self::AccumulatorItem, item: Line<P::EI>, coordinate: ReduceCoordinate, use_planes: bool, ) -> Self::AccumulatorItem

If use_planes is true, reduce all the item and coordinate within the accumulator. Else, reduce the given item and coordinate into the accumulator.

Source

fn fuse_accumulators( this: &Self, lhs: Self::AccumulatorItem, rhs: Self::AccumulatorItem, ) -> Self::AccumulatorItem

Reduce two accumulators into a single accumulator.

Source

fn merge_line<Out: Numeric>( this: &Self, accumulator: Self::AccumulatorItem, shape_axis_reduce: u32, ) -> Out

Reduce all elements of the accumulator into a single output element of type Out.

Source

fn to_output_perpendicular<Out: Numeric>( this: &Self, accumulator: Self::AccumulatorItem, shape_axis_reduce: u32, ) -> Line<Out>

Convert each element of the accumulator into the expected output element of type Out.

Source

fn __expand_requirements( scope: &mut Scope, this: <Self as CubeType>::ExpandType, ) -> <ReduceRequirements as CubeType>::ExpandType

Source

fn __expand_from_config( scope: &mut Scope, config: Self::Config, ) -> <Self as CubeType>::ExpandType

Source

fn __expand_null_input( scope: &mut Scope, this: <Self as CubeType>::ExpandType, line_size: u32, ) -> <Line<P::EI> as CubeType>::ExpandType

Source

fn __expand_null_accumulator( scope: &mut Scope, this: <Self as CubeType>::ExpandType, line_size: u32, ) -> <Self::AccumulatorItem as CubeType>::ExpandType

Source

fn __expand_assign_accumulator( scope: &mut Scope, this: <Self as CubeType>::ExpandType, destination: <Self::AccumulatorItem as CubeType>::ExpandType, source: <Self::AccumulatorItem as CubeType>::ExpandType, ) -> <() as CubeType>::ExpandType

Source

fn __expand_reduce( scope: &mut Scope, this: <Self as CubeType>::ExpandType, accumulator: <Self::AccumulatorItem as CubeType>::ExpandType, item: <Line<P::EI> as CubeType>::ExpandType, coordinate: <ReduceCoordinate as CubeType>::ExpandType, use_planes: bool, ) -> <Self::AccumulatorItem as CubeType>::ExpandType

Source

fn __expand_fuse_accumulators( scope: &mut Scope, this: <Self as CubeType>::ExpandType, lhs: <Self::AccumulatorItem as CubeType>::ExpandType, rhs: <Self::AccumulatorItem as CubeType>::ExpandType, ) -> <Self::AccumulatorItem as CubeType>::ExpandType

Source

fn __expand_merge_line<Out: Numeric>( scope: &mut Scope, this: <Self as CubeType>::ExpandType, accumulator: <Self::AccumulatorItem as CubeType>::ExpandType, shape_axis_reduce: <u32 as CubeType>::ExpandType, ) -> <Out as CubeType>::ExpandType

Source

fn __expand_to_output_perpendicular<Out: Numeric>( scope: &mut Scope, this: <Self as CubeType>::ExpandType, accumulator: <Self::AccumulatorItem as CubeType>::ExpandType, shape_axis_reduce: <u32 as CubeType>::ExpandType, ) -> <Line<Out> as CubeType>::ExpandType

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for ReduceFn

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for ArgMax

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for ArgMin

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for Max

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for MaxAbs

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for Mean

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for Min

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for Prod

Source§

impl<P: ReducePrecision> ReduceInstruction<P> for Sum