Skip to main content

cbtop/backend_regression/
analysis.rs

1//! Transfer analysis and summary types for backend regression detection.
2
3use super::types::{Backend, BackendComparison, SizeCliff, WorkloadType};
4
5/// GPU transfer overhead analysis
6#[derive(Debug, Clone)]
7pub struct TransferAnalysis {
8    /// Backend analyzed
9    pub backend: Backend,
10    /// Workload type
11    pub workload: WorkloadType,
12    /// Average transfer overhead (0.0 - 1.0)
13    pub average_overhead: f64,
14    /// Total transfer time
15    pub total_transfer_time_us: f64,
16    /// Total compute time
17    pub total_compute_time_us: f64,
18    /// Sizes where transfer dominates (>50% overhead)
19    pub sizes_dominated_by_transfer: Vec<(usize, f64)>,
20}
21
22impl TransferAnalysis {
23    /// Check if transfer dominates compute
24    pub fn transfer_dominated(&self) -> bool {
25        self.average_overhead > 0.5
26    }
27
28    /// Get summary
29    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/// Summary of backend regression analysis
49#[derive(Debug, Clone)]
50pub struct BackendSummary {
51    /// Total measurements
52    pub measurement_count: usize,
53    /// Number of backends tested
54    pub backend_count: usize,
55    /// Number of workloads tested
56    pub workload_count: usize,
57    /// Number of regressions detected
58    pub regression_count: usize,
59    /// Number of size cliffs detected
60    pub cliff_count: usize,
61    /// All regressions
62    pub regressions: Vec<BackendComparison>,
63    /// All cliffs
64    pub cliffs: Vec<SizeCliff>,
65}
66
67impl BackendSummary {
68    /// Check if any regressions detected
69    pub fn has_regressions(&self) -> bool {
70        self.regression_count > 0
71    }
72
73    /// Check if any cliffs detected
74    pub fn has_cliffs(&self) -> bool {
75        self.cliff_count > 0
76    }
77
78    /// Get status message
79    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}