vyre_runtime/megakernel/builder/
priority.rs1use super::{
2 claimed_slot_body, execute_already_claimed_slot_body, persistent_lane_prologue,
3 process_io_requests, wrap_persistent_megakernel_program,
4};
5use super::{Expr, Node, OpcodeHandler, Program};
6
7#[must_use]
21pub fn build_program_priority(workgroup_size_x: u32, opcodes: &[OpcodeHandler]) -> Program {
22 build_program_priority_slots(workgroup_size_x, workgroup_size_x.max(1), opcodes)
23}
24
25#[must_use]
27pub fn build_program_priority_slots(
28 workgroup_size_x: u32,
29 slot_count: u32,
30 opcodes: &[OpcodeHandler],
31) -> Program {
32 wrap_persistent_megakernel_program(
33 workgroup_size_x,
34 slot_count.max(1),
35 persistent_body_priority_slots(workgroup_size_x, slot_count.max(1), opcodes),
36 )
37}
38
39#[must_use]
42pub fn persistent_body_priority(workgroup_size_x: u32, opcodes: &[OpcodeHandler]) -> Vec<Node> {
43 persistent_body_priority_slots(workgroup_size_x, workgroup_size_x.max(1), opcodes)
44}
45
46#[must_use]
48pub fn persistent_body_priority_slots(
49 workgroup_size_x: u32,
50 slot_count: u32,
51 opcodes: &[OpcodeHandler],
52) -> Vec<Node> {
53 use crate::megakernel::scheduler;
54
55 let slot_count = slot_count.max(1);
56 let mut body = persistent_lane_prologue(workgroup_size_x);
57
58 body.extend(scheduler::priority_scan_body(slot_count));
60
61 body.push(Node::if_then(
63 Expr::ne(Expr::var("claimed_slot_base"), Expr::u32(u32::MAX)),
64 {
65 let mut exec = vec![Node::let_bind("slot_base", Expr::var("claimed_slot_base"))];
68 exec.extend(execute_already_claimed_slot_body(
69 Expr::var("claimed_tenant"),
70 claimed_slot_body(opcodes),
71 ));
72 exec
73 },
74 ));
75
76 body.push(Node::Block(process_io_requests()));
78
79 body
80}