use cubecl::prelude::*;
use crate::*;
#[derive(CubeType, CubeLaunch)]
pub struct TileArg<'a, E: Numeric, V: Size> {
pub tensor: &'a Tensor<Vector<E, V>>,
#[cube(comptime)]
pub spec: TileSpec,
}
#[cube]
impl<'a, E: Numeric, V: Size> TileArg<'a, E, V> {
pub fn tile(&self, #[comptime] space: Partitioning) -> Tile<E> {
GlobalOperand::<E>::tensor(
self.tensor,
comptime!(space.space().clone()),
comptime!(self.spec.clone()),
)
.tile(comptime!(space.levels().to_vec()))
}
pub fn tile_as<O: Numeric>(&self, #[comptime] space: Partitioning) -> Tile<O> {
GlobalOperand::<O>::stored(
self.tensor,
comptime!(space.space().clone()),
comptime!(self.spec.clone()),
)
.tile(comptime!(space.levels().to_vec()))
}
pub fn tile_gathered(
&self,
#[comptime] space: Partitioning,
coefficients: Coords<u32>,
offsets: Coords<i32>,
) -> Tile<E> {
GlobalOperand::<E>::gathered(
self.tensor,
comptime!(space.space().clone()),
comptime!(self.spec.clone()),
coefficients,
offsets,
)
.tile(comptime!(space.levels().to_vec()))
}
}