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§
type Config: CubeComptime + Send + Sync
Sourcetype AccumulatorItem: CubeType
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.
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§
Sourcefn requirements(this: &Self) -> ReduceRequirements
fn requirements(this: &Self) -> ReduceRequirements
Requirements of the reduce.
fn from_config(config: Self::Config) -> Self
Sourcefn null_input(this: &Self, line_size: u32) -> Line<P::EI>
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
.
Sourcefn null_accumulator(this: &Self, line_size: u32) -> Self::AccumulatorItem
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.
Sourcefn assign_accumulator(
this: &Self,
destination: &mut Self::AccumulatorItem,
source: &Self::AccumulatorItem,
)
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.
Sourcefn reduce(
this: &Self,
accumulator: &Self::AccumulatorItem,
item: Line<P::EI>,
coordinate: ReduceCoordinate,
use_planes: bool,
) -> Self::AccumulatorItem
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.
Sourcefn fuse_accumulators(
this: &Self,
lhs: Self::AccumulatorItem,
rhs: Self::AccumulatorItem,
) -> Self::AccumulatorItem
fn fuse_accumulators( this: &Self, lhs: Self::AccumulatorItem, rhs: Self::AccumulatorItem, ) -> Self::AccumulatorItem
Reduce two accumulators into a single accumulator.
Sourcefn merge_line<Out: Numeric>(
this: &Self,
accumulator: Self::AccumulatorItem,
shape_axis_reduce: u32,
) -> Out
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
.
Sourcefn to_output_perpendicular<Out: Numeric>(
this: &Self,
accumulator: Self::AccumulatorItem,
shape_axis_reduce: u32,
) -> Line<Out>
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
.
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
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.