use singe_cuda::device::Device;
use singe_cupti_sys as sys;
use crate::{error::Result, try_ffi, types::DeviceVirtualizationMode};
fn raw_compute_capability_supported(major: i32, minor: i32, support: *mut i32) -> Result<()> {
unsafe {
try_ffi!(sys::cuptiComputeCapabilitySupported(major, minor, support))?;
}
Ok(())
}
pub fn supports_compute_capability(major: i32, minor: i32) -> Result<bool> {
let mut support = 0;
raw_compute_capability_supported(major, minor, &mut support)?;
Ok(support != 0)
}
fn raw_device_supported(device: sys::CUdevice, support: *mut i32) -> Result<()> {
unsafe {
try_ffi!(sys::cuptiDeviceSupported(device, support))?;
}
Ok(())
}
pub fn supports_device(device: Device) -> Result<bool> {
let mut support = 0;
raw_device_supported(device.id() as sys::CUdevice, &mut support)?;
Ok(support != 0)
}
fn raw_device_virtualization_mode(
device: sys::CUdevice,
mode: *mut sys::CUpti_DeviceVirtualizationMode,
) -> Result<()> {
unsafe {
try_ffi!(sys::cuptiDeviceVirtualizationMode(device, mode))?;
}
Ok(())
}
pub fn device_virtualization_mode(device: Device) -> Result<DeviceVirtualizationMode> {
let mut mode = sys::CUpti_DeviceVirtualizationMode::CUPTI_DEVICE_VIRTUALIZATION_MODE_NONE;
raw_device_virtualization_mode(device.id() as sys::CUdevice, &mut mode)?;
Ok(DeviceVirtualizationMode::from(mode))
}