baracuda_runtime/
query.rs1use baracuda_cuda_sys::runtime::runtime;
6use baracuda_cuda_sys::runtime::types::{
7 cudaFuncAttributes, cudaMemoryType, cudaPointerAttributes,
8};
9
10use crate::device::Device;
11use crate::error::{Result, check};
12
13#[derive(Copy, Clone, Debug, Eq, PartialEq)]
15pub enum MemoryType {
16 Unregistered,
19 Host,
21 Device,
23 Managed,
25}
26
27impl MemoryType {
28 #[inline]
29 fn from_raw(raw: i32) -> Self {
30 match raw {
31 cudaMemoryType::HOST => MemoryType::Host,
32 cudaMemoryType::DEVICE => MemoryType::Device,
33 cudaMemoryType::MANAGED => MemoryType::Managed,
34 _ => MemoryType::Unregistered,
35 }
36 }
37}
38
39#[derive(Copy, Clone, Debug)]
41pub struct PointerAttributes {
42 pub memory_type: MemoryType,
44 pub device: i32,
46 pub device_pointer: *mut core::ffi::c_void,
49 pub host_pointer: *mut core::ffi::c_void,
52}
53
54#[allow(clippy::not_unsafe_ptr_arg_deref)]
63pub fn pointer_attributes(ptr: *const core::ffi::c_void) -> Result<PointerAttributes> {
64 let r = runtime()?;
65 let cu = r.cuda_pointer_get_attributes()?;
66 let mut raw = cudaPointerAttributes::default();
67 check(unsafe {
68 cu(
69 &mut raw as *mut cudaPointerAttributes as *mut core::ffi::c_void,
70 ptr,
71 )
72 })?;
73 Ok(PointerAttributes {
74 memory_type: MemoryType::from_raw(raw.type_),
75 device: raw.device,
76 device_pointer: raw.device_pointer,
77 host_pointer: raw.host_pointer,
78 })
79}
80
81#[derive(Clone, Debug)]
86pub struct DeviceProperties {
87 pub name: String,
89 pub total_global_memory_bytes: u64,
91 pub shared_memory_per_block_bytes: u64,
93 pub regs_per_block: i32,
95 pub warp_size: i32,
97 pub max_threads_per_block: i32,
99 pub max_block_dim: [i32; 3],
101 pub max_grid_dim: [i32; 3],
103 pub clock_rate_khz: i32,
105 pub memory_clock_rate_khz: i32,
107 pub memory_bus_width_bits: i32,
109 pub l2_cache_size_bytes: i32,
111 pub max_threads_per_sm: i32,
113 pub multiprocessor_count: i32,
115 pub compute_capability_major: i32,
117 pub compute_capability_minor: i32,
119 pub integrated: bool,
121 pub concurrent_kernels: bool,
123 pub pci_bus_id: i32,
125 pub pci_device_id: i32,
127 pub pci_domain_id: i32,
129}
130
131pub fn device_properties(device: &Device) -> Result<DeviceProperties> {
139 use baracuda_cuda_sys::runtime::types::cudaDeviceAttr as Attr;
140
141 let r = runtime()?;
142 let cu = r.cuda_get_device_properties()?;
143 let mut buf = vec![0u8; 2048];
144 check(unsafe { cu(buf.as_mut_ptr() as *mut core::ffi::c_void, device.ordinal()) })?;
145
146 let name = unsafe {
150 let name_ptr = buf.as_ptr() as *const core::ffi::c_char;
151 core::ffi::CStr::from_ptr(name_ptr)
152 .to_string_lossy()
153 .into_owned()
154 };
155
156 let total_global_memory_bytes = {
158 let cu_info = r.cuda_mem_get_info()?;
159 let mut free: usize = 0;
160 let mut total: usize = 0;
161 check(unsafe { cu_info(&mut free, &mut total) })?;
162 total as u64
163 };
164
165 Ok(DeviceProperties {
166 name,
167 total_global_memory_bytes,
168 shared_memory_per_block_bytes: device
169 .attribute(Attr::MAX_SHARED_MEMORY_PER_BLOCK)
170 .unwrap_or(0) as u64,
171 regs_per_block: device.attribute(Attr::MAX_REGISTERS_PER_BLOCK).unwrap_or(0),
172 warp_size: device.attribute(Attr::WARP_SIZE).unwrap_or(0),
173 max_threads_per_block: device.attribute(Attr::MAX_THREADS_PER_BLOCK).unwrap_or(0),
174 max_block_dim: [
175 device.attribute(Attr::MAX_BLOCK_DIM_X).unwrap_or(0),
176 device.attribute(Attr::MAX_BLOCK_DIM_Y).unwrap_or(0),
177 device.attribute(Attr::MAX_BLOCK_DIM_Z).unwrap_or(0),
178 ],
179 max_grid_dim: [
180 device.attribute(Attr::MAX_GRID_DIM_X).unwrap_or(0),
181 device.attribute(Attr::MAX_GRID_DIM_Y).unwrap_or(0),
182 device.attribute(Attr::MAX_GRID_DIM_Z).unwrap_or(0),
183 ],
184 clock_rate_khz: device.attribute(Attr::CLOCK_RATE).unwrap_or(0),
185 memory_clock_rate_khz: device.attribute(Attr::CLOCK_RATE).unwrap_or(0),
186 memory_bus_width_bits: 0,
187 l2_cache_size_bytes: 0,
188 max_threads_per_sm: 0,
189 multiprocessor_count: device.attribute(Attr::MULTIPROCESSOR_COUNT).unwrap_or(0),
190 compute_capability_major: device
191 .attribute(Attr::COMPUTE_CAPABILITY_MAJOR)
192 .unwrap_or(0),
193 compute_capability_minor: device
194 .attribute(Attr::COMPUTE_CAPABILITY_MINOR)
195 .unwrap_or(0),
196 integrated: device.attribute(Attr::INTEGRATED).unwrap_or(0) != 0,
197 concurrent_kernels: device.attribute(Attr::CONCURRENT_KERNELS).unwrap_or(0) != 0,
198 pci_bus_id: device.attribute(Attr::PCI_BUS_ID).unwrap_or(0),
199 pci_device_id: device.attribute(Attr::PCI_DEVICE_ID).unwrap_or(0),
200 pci_domain_id: device.attribute(Attr::PCI_DOMAIN_ID).unwrap_or(0),
201 })
202}
203
204pub unsafe fn func_attributes(func_symbol: *const core::ffi::c_void) -> Result<cudaFuncAttributes> {
213 unsafe {
214 let r = runtime()?;
215 let cu = r.cuda_func_get_attributes()?;
216 let mut attrs = cudaFuncAttributes::default();
217 check(cu(
218 &mut attrs as *mut cudaFuncAttributes as *mut core::ffi::c_void,
219 func_symbol,
220 ))?;
221 Ok(attrs)
222 }
223}