use anyhow::{Context, Result};
use crate::cli;
use crate::main_modules::memory_probe::{DeviceBudget, budget_bytes};
#[cfg(feature = "cuda")]
pub(crate) fn init_gpu_backend(
args: &cli::ServeArgs,
ptx_set: &metrale_kernels::TargetPtxSet,
) -> Result<(
Box<dyn metrale_gpu_runtime::gpu::GpuBackend>,
usize,
DeviceBudget,
)> {
super::super::kernel_gate::gate_device_arch(args.check_kernels, ptx_set, args.gpu_ordinal)?;
let backend = metrale_gpu_runtime::cuda_backend::MetraleCudaBackend::new(
args.gpu_ordinal,
&ptx_set.modules,
)
.context("Failed to initialize CUDA backend")?;
let ledger = backend.ledger_probe();
let gpu: Box<dyn metrale_gpu_runtime::gpu::GpuBackend> = Box::new(backend);
let total_mem = gpu.total_memory()?;
let free_mem = gpu.free_memory()?;
metrale_gpu_runtime::gpu::set_baseline_free_bytes(free_mem);
tracing::info!(
"GPU {}: {:.1} GB total, {:.1} GB free",
args.gpu_ordinal,
total_mem as f64 / (1024.0 * 1024.0 * 1024.0),
free_mem as f64 / (1024.0 * 1024.0 * 1024.0),
);
let device = DeviceBudget {
budget_bytes: budget_bytes(total_mem, args.gpu_memory_utilization),
ledger: Some(std::sync::Arc::new(move || ledger.live_bytes())),
};
Ok((gpu, free_mem, device))
}
#[cfg(all(feature = "metal", not(feature = "cuda")))]
pub(crate) fn init_gpu_backend(
args: &cli::ServeArgs,
ptx_set: &metrale_kernels::TargetPtxSet,
) -> Result<(
Box<dyn metrale_gpu_runtime::gpu::GpuBackend>,
usize,
DeviceBudget,
)> {
let gpu: Box<dyn metrale_gpu_runtime::gpu::GpuBackend> = Box::new(
metrale_gpu_runtime::metal_backend::MetalGpuBackend::new(
args.gpu_ordinal,
&ptx_set.modules,
)
.context("Failed to initialize Metal backend")?,
);
let total_mem = gpu.total_memory()?;
let free_mem = gpu.free_memory()?;
metrale_gpu_runtime::gpu::set_baseline_free_bytes(free_mem);
tracing::info!(
"Metal device {}: {:.1} GB total, {:.1} GB free",
args.gpu_ordinal,
total_mem as f64 / (1024.0 * 1024.0 * 1024.0),
free_mem as f64 / (1024.0 * 1024.0 * 1024.0),
);
let device = DeviceBudget {
budget_bytes: budget_bytes(total_mem, args.gpu_memory_utilization),
ledger: None,
};
Ok((gpu, free_mem, device))
}