metrale_gpu_runtime/buffers/
accessors.rs1use super::{BufferArena, sizes::BufferSizes};
13use crate::gpu::{DevicePtr, GpuBackend};
14
15impl BufferArena {
16 pub fn hidden_states(&self) -> DevicePtr {
17 self.hidden_states
18 }
19 pub fn residual(&self) -> DevicePtr {
20 self.residual
21 }
22 pub fn norm_output(&self) -> DevicePtr {
23 self.norm_output
24 }
25 pub fn norm_output_bytes(&self) -> usize {
29 self.sizes.norm_output
30 }
31 pub fn qkv_output(&self) -> DevicePtr {
32 self.qkv_output
33 }
34 pub fn qkv_output_bytes(&self) -> usize {
38 self.sizes.qkv_output
39 }
40 pub fn attn_output(&self) -> DevicePtr {
41 self.attn_output
42 }
43 pub fn gate_logits(&self) -> DevicePtr {
44 self.gate_logits
45 }
46 pub fn gate_logits_f32(&self) -> DevicePtr {
47 self.gate_logits_f32
48 }
49 pub fn moe_router_in_f32(&self) -> DevicePtr {
50 self.moe_router_in_f32
51 }
52 pub fn moe_output(&self) -> DevicePtr {
53 self.moe_output
54 }
55 pub fn logits(&self) -> DevicePtr {
56 self.logits
57 }
58 pub fn ssm_qkvz(&self) -> DevicePtr {
59 self.ssm_qkvz
60 }
61 pub fn ssm_qkvz_bytes(&self) -> usize {
65 self.sizes.ssm_qkvz
66 }
67 pub fn ssm_ba(&self) -> DevicePtr {
68 self.ssm_ba
69 }
70 pub fn ssm_deinterleaved(&self) -> DevicePtr {
72 self.ssm_deinterleaved
73 }
74 pub fn ssm_deinterleaved_bytes(&self) -> usize {
77 self.sizes.ssm_deinterleaved
78 }
79 pub fn ssm_gates(&self) -> DevicePtr {
82 self.ssm_gates
83 }
84 pub fn ssm_conv_out_f32(&self) -> DevicePtr {
86 self.ssm_conv_out_f32
87 }
88 pub fn scratch(&self) -> DevicePtr {
90 self.scratch
91 }
92 pub fn ssd_scratch(&self) -> DevicePtr {
94 self.ssd_scratch
95 }
96 pub fn token_ids(&self) -> DevicePtr {
100 self.token_ids
101 }
102 pub fn scratch_bytes(&self) -> usize {
104 self.sizes.scratch
105 }
106 pub fn expert_gate_out(&self) -> DevicePtr {
107 self.expert_gate_out
108 }
109 pub fn expert_up_out(&self) -> DevicePtr {
110 self.expert_up_out
111 }
112 pub fn expert_gate_out_bytes(&self) -> usize {
115 debug_assert_eq!(self.sizes.expert_gate_out, self.sizes.expert_up_out);
116 self.sizes.expert_gate_out
117 }
118 pub fn moe_output_bytes(&self) -> usize {
119 self.sizes.moe_output
120 }
121 pub fn expert_down_out(&self) -> DevicePtr {
122 self.expert_down_out
123 }
124 pub fn expert_down_out_bytes(&self) -> usize {
125 self.sizes.expert_down_out
126 }
127 pub fn gate_logits_bytes(&self) -> usize {
128 self.sizes.gate_logits
129 }
130 pub fn logits_bytes(&self) -> usize {
131 self.sizes.logits
132 }
133 pub fn attn_output_bytes(&self) -> usize {
134 self.sizes.attn_output
135 }
136 pub fn gdn_fla_scratch(&self) -> DevicePtr {
139 self.gdn_fla_scratch
140 }
141 pub fn ffn_act_q8(&self) -> DevicePtr {
143 self.ffn_act_q8
144 }
145 pub fn ffn_act_a(&self) -> DevicePtr {
147 self.ffn_act_a
148 }
149 pub fn ffn_act_scale(&self) -> DevicePtr {
151 self.ffn_act_scale
152 }
153 pub fn ffn_gate_up_fused(&self) -> DevicePtr {
157 self.ffn_gate_up_fused
158 }
159 pub fn ffn_gate_up_fused_bytes(&self) -> usize {
162 self.sizes.ffn_gate_up_fused
163 }
164 pub fn ffn_act_a_bytes(&self) -> usize {
165 self.sizes.ffn_act_a
166 }
167 pub fn ffn_act_scale_bytes(&self) -> usize {
168 self.sizes.ffn_act_scale
169 }
170 pub fn ffn_act_scale_kmajor(&self) -> DevicePtr {
173 self.ffn_act_scale_kmajor
174 }
175 pub fn ffn_act_scale_kmajor_bytes(&self) -> usize {
176 self.sizes.ffn_act_scale_kmajor
177 }
178 pub fn fp8_act(&self) -> DevicePtr {
180 self.fp8_act
181 }
182 pub fn fp8_act_bytes(&self) -> usize {
183 self.sizes.fp8_act
184 }
185 pub fn fp8_act_scale(&self) -> DevicePtr {
187 self.fp8_act_scale
188 }
189 pub fn fp8_act_scale_bytes(&self) -> usize {
190 self.sizes.fp8_act_scale
191 }
192 pub fn fp8_act_scale_kmajor(&self) -> DevicePtr {
195 self.fp8_act_scale_kmajor
196 }
197 pub fn fp8_act_scale_kmajor_bytes(&self) -> usize {
198 self.sizes.fp8_act_scale_kmajor
199 }
200 pub fn q2_dequant_scratch(&self) -> DevicePtr {
203 self.q2_dequant_scratch
204 }
205 pub fn q2_dequant_scratch_bytes(&self) -> usize {
206 self.sizes.q2_dequant_scratch
207 }
208 pub fn q2_act_q8(&self) -> DevicePtr {
211 self.q2_act_q8
212 }
213 pub fn q2_act_q8_bytes(&self) -> usize {
214 self.sizes.q2_act_q8
215 }
216 pub fn splitk_workspace(&self) -> DevicePtr {
217 self.splitk_workspace
218 }
219 pub fn o_latent(&self) -> DevicePtr {
221 self.o_latent
222 }
223 pub fn norm_unit_w(&self) -> DevicePtr {
225 self.norm_unit_w
226 }
227 pub fn hc_streams(&self) -> DevicePtr {
229 self.hc_streams
230 }
231
232 pub fn hc_lowrank_scratch(&self) -> DevicePtr {
235 self.hc_lowrank_scratch
236 }
237 pub fn qsa_select_scratch(&self) -> DevicePtr {
240 self.qsa_select_scratch
241 }
242 pub fn hc_post(&self) -> DevicePtr {
244 self.hc_post
245 }
246 pub fn hc_comb(&self) -> DevicePtr {
248 self.hc_comb
249 }
250 pub fn max_batch_tokens(&self) -> usize {
251 self.max_batch_tokens
252 }
253 pub fn decode_meta(&self) -> super::DecodeMetaLayout {
255 self.decode_meta
256 }
257 pub fn sizes(&self) -> &BufferSizes {
258 &self.sizes
259 }
260
261 pub fn lora_xa(&self) -> DevicePtr {
264 self.lora_xa
265 }
266 pub fn lora_xa_bytes(&self) -> usize {
267 self.sizes.lora_xa
268 }
269 pub fn lora_delta(&self) -> DevicePtr {
272 self.lora_delta
273 }
274 pub fn lora_delta_bytes(&self) -> usize {
275 self.sizes.lora_delta
276 }
277 pub fn lora_hact(&self) -> DevicePtr {
280 self.lora_hact
281 }
282 pub fn lora_hact_bytes(&self) -> usize {
283 self.sizes.lora_hact
284 }
285 pub fn lora_seq_slot(&self) -> DevicePtr {
288 self.lora_seq_slot
289 }
290
291 pub fn zero_prefill_essentials(&self, gpu: &dyn GpuBackend, stream: u64) -> anyhow::Result<()> {
296 gpu.memset_async(self.hidden_states, 0, self.sizes.hidden_states, stream)?;
297 gpu.memset_async(self.residual, 0, self.sizes.residual, stream)?;
298 gpu.memset_async(self.gate_logits, 0, self.sizes.gate_logits, stream)?;
299 gpu.memset_async(self.expert_gate_out, 0, self.sizes.expert_gate_out, stream)?;
300 gpu.memset_async(self.expert_up_out, 0, self.sizes.expert_up_out, stream)?;
301 gpu.memset_async(self.expert_down_out, 0, self.sizes.expert_down_out, stream)?;
302 gpu.memset_async(self.moe_output, 0, self.sizes.moe_output, stream)?;
303 Ok(())
304 }
305
306 pub fn zero_all_rows(
315 &self,
316 gpu: &dyn GpuBackend,
317 stream: u64,
318 tokens: usize,
319 ) -> anyhow::Result<()> {
320 let m = self.max_batch_tokens.max(1);
321 let head = |n: usize| {
322 if tokens >= m || m == 0 || !n.is_multiple_of(m) {
323 n
324 } else {
325 n / m * tokens
326 }
327 };
328 for (ptr, n) in [
329 (self.hidden_states, self.sizes.hidden_states),
330 (self.residual, self.sizes.residual),
331 (self.norm_output, self.sizes.norm_output),
332 (self.qkv_output, self.sizes.qkv_output),
333 (self.attn_output, self.sizes.attn_output),
334 (self.gate_logits, self.sizes.gate_logits),
335 (self.moe_output, self.sizes.moe_output),
336 (self.ssm_qkvz, self.sizes.ssm_qkvz),
337 (self.ssm_ba, self.sizes.ssm_ba),
338 (self.ssm_deinterleaved, self.sizes.ssm_deinterleaved),
339 (self.ssm_gates, self.sizes.ssm_gates),
340 (self.ssm_conv_out_f32, self.sizes.ssm_conv_out_f32),
341 (self.expert_gate_out, self.sizes.expert_gate_out),
342 (self.expert_up_out, self.sizes.expert_up_out),
343 (self.expert_down_out, self.sizes.expert_down_out),
344 ] {
345 gpu.memset_async(ptr, 0, head(n), stream)?;
346 }
347 gpu.memset_async(
348 self.splitk_workspace,
349 0,
350 self.sizes.splitk_workspace,
351 stream,
352 )?;
353 gpu.memset_async(self.logits, 0, self.sizes.logits, stream)?;
354 gpu.memset_async(self.scratch, 0, self.sizes.scratch, stream)?;
355 Ok(())
356 }
357
358 pub fn zero_all(&self, gpu: &dyn GpuBackend, stream: u64) -> anyhow::Result<()> {
364 gpu.memset_async(self.hidden_states, 0, self.sizes.hidden_states, stream)?;
365 gpu.memset_async(self.residual, 0, self.sizes.residual, stream)?;
366 gpu.memset_async(self.norm_output, 0, self.sizes.norm_output, stream)?;
367 gpu.memset_async(self.qkv_output, 0, self.sizes.qkv_output, stream)?;
368 gpu.memset_async(self.attn_output, 0, self.sizes.attn_output, stream)?;
369 gpu.memset_async(self.gate_logits, 0, self.sizes.gate_logits, stream)?;
370 gpu.memset_async(self.moe_output, 0, self.sizes.moe_output, stream)?;
371 gpu.memset_async(self.ssm_qkvz, 0, self.sizes.ssm_qkvz, stream)?;
372 gpu.memset_async(self.ssm_ba, 0, self.sizes.ssm_ba, stream)?;
373 gpu.memset_async(
374 self.ssm_deinterleaved,
375 0,
376 self.sizes.ssm_deinterleaved,
377 stream,
378 )?;
379 gpu.memset_async(self.ssm_gates, 0, self.sizes.ssm_gates, stream)?;
380 gpu.memset_async(
381 self.ssm_conv_out_f32,
382 0,
383 self.sizes.ssm_conv_out_f32,
384 stream,
385 )?;
386 gpu.memset_async(
387 self.splitk_workspace,
388 0,
389 self.sizes.splitk_workspace,
390 stream,
391 )?;
392 gpu.memset_async(self.expert_gate_out, 0, self.sizes.expert_gate_out, stream)?;
393 gpu.memset_async(self.expert_up_out, 0, self.sizes.expert_up_out, stream)?;
394 gpu.memset_async(self.expert_down_out, 0, self.sizes.expert_down_out, stream)?;
395 gpu.memset_async(self.logits, 0, self.sizes.logits, stream)?;
396 gpu.memset_async(self.scratch, 0, self.sizes.scratch, stream)?;
397 Ok(())
398 }
399}