pub mod device;
pub mod error;
pub mod event;
pub mod launch;
pub mod memory;
pub mod peer;
pub mod profiler;
pub mod stream;
pub mod texture;
pub use device::CudaDeviceProp;
pub use error::{CudaRtError, CudaRtResult};
pub use event::{CudaEvent, EventFlags};
pub use launch::{CudaFunction, CudaModule, Dim3, FuncAttribute, FuncAttributes};
pub use memory::DevicePtr;
pub use stream::{CudaStream, StreamFlags};
pub use texture::{
AddressMode, Array3DFlags, ArrayFormat, CudaArray, CudaArray3D, CudaSurfaceObject,
CudaTextureObject, FilterMode, ResourceDesc, ResourceViewDesc, TextureDesc,
};
pub fn get_device_count() -> CudaRtResult<u32> {
device::get_device_count()
}
pub fn set_device(ordinal: u32) -> CudaRtResult<()> {
device::set_device(ordinal)
}
pub fn get_device() -> CudaRtResult<u32> {
device::get_device()
}
pub fn device_synchronize() -> CudaRtResult<()> {
device::device_synchronize()
}
pub fn cuda_malloc(size: usize) -> CudaRtResult<DevicePtr> {
memory::malloc(size)
}
pub fn cuda_free(ptr: DevicePtr) -> CudaRtResult<()> {
memory::free(ptr)
}
pub fn cuda_memset(ptr: DevicePtr, value: u8, count: usize) -> CudaRtResult<()> {
memory::memset(ptr, value, count)
}
pub fn memcpy_h2d<T: Copy>(dst: DevicePtr, src: &[T]) -> CudaRtResult<()> {
memory::memcpy_h2d(dst, src)
}
pub fn memcpy_d2h<T: Copy>(dst: &mut [T], src: DevicePtr) -> CudaRtResult<()> {
memory::memcpy_d2h(dst, src)
}
pub fn memcpy_d2d(dst: DevicePtr, src: DevicePtr, bytes: usize) -> CudaRtResult<()> {
memory::memcpy_d2d(dst, src, bytes)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn flat_api_no_panic() {
let _ = get_device_count();
let _ = get_device();
let _ = cuda_malloc(0);
let _ = cuda_free(DevicePtr::NULL);
let _ = cuda_memset(DevicePtr::NULL, 0, 0);
}
#[test]
fn device_ptr_arithmetic() {
let base = DevicePtr(0x1000);
assert_eq!(base.offset(16), DevicePtr(0x1010));
assert_eq!(base.offset(-16), DevicePtr(0x0FF0));
}
#[test]
fn dim3_convenience() {
let d = Dim3::one_d(1024);
assert_eq!(d.volume(), 1024);
let d2 = Dim3::two_d(32, 8);
assert_eq!(d2.volume(), 256);
}
#[test]
fn error_display_non_empty() {
let e = CudaRtError::MemoryAllocation;
assert!(!e.to_string().is_empty());
}
#[test]
fn stream_flags_constants() {
assert_eq!(StreamFlags::DEFAULT.0, 0);
assert_eq!(StreamFlags::NON_BLOCKING.0, 1);
}
#[test]
fn event_flags_constants() {
assert_eq!(EventFlags::DEFAULT.0, 0);
assert_eq!(EventFlags::DISABLE_TIMING.0, 2);
}
}