use crate::error::{CudaError, CudaResult};
use crate::ffi::CUdeviceptr;
use crate::loader::try_driver;
use crate::stream::Stream;
pub fn device_memory_info() -> CudaResult<(usize, usize)> {
let api = try_driver()?;
let mut free: usize = 0;
let mut total: usize = 0;
crate::cuda_call!((api.cu_mem_get_info_v2)(&mut free, &mut total))?;
Ok((free, total))
}
pub fn memcpy_device_to_device(dst: CUdeviceptr, src: CUdeviceptr, bytes: usize) -> CudaResult<()> {
let api = try_driver()?;
crate::cuda_call!((api.cu_memcpy_dtod_v2)(dst, src, bytes))
}
pub fn memcpy_device_to_device_async(
dst: CUdeviceptr,
src: CUdeviceptr,
bytes: usize,
stream: &Stream,
) -> CudaResult<()> {
let api = try_driver()?;
let f = api.cu_memcpy_dtod_async_v2.ok_or(CudaError::NotSupported)?;
crate::cuda_call!(f(dst, src, bytes, stream.raw()))
}
pub fn memset_d32(ptr: CUdeviceptr, value: u32, count: usize) -> CudaResult<()> {
let api = try_driver()?;
crate::cuda_call!((api.cu_memset_d32_v2)(ptr, value, count))
}
pub fn memset_d32_async(
ptr: CUdeviceptr,
value: u32,
count: usize,
stream: &Stream,
) -> CudaResult<()> {
let api = try_driver()?;
let f = api.cu_memset_d32_async.ok_or(CudaError::NotSupported)?;
crate::cuda_call!(f(ptr, value, count, stream.raw()))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn device_memory_info_returns_error_without_gpu() {
let result = device_memory_info();
let _ = result;
}
#[test]
fn memcpy_dtod_returns_error_without_gpu() {
let result = memcpy_device_to_device(0, 0, 0);
let _ = result;
}
#[test]
fn memset_d32_returns_error_without_gpu() {
let result = memset_d32(0, 0, 0);
let _ = result;
}
}