singe-cupti 0.1.0-alpha.5

Safe Rust wrappers for NVIDIA CUPTI profiling and callback APIs.
Documentation
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))
}