From 01cf905c71af884277b3c65bbcea38c663bac6ad Mon Sep 17 00:00:00 2001 From: Mel Henning Date: Thu, 24 Apr 2025 13:57:12 -0400 Subject: [PATCH] nak: Set variable_latency=0 for !needs_scoreboard This simplifies usage of estimate_variable_latency a little in that we can just use it directly in our max() expressions instead of guarding it with an if. Reviewed-by: Mary Guillemard Part-of: --- .../compiler/nak/opt_instr_sched_common.rs | 8 ++++++-- .../compiler/nak/opt_instr_sched_postpass.rs | 20 +++++++++---------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/nouveau/compiler/nak/opt_instr_sched_common.rs b/src/nouveau/compiler/nak/opt_instr_sched_common.rs index 64f5c531abc..8ceae801517 100644 --- a/src/nouveau/compiler/nak/opt_instr_sched_common.rs +++ b/src/nouveau/compiler/nak/opt_instr_sched_common.rs @@ -253,7 +253,11 @@ pub fn estimate_block_weight(cfg: &CFG, block_idx: usize) -> u64 { /// Memory instructions were copied from L1 data cache latencies. /// For instructions not mentioned in the paper, I made up numbers. /// This could probably be improved. -pub fn estimate_variable_latency(sm: u8, op: &Op) -> u32 { +pub fn estimate_variable_latency(sm: &dyn ShaderModel, op: &Op) -> u32 { + if !sm.op_needs_scoreboard(op) { + return 0; + } + match op { // Multi-function unit Op::Rro(_) | Op::MuFu(_) => 15, @@ -265,7 +269,7 @@ pub fn estimate_variable_latency(sm: u8, op: &Op) -> u32 { // Integer ALU Op::BRev(_) | Op::Flo(_) | Op::PopC(_) => 15, Op::IMad(_) | Op::IMul(_) => { - assert!(sm < 70); + assert!(sm.sm() < 70); 86 } diff --git a/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs b/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs index 5ce08c11f63..7dd1ea3a778 100644 --- a/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs +++ b/src/nouveau/compiler/nak/opt_instr_sched_postpass.rs @@ -89,12 +89,10 @@ fn generate_dep_graph(sm: &dyn ShaderModel, instrs: &[Instr]) -> DepGraph { } else { sm.raw_latency(&instr.op, i, &instrs[r_ip].op, r_src_idx) }; - if sm.op_needs_scoreboard(&instr.op) { - latency = max( - latency, - estimate_variable_latency(sm.sm(), &instr.op), - ); - } + + latency = + max(latency, estimate_variable_latency(sm, &instr.op)); + g.add_edge(ip, r_ip, EdgeLabel { latency }); } }); @@ -126,11 +124,11 @@ fn generate_dep_graph(sm: &dyn ShaderModel, instrs: &[Instr]) -> DepGraph { .map(|i| sm.worst_latency(&instr.op, i)) .max() .unwrap_or(0); - if sm.op_needs_scoreboard(&instr.op) { - let var_latency = estimate_variable_latency(sm.sm(), &instr.op) - + sm.exec_latency(&instrs[instrs.len() - 1].op); - ready_cycle = max(ready_cycle, var_latency); - } + + let var_latency = estimate_variable_latency(sm, &instr.op) + + sm.exec_latency(&instrs[instrs.len() - 1].op); + ready_cycle = max(ready_cycle, var_latency); + let label = &mut g.nodes[ip].label; label.exec_latency = sm.exec_latency(&instr.op); label.ready_cycle = ready_cycle;