nuvec_gpu/metal/
profile.rs1use std::collections::HashMap;
13use std::sync::{Arc, LazyLock, Mutex, PoisonError};
14
15static ENABLED: LazyLock<bool> =
16 LazyLock::new(|| std::env::var_os("NUVEC_PROFILE").is_some_and(|v| v != "0"));
17
18type Table = HashMap<Arc<str>, (u64, f64)>;
20
21static TABLE: Mutex<Option<Table>> = Mutex::new(None);
22
23pub fn enabled() -> bool {
25 *ENABLED
26}
27
28pub(crate) fn shapes() -> bool {
30 static SHAPES: LazyLock<bool> =
31 LazyLock::new(|| std::env::var_os("NUVEC_PROFILE").is_some_and(|v| v == "shapes"));
32 *SHAPES
33}
34
35pub(crate) fn record(kernels: &[Arc<str>], seconds: f64) {
37 if kernels.is_empty() {
38 return;
39 }
40 let share = seconds / kernels.len() as f64;
41 let mut table = TABLE.lock().unwrap_or_else(PoisonError::into_inner);
42 let table = table.get_or_insert_with(HashMap::new);
43 for k in kernels {
44 let entry = table.entry(k.clone()).or_default();
45 entry.0 += 1;
46 entry.1 += share;
47 }
48}
49
50pub fn report() -> Vec<(String, u64, f64)> {
52 let table = TABLE.lock().unwrap_or_else(PoisonError::into_inner);
53 let mut rows: Vec<_> = table
54 .iter()
55 .flatten()
56 .map(|(k, &(n, s))| (k.to_string(), n, s))
57 .collect();
58 rows.sort_by(|a, b| b.2.total_cmp(&a.2));
59 rows
60}
61
62pub fn reset() {
64 *TABLE.lock().unwrap_or_else(PoisonError::into_inner) = None;
65}