use cubecl::prelude::*;
use cubecl::std::tensor::layout::linear::{LinearView, LinearViewMut};
use crate::scale::Scale;
pub(crate) fn split_levels<R: Runtime>(
scales: &[TensorBinding<R>],
) -> (TensorBinding<R>, Option<TensorBinding<R>>) {
(scales[0].clone(), scales.get(1).cloned())
}
#[derive(CubeType, Clone)]
#[expand(derive(Clone))]
pub struct GlobalScale {
value: ComptimeOption<f32>,
}
#[cube]
impl GlobalScale {
pub fn read(binding: ComptimeOption<LinearView<'_, f32>>) -> GlobalScale {
let value = #[comptime]
match binding {
ComptimeOption::Some(binding) => ComptimeOption::new_Some(binding.read(0)),
ComptimeOption::None => ComptimeOption::new_None(),
};
GlobalScale { value }
}
pub fn write(&self, out: ComptimeOption<LinearViewMut<'_, f32>>) {
#[comptime]
match out {
ComptimeOption::Some(mut out) => {
if ABSOLUTE_POS == 0 {
out.write(0, self.value.unwrap());
}
}
ComptimeOption::None => {}
}
}
pub fn at<FS: CubePrimitive>(&self, inner: FS) -> Scale<FS> {
Scale::<FS> {
inner,
global: self.value,
}
}
}