1use super::*;
6
7impl Qwen3SsmLayer {
8 pub fn new(
9 input_norm: DenseWeight,
10 ssm: SsmWeights,
11 post_attn_norm: DenseWeight,
12 ffn: FfnComponent,
13 qkvz_nvfp4: Option<QuantizedWeight>,
14 config: &avarok_core::config::ModelConfig,
15 gpu: &dyn GpuBackend,
16 ) -> Result<Self> {
17 let nv = config.linear_num_value_heads;
18 let vd = config.linear_value_head_dim;
19 let nk = config.linear_num_key_heads;
20 let kd = config.linear_key_head_dim;
21 let d_conv = config.linear_conv_kernel_dim;
22
23 let conv_dim = nk * kd * 2 + nv * vd;
25
26 let gdn_tc_spine = gdn_prefill_tc_kernel(gpu);
31 let woa = super::woa::woa_kernels(gpu);
32
33 Ok(Self {
34 hc: None,
39 ple: None,
40 hc_pre_k: hc_kernel(config, gpu, "hc_pre"),
41 hc_post_k: hc_kernel(config, gpu, "hc_post"),
42 hc_expand_k: hc_kernel(config, gpu, "hc_expand"),
43 input_norm,
44 ssm,
45 post_attn_norm,
46 ffn,
47 lora_out_proj: None,
48 qkvz_nvfp4,
49 qkvz_nvfp4_t: None,
50 out_proj_nvfp4_t: None,
51 out_proj_dense: None,
52 qkvz_fp8w: None,
53 out_proj_fp8w: None,
54 qkvz_fp8w_rowwise: None,
55 out_proj_fp8w_rowwise: None,
56 qkvz_rowwise_bf16: std::sync::atomic::AtomicU64::new(0),
57 out_proj_rowwise_bf16: std::sync::atomic::AtomicU64::new(0),
58 qkvz_q2: None,
59 q2_0_gemv_k: super::super::try_kernel(gpu, "q2_0_gemv_vec", "q2_0_gemv_vec"),
60 dequant_q2_0_gn_k: super::super::try_kernel(
61 gpu,
62 "dequant_gguf_bf16",
63 "dequant_q2_0_gn_to_bf16",
64 ),
65 q2_0_mmq_nc_k: KernelHandle(0),
70 q2_0_mmq_wc_k: KernelHandle(0),
71 q4k_quant_act_k: KernelHandle(0),
72 sequential_qkvz: false,
73 sm_count: gpu.sm_count()?,
77 rms_norm_residual_k: gpu.kernel("norm", "rms_norm_residual")?,
78 gated_rms_norm_k: if config.gdn_norm_sigmoid {
82 gpu.kernel("gated_norm_sigmoid", "gated_rms_norm_sigmoid")?
83 } else {
84 gpu.kernel("norm", "gated_rms_norm")?
85 },
86 gated_rms_norm_f32_k: if config.gdn_norm_sigmoid {
87 super::super::try_kernel(
88 gpu,
89 "gated_norm_sigmoid",
90 "gated_rms_norm_f32_input_sigmoid",
91 )
92 } else {
93 super::super::try_kernel(gpu, "norm", "gated_rms_norm_f32_input")
94 },
95 gated_rms_norm_f32_strided_k: if config.gdn_norm_sigmoid {
99 KernelHandle(0)
100 } else {
101 super::super::try_kernel(gpu, "norm", "gated_rms_norm_f32_input_strided")
102 },
103 dense_gemv_k: gpu.kernel("gemv", "dense_gemv_bf16")?,
104 dense_gemv_batch2_k: gpu.kernel("dense_gemv_bf16_batch2", "dense_gemv_bf16_batch2")?,
105 w4a16_gemv_k: gpu.kernel("w4a16_gemv", "w4a16_gemv")?,
106 w4a16_gemv_sw_k: super::super::try_kernel(gpu, "w4a16_gemv", "w4a16_gemv_sw"),
107 w8a16_gemv_k: gpu.kernel("w8a16_gemv", "w8a16_gemv")?,
108 w4a16_gemv_qkvz_k: gpu.kernel("w4a16_gemv", "w4a16_gemv_qkvz")?,
109 deinterleave_k: gpu.kernel("ssm_preprocess", "deinterleave_qkvz")?,
110 conv1d_k: gpu.kernel("causal_conv1d", "causal_conv1d_update")?,
111 conv1d_l2norm_k: gpu.kernel("causal_conv1d", "causal_conv1d_update_l2norm")?,
112 conv1d_l2norm_f32_strided_k: super::super::try_kernel(
123 gpu,
124 "causal_conv1d",
125 "causal_conv1d_update_l2norm_f32_strided",
126 ),
127 conv1d_l2norm_f32_k: {
128 let h = super::super::try_kernel(
129 gpu,
130 "causal_conv1d",
131 "causal_conv1d_update_l2norm_f32",
132 );
133 if h.0 == 0 {
134 tracing::warn!(
135 "FP32 conv1d kernel not loaded; SSM uses BF16 conv \
136 output. Expect long-context coherence drift past ~8k \
137 tokens on this backend."
138 );
139 }
140 h
141 },
142 gdn_k: gpu.kernel("gated_delta_rule", "gated_delta_rule_decode")?,
143 gdn_f32_k: super::super::try_kernel(
144 gpu,
145 "gated_delta_rule",
146 "gated_delta_rule_decode_f32",
147 ),
148 gdn_f32_norm_k: super::super::try_kernel(
149 gpu,
150 "gated_delta_rule",
151 "gated_delta_rule_decode_f32_norm",
152 ),
153 gdn_f32_conv_norm_k: super::super::try_kernel(
154 gpu,
155 "gated_delta_rule",
156 "gated_delta_rule_decode_f32_conv_norm",
157 ),
158 gdn_f32_strided_k: super::super::try_kernel(
159 gpu,
160 "gated_delta_rule",
161 "gated_delta_rule_decode_f32_strided",
162 ),
163 gdn_f32_strided_norm_k: super::super::try_kernel(
164 gpu,
165 "gated_delta_rule",
166 "gated_delta_rule_decode_f32_strided_norm",
167 ),
168 gdn_f32_strided_norm_half_k: super::super::try_kernel(
169 gpu,
170 "gated_delta_rule",
171 "gated_delta_rule_decode_f32_strided_norm_half",
172 ),
173 gdn_f32_strided_norm_smem_k: super::super::try_kernel(
174 gpu,
175 "gated_delta_rule",
176 "gated_delta_rule_decode_f32_strided_norm_smem",
177 ),
178 gdn_f16_strided_norm_half_k: super::super::try_kernel(
179 gpu,
180 "gated_delta_rule",
181 "gated_delta_rule_decode_f16_strided_norm_half",
182 ),
183 gdn_f16_norm_k: super::super::try_kernel(
184 gpu,
185 "gated_delta_rule",
186 "gated_delta_rule_decode_f16_norm",
187 ),
188 ssm_h_f16_to_f32_k: super::super::try_kernel(
189 gpu,
190 "ssm_h_dtype",
191 "ssm_h_state_f16_to_f32",
192 ),
193 ssm_h_f32_to_f16_k: super::super::try_kernel(
194 gpu,
195 "ssm_h_dtype",
196 "ssm_h_state_f32_to_f16",
197 ),
198 ba_gates_k: gpu.kernel("ssm_preprocess", "dense_gemv_ba_gates")?,
199 residual_add_k: gpu.kernel("residual_add", "bf16_residual_add")?,
200 l2_norm_k: gpu.kernel("norm", "l2_norm_bf16")?,
201 residual_add_rms_norm_k: gpu.kernel("norm", "residual_add_rms_norm")?,
202 residual_add_rms_norm_gatef32_k: crate::layers::try_kernel(
203 gpu,
204 "norm",
205 "residual_add_rms_norm_gatef32",
206 ),
207 gated_rms_norm_prefill_k: if config.gdn_norm_sigmoid {
208 gpu.kernel("gated_norm_sigmoid", "gated_rms_norm_prefill_sigmoid")?
209 } else {
210 gpu.kernel("norm", "gated_rms_norm_prefill")?
211 },
212 w4a16_gemm_k: gpu.kernel("w4a16", "w4a16_gemm")?,
213 w4a16_gemm_t_k: crate::layers::tgemm_kernel(gpu),
214 w4a16_gemm_t_k64_k: crate::layers::k64_kernel(gpu)?,
215 w4a16_gemm_t_k64_n64_k: crate::layers::k64_n64_kernel(gpu),
216 w4a16_gemm_t_m128_k: gpu.kernel("w4a16", "w4a16_gemm_t_m128")?,
217 w4a16_gemm_t_m128_v2_k: super::super::w4a16_v2_kernel(gpu),
219 w4a16_gemv_batch2_k: gpu.kernel("w4a16_gemv", "w4a16_gemv_batch2")?,
220 dense_gemm_k: gpu.kernel("gemm", "dense_gemm_bf16")?,
221 dense_gemm_pipelined_k: super::super::try_kernel(
224 gpu,
225 "gemm",
226 "dense_gemm_bf16_pipelined",
227 ),
228 gdn_prefill_k: gpu.kernel("gated_delta_rule", "gated_delta_rule_prefill")?,
229 gdn_prefill_split_k: gpu
230 .kernel("gated_delta_rule", "gated_delta_rule_prefill_split")?,
231 gdn_prefill_split4_k: gpu
232 .kernel("gated_delta_rule", "gated_delta_rule_prefill_split4")?,
233 gdn_prefill_persistent_k: super::super::try_kernel(
234 gpu,
235 "gated_delta_rule_persistent",
236 "gated_delta_rule_prefill_persistent",
237 ),
238 gdn_prefill_persistent_wy4_k: super::super::try_kernel(
239 gpu,
240 "gated_delta_rule_persistent",
241 "gated_delta_rule_prefill_persistent_wy4",
242 ),
243 gdn_prefill_regresident_k: super::super::try_kernel(
244 gpu,
245 "gated_delta_rule_regresident",
246 "gated_delta_rule_prefill_regresident",
247 ),
248 gdn_prefill_fla_recompute_wu_k: super::super::try_kernel(
249 gpu,
250 "gated_delta_rule_fla",
251 "gated_delta_rule_recompute_wu",
252 ),
253 gdn_prefill_fla_recompute_wu_hopper_k: init_kernels::prefill_wu_hopper_k(gpu),
254 gdn_prefill_fla_chunk_fwd_o_hopper_k: init_kernels::prefill_fwd_o_hopper_k(gpu),
255 gdn_prefill_fla_chunk_delta_h_k: super::super::try_kernel(
256 gpu,
257 "gated_delta_rule_fla",
258 "gated_delta_rule_chunk_delta_h_ksplit",
259 ),
260 gdn_prefill_fla_chunk_delta_h_tc_vblock_k: super::super::try_kernel(
261 gpu,
262 "gated_delta_rule_fla",
263 "gated_delta_rule_chunk_delta_h_tc_vblock",
264 ),
265 gdn_prefill_fla_chunk_delta_h_tcfuse_k: gdn_tc_spine,
266 gdn_prefill_fla_chunk_delta_h_fused_k: fused_spine_kernel(gpu, gdn_tc_spine),
270 gdn_prefill_fla_chunk_delta_h_tma_k: super::super::try_kernel(
271 gpu,
272 "gated_delta_rule_fla",
273 "gated_delta_rule_chunk_delta_h_tma",
274 ),
275 gdn_prefill_fla_chunk_fwd_o_k: super::super::try_kernel(
276 gpu,
277 "gated_delta_rule_fla",
278 "gated_delta_rule_chunk_fwd_o",
279 ),
280 gdn_prefill_wy32_k: super::super::try_kernel(
281 gpu,
282 "gated_delta_rule_wy64_prefill",
283 "gated_delta_rule_prefill_wy64",
284 ),
285 gdn_prefill_wy32_batched_k: super::super::try_kernel(
287 gpu,
288 "gated_delta_rule_wy64_prefill",
289 "gated_delta_rule_prefill_wy64_batched",
290 ),
291 gdn_prefill_persistent_batched_k: super::super::try_kernel(
292 gpu,
293 "gated_delta_rule_persistent",
294 "gated_delta_rule_prefill_persistent_batched",
295 ),
296 gdn_prefill_persistent_wy4_batched_k: super::super::try_kernel(
297 gpu,
298 "gated_delta_rule_persistent",
299 "gated_delta_rule_prefill_persistent_wy4_batched",
300 ),
301 gdn_prefill_split4_batched_k: super::super::try_kernel(
302 gpu,
303 "gated_delta_rule",
304 "gated_delta_rule_prefill_split4_batched",
305 ),
306 compute_gdn_gates_k: gpu.kernel("ssm_preprocess", "compute_gdn_gates")?,
307 ba_gates_prefill_k: gpu.kernel("ssm_preprocess", "dense_gemm_ba_gates_prefill")?,
308 ba_gates_prefill_hopper_k: init_kernels::ba_gates_hopper_k(gpu),
309 conv1d_prefill_k: gpu.kernel("causal_conv1d", "causal_conv1d_update_prefill")?,
310 conv1d_prefill_tp_k: super::super::try_kernel(
311 gpu,
312 "causal_conv1d",
313 "causal_conv1d_update_prefill_tp",
314 ),
315 gdn_chunk2_k: gpu.kernel("gated_delta_rule", "gated_delta_rule_chunk2")?,
316 conv1d_chunk2_k: gpu.kernel("causal_conv1d", "causal_conv1d_update_chunk2")?,
317 gdn_chunk3_k: gpu.kernel("gated_delta_rule", "gated_delta_rule_chunk3")?,
318 w4a16_gemv_batch3_k: gpu.kernel("w4a16_gemv", "w4a16_gemv_batch3")?,
319 gdn_wy2_k: gpu.kernel("gated_delta_rule_wy", "gated_delta_rule_wy2")?,
320 gdn_wy2_resident_k: super::super::try_kernel(
325 gpu,
326 "gated_delta_rule_wy2_resident",
327 "gated_delta_rule_wy2_resident",
328 ),
329 gdn_wy3_k: gpu.kernel("gated_delta_rule_wy3", "gated_delta_rule_wy3")?,
330 gdn_wy3_resident_k: super::super::try_kernel(
334 gpu,
335 "gated_delta_rule_wy3_resident",
336 "gated_delta_rule_wy3_resident",
337 ),
338 gdn_wy4_k: gpu.kernel("gated_delta_rule_wy4", "gated_delta_rule_wy4")?,
339 gdn_wy4_woa_k: woa.woa_k,
340 gdn_wy4_fold_k: woa.fold_k,
341 gdn_wy4_clear_k: woa.clear_k,
342 woa_flag: std::sync::atomic::AtomicU64::new(0),
344 woa_stash: std::sync::atomic::AtomicU64::new(0),
345 woa_seqs: std::sync::atomic::AtomicUsize::new(0),
346 woa_dims: [nk, nv, kd, vd],
347 gdn_wy2_f16_k: super::super::try_kernel(
357 gpu,
358 "gated_delta_rule_wy_f16",
359 "gated_delta_rule_wy2_f16",
360 ),
361 gdn_wy2_resident_f16_k: super::super::try_kernel(
362 gpu,
363 "gated_delta_rule_wy2_resident_f16",
364 "gated_delta_rule_wy2_resident_f16",
365 ),
366 gdn_wy3_f16_k: super::super::try_kernel(
367 gpu,
368 "gated_delta_rule_wy3_f16",
369 "gated_delta_rule_wy3_f16",
370 ),
371 gdn_wy3_resident_f16_k: super::super::try_kernel(
372 gpu,
373 "gated_delta_rule_wy3_resident_f16",
374 "gated_delta_rule_wy3_resident_f16",
375 ),
376 gdn_wy4_f16_k: super::super::try_kernel(
377 gpu,
378 "gated_delta_rule_wy4_f16",
379 "gated_delta_rule_wy4_f16",
380 ),
381 gdn_verify_fused_conv_k2_k: super::super::try_kernel(
386 gpu,
387 "gdn_verify_fused_k2",
388 "gdn_verify_fused_conv_k2",
389 ),
390 gdn_verify_fused_norm_k2_k: super::super::try_kernel(
391 gpu,
392 "gdn_verify_fused_k2",
393 "gdn_verify_fused_norm_k2",
394 ),
395 gdn_verify_fused_conv_kn_k: super::super::try_kernel(
399 gpu,
400 "gdn_verify_fused_conv_kn",
401 "gdn_verify_fused_conv_kn",
402 ),
403 gdn_verify_fused_conv_kn_batched_k: super::super::try_kernel(
405 gpu,
406 "gdn_verify_fused_conv_kn",
407 "gdn_verify_fused_conv_kn_batched",
408 ),
409 gdn_f32_norm_snap_k: super::super::try_kernel(
415 gpu,
416 "gated_delta_rule_snap",
417 "gated_delta_rule_decode_f32_norm_snap",
418 ),
419 gdn_f32_strided_norm_snap_k: super::super::try_kernel(
420 gpu,
421 "gated_delta_rule_snap",
422 "gated_delta_rule_decode_f32_strided_norm_snap",
423 ),
424 gdn_verify_fused_conv_kn_f32_k: super::super::try_kernel(
425 gpu,
426 "gdn_verify_fused_conv_kn_f32",
427 "gdn_verify_fused_conv_kn_f32",
428 ),
429 gdn_wy17_k: super::super::try_kernel(
433 gpu,
434 "gated_delta_rule_wy17",
435 "gated_delta_rule_wy17",
436 ),
437 gdn_wyn_k: init_kernels::wyn_kernels(gpu),
438 gdn_wyn_f16_k: init_kernels::wyn_f16_kernels(gpu),
439 gdn_wyn_table_k: init_kernels::wyn_table_kernels(gpu),
441 gdn_wyn_f16_table_k: init_kernels::wyn_f16_table_kernels(gpu),
442 h_state_bytes: nv * vd * kd * 4, conv_state_bytes: conv_dim * d_conv * 4, qkvz_fp8: None,
445 out_proj_fp8: None,
446 fp8_gemm_k: gpu.kernel("w4a16", "fp8_gemm_t")?,
447 fp8_gemm_t_m128_k: gpu.kernel("w4a16", "fp8_gemm_t_m128")?,
448 w8a16_gemm_k: super::super::try_kernel(gpu, "w8a16_gemm", "w8a16_gemm"),
449 w8a16_gemm_pipelined_k: super::super::try_kernel(
450 gpu,
451 "w8a16_gemm_pipelined",
452 "w8a16_gemm_pipelined",
453 ),
454 w8a16_gemv_batch4_k: super::super::try_kernel(
455 gpu,
456 "w8a16_gemv_batch4",
457 "w8a16_gemv_batch4",
458 ),
459 w8a16_gemv_batch16_k: super::super::try_kernel(
460 gpu,
461 "w8a16_gemv_batch4",
462 "w8a16_gemv_batch16",
463 ),
464 w4a16_batchm: crate::layers::w4a16_gemv_tiers::W4a16BatchmTiers::resolve(gpu),
466 w4a16_gemv_batch16_k: super::super::try_kernel(gpu, "w4a16_gemv", "w4a16_gemv_batch16"),
467 w8a16_gemm_t_k: super::super::try_kernel(gpu, "w8a16_gemm_t", "w8a16_gemm_t"),
468 per_token_group_quant_fp8_k: ops::Fp8ActQuant::resolve(gpu),
469 fp8_gemm_t_blockscaled_k: super::super::try_kernel(
470 gpu,
471 "fp8_gemm_t_blockscaled",
472 "fp8_gemm_t_blockscaled",
473 ),
474 fp8_act_scale_kmajor_k: super::super::try_kernel(
475 gpu,
476 "fp8_scale_transpose",
477 "fp8_act_scale_to_kmajor",
478 ),
479 })
480 }
481
482 }
484
485#[path = "init_kernels.rs"]
486mod init_kernels;
487use init_kernels::{fused_spine_kernel, gdn_prefill_tc_kernel, hc_kernel};
488
489#[path = "init_sequential.rs"]
490mod init_sequential;