//! Desktop benchmark runner. //! //! The same [`dinovision::bench`] code runs on the Quest through the //! `android` crate; running it here first gives a reference point from a //! GPU that *does* have cooperative matrix, which makes the Adreno numbers //! interpretable rather than just small. //! //! ```text //! cargo run --release --example bench -- [iters] //! DINOVISION_BENCH=shapes cargo run --release --example bench -- [iters] //! ``` //! //! With `DINOVISION_BENCH=shapes`, runs only the matmul shape sweep — the diagnostic for //! what the register-tiled kernel is short of. It takes a couple of minutes //! instead of the full suite's twenty, which matters when the target is a //! headset on a flaky wireless adb link. fn main() { env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); let iters = std::env::args() .nth(1) .and_then(|s| s.parse().ok()) .unwrap_or(20); // Selected by environment, not by argument: `std::env::args()` does not // survive the trip to an adb shell on Horizon OS, and silently running // the wrong benchmark is worse than an ugly interface. `RUST_LOG` // already proves the environment arrives intact. let shapes_only = std::env::var("DINOVISION_BENCH").as_deref() == Ok("shapes"); let gpu = dinovision::init_context(None).expect("failed to initialize GPU context"); let results = if shapes_only { dinovision::bench::describe_device(&gpu); dinovision::bench::matmul_shapes(gpu, iters) } else { dinovision::bench::run_all(gpu, iters) }; println!("\n{:-<80}", ""); for t in &results { println!("{t}"); println!("DINOVISION_BENCH_JSON {}", t.json_line()); } }