use std::ffi::{c_char, c_void};
use super::{CUarray, CUdeviceptr, CUfunction};
#[repr(transparent)]
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct CUgraph(pub *mut c_void);
unsafe impl Send for CUgraph {}
unsafe impl Sync for CUgraph {}
impl CUgraph {
#[inline]
pub fn is_null(self) -> bool {
self.0.is_null()
}
}
impl Default for CUgraph {
#[inline]
fn default() -> Self {
Self(std::ptr::null_mut())
}
}
impl std::fmt::Debug for CUgraph {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "CUgraph({:p})", self.0)
}
}
#[repr(transparent)]
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct CUgraphExec(pub *mut c_void);
unsafe impl Send for CUgraphExec {}
unsafe impl Sync for CUgraphExec {}
impl CUgraphExec {
#[inline]
pub fn is_null(self) -> bool {
self.0.is_null()
}
}
impl Default for CUgraphExec {
#[inline]
fn default() -> Self {
Self(std::ptr::null_mut())
}
}
impl std::fmt::Debug for CUgraphExec {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "CUgraphExec({:p})", self.0)
}
}
#[repr(transparent)]
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
pub struct CUgraphNode(pub *mut c_void);
unsafe impl Send for CUgraphNode {}
unsafe impl Sync for CUgraphNode {}
impl CUgraphNode {
#[inline]
pub fn is_null(self) -> bool {
self.0.is_null()
}
}
impl Default for CUgraphNode {
#[inline]
fn default() -> Self {
Self(std::ptr::null_mut())
}
}
impl std::fmt::Debug for CUgraphNode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "CUgraphNode({:p})", self.0)
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct CUDA_KERNEL_NODE_PARAMS {
pub func: CUfunction,
pub grid_dim_x: u32,
pub grid_dim_y: u32,
pub grid_dim_z: u32,
pub block_dim_x: u32,
pub block_dim_y: u32,
pub block_dim_z: u32,
pub shared_mem_bytes: u32,
pub kernel_params: *mut *mut c_void,
pub extra: *mut *mut c_void,
}
unsafe impl Send for CUDA_KERNEL_NODE_PARAMS {}
unsafe impl Sync for CUDA_KERNEL_NODE_PARAMS {}
impl Default for CUDA_KERNEL_NODE_PARAMS {
fn default() -> Self {
Self {
func: CUfunction::default(),
grid_dim_x: 0,
grid_dim_y: 0,
grid_dim_z: 0,
block_dim_x: 0,
block_dim_y: 0,
block_dim_z: 0,
shared_mem_bytes: 0,
kernel_params: std::ptr::null_mut(),
extra: std::ptr::null_mut(),
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct CUDA_MEMCPY3D {
pub src_x_in_bytes: usize,
pub src_y: usize,
pub src_z: usize,
pub src_lod: usize,
pub src_memory_type: u32,
pub src_host: *const c_void,
pub src_device: CUdeviceptr,
pub src_array: CUarray,
pub reserved0: *mut c_void,
pub src_pitch: usize,
pub src_height: usize,
pub dst_x_in_bytes: usize,
pub dst_y: usize,
pub dst_z: usize,
pub dst_lod: usize,
pub dst_memory_type: u32,
pub dst_host: *mut c_void,
pub dst_device: CUdeviceptr,
pub dst_array: CUarray,
pub reserved1: *mut c_void,
pub dst_pitch: usize,
pub dst_height: usize,
pub width_in_bytes: usize,
pub height: usize,
pub depth: usize,
}
unsafe impl Send for CUDA_MEMCPY3D {}
unsafe impl Sync for CUDA_MEMCPY3D {}
impl Default for CUDA_MEMCPY3D {
fn default() -> Self {
Self {
src_x_in_bytes: 0,
src_y: 0,
src_z: 0,
src_lod: 0,
src_memory_type: 0,
src_host: std::ptr::null(),
src_device: 0,
src_array: CUarray::default(),
reserved0: std::ptr::null_mut(),
src_pitch: 0,
src_height: 0,
dst_x_in_bytes: 0,
dst_y: 0,
dst_z: 0,
dst_lod: 0,
dst_memory_type: 0,
dst_host: std::ptr::null_mut(),
dst_device: 0,
dst_array: CUarray::default(),
reserved1: std::ptr::null_mut(),
dst_pitch: 0,
dst_height: 0,
width_in_bytes: 0,
height: 0,
depth: 0,
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CUDA_MEMSET_NODE_PARAMS {
pub dst: CUdeviceptr,
pub pitch: usize,
pub value: u32,
pub element_size: u32,
pub width: usize,
pub height: usize,
}
impl Default for CUDA_MEMSET_NODE_PARAMS {
fn default() -> Self {
Self {
dst: 0,
pitch: 0,
value: 0,
element_size: 1,
width: 0,
height: 1,
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct CUDA_HOST_NODE_PARAMS {
pub fn_ptr: Option<unsafe extern "C" fn(user_data: *mut c_void)>,
pub user_data: *mut c_void,
}
unsafe impl Send for CUDA_HOST_NODE_PARAMS {}
unsafe impl Sync for CUDA_HOST_NODE_PARAMS {}
impl Default for CUDA_HOST_NODE_PARAMS {
fn default() -> Self {
Self {
fn_ptr: None,
user_data: std::ptr::null_mut(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u32)]
#[non_exhaustive]
pub enum CUmemPoolAttribute {
ReuseFollowEventDependencies = 1,
ReuseAllowOpportunistic = 2,
ReuseAllowInternalDependencies = 3,
ReleaseThreshold = 4,
ReservedMemCurrent = 5,
ReservedMemHigh = 6,
UsedMemCurrent = 7,
UsedMemHigh = 8,
}
pub const CUDA_GRAPH_INSTANTIATE_FLAG_AUTO_FREE_ON_LAUNCH: u64 = 1;
pub const CUDA_GRAPH_INSTANTIATE_FLAG_UPLOAD: u64 = 2;
pub const CUDA_GRAPH_INSTANTIATE_FLAG_DEVICE_LAUNCH: u64 = 4;
pub const CUDA_GRAPH_INSTANTIATE_FLAG_USE_NODE_PRIORITY: u64 = 8;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u32)]
#[non_exhaustive]
pub enum CUgraphNodeType {
Kernel = 0,
Memcpy = 1,
Memset = 2,
Host = 3,
Graph = 4,
Empty = 5,
}
pub const CU_LAUNCH_PARAM_END: *mut c_void = std::ptr::null_mut();
#[allow(dead_code)]
type GraphNodeName = *const c_char;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn graph_handles_default_to_null() {
assert!(CUgraph::default().is_null());
assert!(CUgraphExec::default().is_null());
assert!(CUgraphNode::default().is_null());
}
#[test]
fn kernel_node_params_default_is_zeroed() {
let p = CUDA_KERNEL_NODE_PARAMS::default();
assert!(p.func.is_null());
assert_eq!(p.grid_dim_x, 0);
assert_eq!(p.block_dim_x, 0);
assert_eq!(p.shared_mem_bytes, 0);
assert!(p.kernel_params.is_null());
assert!(p.extra.is_null());
}
#[test]
fn memset_node_params_default_is_linear() {
let p = CUDA_MEMSET_NODE_PARAMS::default();
assert_eq!(p.dst, 0);
assert_eq!(p.pitch, 0);
assert_eq!(p.element_size, 1);
assert_eq!(p.height, 1);
}
#[test]
fn memcpy3d_default_is_zeroed() {
let m = CUDA_MEMCPY3D::default();
assert_eq!(m.src_memory_type, 0);
assert_eq!(m.dst_memory_type, 0);
assert_eq!(m.width_in_bytes, 0);
assert_eq!(m.depth, 0);
assert!(m.src_host.is_null());
assert!(m.reserved0.is_null());
assert!(m.reserved1.is_null());
}
#[test]
fn host_node_params_default_is_empty() {
let p = CUDA_HOST_NODE_PARAMS::default();
assert!(p.fn_ptr.is_none());
assert!(p.user_data.is_null());
}
#[test]
fn mem_pool_attribute_discriminants_match_cuda() {
assert_eq!(CUmemPoolAttribute::ReuseFollowEventDependencies as u32, 1);
assert_eq!(CUmemPoolAttribute::ReleaseThreshold as u32, 4);
assert_eq!(CUmemPoolAttribute::UsedMemHigh as u32, 8);
}
#[test]
fn graph_node_type_discriminants_match_cuda() {
assert_eq!(CUgraphNodeType::Kernel as u32, 0);
assert_eq!(CUgraphNodeType::Empty as u32, 5);
}
}