1use core::sync::atomic::{AtomicBool, Ordering};
9
10use baracuda_cuda_sys::driver;
11
12use crate::error::{check, Result};
13
14static INITIALIZED: AtomicBool = AtomicBool::new(false);
15
16pub fn init() -> Result<()> {
18 if INITIALIZED.load(Ordering::Acquire) {
19 return Ok(());
20 }
21 let d = driver()?;
22 let cu = d.cu_init()?;
23 check(unsafe { cu(0) })?;
25 INITIALIZED.store(true, Ordering::Release);
26 Ok(())
27}
28
29pub fn version() -> Result<baracuda_types::CudaVersion> {
31 init()?;
32 let d = driver()?;
33 let cu = d.cu_driver_get_version()?;
34 let mut raw: core::ffi::c_int = 0;
35 check(unsafe { cu(&mut raw) })?;
36 Ok(baracuda_types::CudaVersion::from_raw(raw as u32))
37}