burn_cubecl/kernel/quantization/
quantize.rs1use crate::{ops::empty_qtensor_optimized, tensor::CubeTensor};
2use burn_backend::cubecl::dtype_to_elem_type;
3use burn_backend::{TensorMetadata, quantization::QuantScheme};
4
5pub fn quantize(
7 tensor: CubeTensor,
8 scheme: &QuantScheme,
9 scale: CubeTensor,
10 global: Option<CubeTensor>,
11) -> CubeTensor {
12 let output = empty_qtensor_optimized(tensor.shape(), *scheme, &tensor.device);
13 let (out_values, out_params) = output.clone().quantized_handles().unwrap();
14 let out_global = output.global();
15 let dtype = tensor.dtype;
16
17 let mut scales = vec![scale.binding()];
19 scales.extend(global.map(|global| global.binding()));
20
21 let mut out_scales = vec![out_params.binding()];
22 out_scales.extend(out_global.map(|global| global.binding()));
23
24 cubek::quantization::quantize::launch_ref(
25 &output.client,
26 tensor.binding(),
27 out_values.binding(),
28 &scales,
29 &out_scales,
30 scheme,
31 dtype_to_elem_type(dtype),
32 )
33 .expect("Kernel to never fail");
34
35 output
36}