use std::path::PathBuf;
use std::sync::OnceLock;
pub fn gpu_arch() -> &'static rlx_gpu_dispatch::dispatch::GpuArch {
static ARCH: OnceLock<rlx_gpu_dispatch::dispatch::GpuArch> = OnceLock::new();
ARCH.get_or_init(|| {
ensure_tuning_cache_loaded();
let family = format!("{:?}", crate::cost::hw_model().gpu_family).to_lowercase();
rlx_gpu_dispatch::dispatch::GpuArch::metal(&family)
})
}
pub fn tuning_cache_path() -> Option<PathBuf> {
if let Some(p) = rlx_ir::env::var("RLX_GPU_TUNING_CACHE") {
return Some(PathBuf::from(p));
}
let base = std::env::var("XDG_CACHE_HOME")
.map(PathBuf::from)
.ok()
.or_else(|| {
std::env::var("HOME")
.ok()
.map(|h| PathBuf::from(h).join(".cache"))
})?;
Some(base.join("rlx-metal").join("dispatch-tuning.tsv"))
}
pub fn ensure_tuning_cache_loaded() {
static LOADED: OnceLock<()> = OnceLock::new();
LOADED.get_or_init(|| {
let Some(path) = tuning_cache_path() else {
return;
};
let Ok(text) = std::fs::read_to_string(&path) else {
return;
};
let report = rlx_gpu_dispatch::dispatch::load_overrides(&text);
if rlx_ir::env::flag("RLX_VERBOSE") {
eprintln!(
"rlx-metal: dispatch tuning cache {}: {} applied, {} skipped",
path.display(),
report.applied,
report.skipped
);
}
});
}
pub fn save_tuning_cache() -> Option<PathBuf> {
let path = tuning_cache_path()?;
if let Some(dir) = path.parent() {
std::fs::create_dir_all(dir).ok()?;
}
std::fs::write(&path, rlx_gpu_dispatch::dispatch::save_overrides()).ok()?;
Some(path)
}