metrale_model_layers/layers/ops/
gemm_dense_int8.rs1use anyhow::Result;
11use metrale_gpu_runtime::gpu::{DevicePtr, GpuBackend, KernelHandle};
12use metrale_gpu_runtime::kernel_args::{KernelLaunch, div_ceil};
13
14#[allow(clippy::too_many_arguments)]
21pub fn requant_w_nvfp4_int8(
22 gpu: &dyn GpuBackend,
23 kernel: KernelHandle,
24 w_packed: DevicePtr,
25 w_e4m3: DevicePtr,
26 scale2: f32,
27 w_i8: DevicePtr,
28 w_scale: DevicePtr,
29 n: u32,
30 k: u32,
31 stream: u64,
32) -> Result<()> {
33 let blocks = n * (k / 32);
34 KernelLaunch::new(gpu, kernel)
35 .grid([div_ceil(blocks, 128), 1, 1])
36 .block([128, 1, 1])
37 .arg_ptr(w_packed)
38 .arg_ptr(w_e4m3)
39 .arg_f32(scale2)
40 .arg_ptr(w_i8)
41 .arg_ptr(w_scale)
42 .arg_u32(n)
43 .arg_u32(k)
44 .launch(stream)
45}
46
47#[allow(clippy::too_many_arguments)]
56pub fn int8_gemm_faith2_prefill(
57 gpu: &dyn GpuBackend,
58 faith2_kernel: KernelHandle,
59 requant_a_kernel: KernelHandle,
60 a_bf16: DevicePtr,
61 w_i8: DevicePtr,
62 w_scale: DevicePtr,
63 a_i8_scratch: DevicePtr,
64 a_scale_scratch: DevicePtr,
65 out: DevicePtr,
66 m: u32,
67 n: u32,
68 k: u32,
69 stream: u64,
70) -> Result<()> {
71 let a_blocks = m * (k / 32);
72 KernelLaunch::new(gpu, requant_a_kernel)
73 .grid([div_ceil(a_blocks, 128), 1, 1])
74 .block([128, 1, 1])
75 .arg_ptr(a_bf16)
76 .arg_ptr(a_i8_scratch)
77 .arg_ptr(a_scale_scratch)
78 .arg_u32(m)
79 .arg_u32(k)
80 .launch(stream)?;
81 KernelLaunch::new(gpu, faith2_kernel)
82 .grid([div_ceil(n, 128), div_ceil(m, 128), 1])
83 .block([256, 1, 1])
84 .arg_ptr(a_i8_scratch)
85 .arg_ptr(w_i8)
86 .arg_ptr(a_scale_scratch)
87 .arg_ptr(w_scale)
88 .arg_ptr(out)
89 .arg_u32(m)
90 .arg_u32(n)
91 .arg_u32(k)
92 .launch(stream)
93}