cbtop/backend_regression/
analysis.rs1use super::types::{Backend, BackendComparison, SizeCliff, WorkloadType};
4
5#[derive(Debug, Clone)]
7pub struct TransferAnalysis {
8 pub backend: Backend,
10 pub workload: WorkloadType,
12 pub average_overhead: f64,
14 pub total_transfer_time_us: f64,
16 pub total_compute_time_us: f64,
18 pub sizes_dominated_by_transfer: Vec<(usize, f64)>,
20}
21
22impl TransferAnalysis {
23 pub fn transfer_dominated(&self) -> bool {
25 self.average_overhead > 0.5
26 }
27
28 pub fn summary(&self) -> String {
30 if self.transfer_dominated() {
31 format!(
32 "{} {}: Transfer overhead {:.1}% - consider larger batches",
33 self.backend.name(),
34 self.workload.name(),
35 self.average_overhead * 100.0
36 )
37 } else {
38 format!(
39 "{} {}: Transfer overhead {:.1}% - GPU efficient",
40 self.backend.name(),
41 self.workload.name(),
42 self.average_overhead * 100.0
43 )
44 }
45 }
46}
47
48#[derive(Debug, Clone)]
50pub struct BackendSummary {
51 pub measurement_count: usize,
53 pub backend_count: usize,
55 pub workload_count: usize,
57 pub regression_count: usize,
59 pub cliff_count: usize,
61 pub regressions: Vec<BackendComparison>,
63 pub cliffs: Vec<SizeCliff>,
65}
66
67impl BackendSummary {
68 pub fn has_regressions(&self) -> bool {
70 self.regression_count > 0
71 }
72
73 pub fn has_cliffs(&self) -> bool {
75 self.cliff_count > 0
76 }
77
78 pub fn status(&self) -> &'static str {
80 if self.regression_count > 0 {
81 "FAIL: Regressions detected"
82 } else if self.cliff_count > 0 {
83 "WARN: Size cliffs detected"
84 } else {
85 "PASS: No issues detected"
86 }
87 }
88}