use cubecl::prelude::*;
use crate::{AccumulateArg, AccumulateArgLaunch, Bound, Partitioning, Tile, TileArg};
#[derive(CubeType, CubeLaunch)]
pub enum Output<'a, E: Numeric> {
Tensor(TileArg<'a>),
Atomic(AccumulateArg<'a, E>),
}
#[cube]
impl<'a, E: Numeric> Output<'a, E> {
pub fn tile(&self, partitioning: &Partitioning) -> Tile {
match self {
Output::Tensor(arg) => arg.tile(partitioning),
Output::Atomic(arg) => arg.tile(partitioning),
}
}
}
impl Bound {
pub fn output<E: Numeric>(self) -> OutputArgs<'static, E> {
OutputArgs::Tensor(self.arg())
}
pub fn atomic<E: Numeric>(self) -> OutputArgs<'static, E> {
let (spec, width) = (self.spec.clone(), self.vector_size);
OutputArgs::Atomic(AccumulateArgLaunch::new(self.tensor(), width, spec))
}
}