#[cutile::module]
mod kernels {
use cutile::core::*;
#[cutile::entry()]
pub fn quantize_f32_u8<const B: i32>(
out: &mut Tensor<u8, { [B] }>,
input: &Tensor<f32, { [-1] }>,
scale: f32,
zero_point: f32,
) {
let values: Tile<f32, { [B] }> = load_tile_like(input, out);
let raw = values / broadcast_scalar(scale, out.shape())
+ broadcast_scalar(zero_point, out.shape());
let low = constant(0.0f32, out.shape());
let high = constant(255.0f32, out.shape());
let clamped = min_tile(max_tile(raw, low), high);
let floored = floor(clamped);
let fraction = clamped - floored;
let half = constant(0.5f32, out.shape());
let one = constant(1.0f32, out.shape());
let two = constant(2.0f32, out.shape());
let floor_half = floor(floored / two);
let floor_is_odd = cmpf(
floor_half * two,
floored,
predicate::NotEqual,
cmp_ordering::Ordered,
);
let above_half = cmpf(
fraction,
half,
predicate::GreaterThan,
cmp_ordering::Ordered,
);
let tie = cmpf(fraction, half, predicate::Equal, cmp_ordering::Ordered);
let rounded_up = floored + one;
let rounded = select(above_half | (tie & floor_is_odd), rounded_up, floored);
let quantized: Tile<u8, { [B] }> = convert_tile(rounded);
out.store(quantized);
}
#[cutile::entry()]
pub fn quantize_f32_i8<const B: i32>(
out: &mut Tensor<i8, { [B] }>,
input: &Tensor<f32, { [-1] }>,
scale: f32,
zero_point: f32,
) {
let values: Tile<f32, { [B] }> = load_tile_like(input, out);
let raw = values / broadcast_scalar(scale, out.shape())
+ broadcast_scalar(zero_point, out.shape());
let low = constant(-128.0f32, out.shape());
let high = constant(127.0f32, out.shape());
let clamped = min_tile(max_tile(raw, low), high);
let floored = floor(clamped);
let fraction = clamped - floored;
let half = constant(0.5f32, out.shape());
let one = constant(1.0f32, out.shape());
let two = constant(2.0f32, out.shape());
let floor_half = floor(floored / two);
let floor_is_odd = cmpf(
floor_half * two,
floored,
predicate::NotEqual,
cmp_ordering::Ordered,
);
let above_half = cmpf(
fraction,
half,
predicate::GreaterThan,
cmp_ordering::Ordered,
);
let tie = cmpf(fraction, half, predicate::Equal, cmp_ordering::Ordered);
let rounded_up = floored + one;
let rounded = select(above_half | (tie & floor_is_odd), rounded_up, floored);
let quantized: Tile<i8, { [B] }> = convert_tile(rounded);
out.store(quantized);
}
}
pub use crate::cuda::cutile::kernel::f32::utility::dequantize_f8e4m3_f32_block;
pub use crate::cuda::cutile::kernel::f32::utility::dequantize_i8_f32;
pub use crate::cuda::cutile::kernel::f32::utility::dequantize_i8_f32_grouped;
pub use crate::cuda::cutile::kernel::f32::utility::dequantize_u8_f32;
pub use crate::cuda::cutile::kernel::f32::utility::dequantize_u8_f32_grouped;
pub use crate::cuda::cutile::kernel::f32::utility::matmul_f8e4m3_f8e4m3_block_scaled_bf16;
pub use crate::cuda::cutile::kernel::f32::utility::matmul_f8e4m3_f8e4m3_block_scaled_f16;
pub use crate::cuda::cutile::kernel::f32::utility::matmul_f8e4m3_f8e4m3_block_scaled_f32;
pub use crate::cuda::cutile::kernel::f32::utility::matmul_f32_i8_dequantize_f32;
pub use crate::cuda::cutile::kernel::f32::utility::matmul_i8_i8_f32;
pub use crate::cuda::cutile::kernel::f32::utility::per_token_group_quant_f8e4m3_f32;
pub use crate::cuda::cutile::kernel::f32::utility::per_token_group_quant_f8e4m3_f32_column_major_scales;
pub use crate::cuda::cutile::kernel::f32::utility::per_token_group_quant_f8e4m3_f32_column_major_ue8m0_scales;
pub use crate::cuda::cutile::kernel::f32::utility::per_token_group_quant_i8_f32;
pub use crate::cuda::cutile::kernel::f32::utility::per_token_group_quant_i8_f32_column_major_scales;
pub use crate::cuda::cutile::kernel::f32::utility::per_token_group_quant_i8_f32_column_major_ue8m0_scales;
pub use crate::cuda::cutile::kernel::f32::utility::qk_rope_quantize_f8e4m3_f32_interleaved_rope_only;
pub use crate::cuda::cutile::kernel::f32::utility::qk_rope_quantize_f8e4m3_f32_interleaved_single_kernel;
pub use crate::cuda::cutile::kernel::f32::utility::quantize_f32_f8e4m3_block;
pub use crate::cuda::cutile::kernel::f32::utility::quantize_f32_f8e4m3_scaled;
pub use crate::cuda::cutile::kernel::f32::utility::rope_quantize_f8e4m3_f32_interleaved;
pub use kernels::*;