use std::ptr;
use crate::generated::binding::*;
pub(crate) fn new_device_utilization(raw: FuriosaSmiDeviceUtilization) -> DeviceUtilization {
DeviceUtilization { raw }
}
pub struct DeviceUtilization {
raw: FuriosaSmiDeviceUtilization,
}
impl DeviceUtilization {
pub fn pe_utilization(&self) -> Vec<PeUtilization> {
let mut result = Vec::with_capacity(self.raw.pe_count as usize);
for i in 0..self.raw.pe_count {
result.push(new_pe_utilization(self.raw.pe[i as usize]));
}
result
}
pub fn memory_utilization(&self) -> MemoryUtilization {
new_memory_utilization(self.raw.memory)
}
}
fn new_pe_utilization(raw: FuriosaSmiPeUtilization) -> PeUtilization {
PeUtilization { raw }
}
pub struct PeUtilization {
raw: FuriosaSmiPeUtilization,
}
impl PeUtilization {
pub fn core(&self) -> u32 {
self.raw.core
}
pub fn time_window_mill(&self) -> u32 {
self.raw.time_window_mil
}
pub fn pe_usage_percentage(&self) -> f64 {
self.raw.pe_usage_percentage
}
}
fn new_memory_utilization(raw: FuriosaSmiMemoryUtilization) -> MemoryUtilization {
MemoryUtilization { raw }
}
pub struct MemoryUtilization {
raw: FuriosaSmiMemoryUtilization,
}
impl MemoryUtilization {
pub fn total_bytes(&self) -> u64 {
self.raw.total_bytes
}
pub fn in_use_bytes(&self) -> u64 {
self.raw.in_use_bytes
}
}
pub(crate) fn new_device_temperature(raw: FuriosaSmiDeviceTemperature) -> DeviceTemperature {
DeviceTemperature { raw }
}
pub struct DeviceTemperature {
raw: FuriosaSmiDeviceTemperature,
}
impl DeviceTemperature {
pub fn soc_peak(&self) -> f64 {
self.raw.soc_peak
}
pub fn ambient(&self) -> f64 {
self.raw.ambient
}
}
pub(crate) fn new_observer_instance(raw: FuriosaSmiObserverInstance) -> DeviceObserverInstance {
DeviceObserverInstance { raw }
}
pub(crate) struct DeviceObserverInstance {
raw: FuriosaSmiObserverInstance,
}
impl DeviceObserverInstance {
pub(crate) fn raw(&self) -> FuriosaSmiObserverInstance {
self.raw
}
}
impl Drop for DeviceObserverInstance {
fn drop(&mut self) {
unsafe {
furiosa_smi_destroy_observer(&mut self.raw as *mut FuriosaSmiObserverInstance);
}
}
}
fn default_pe_utilization() -> FuriosaSmiPeUtilization {
FuriosaSmiPeUtilization {
core: 0,
time_window_mil: 0,
pe_usage_percentage: 0.0,
}
}
fn default_memory_utilization() -> FuriosaSmiMemoryUtilization {
FuriosaSmiMemoryUtilization {
total_bytes: 0,
in_use_bytes: 0,
}
}
pub(crate) fn default_device_utilization() -> FuriosaSmiDeviceUtilization {
FuriosaSmiDeviceUtilization {
pe_count: 0,
pe: [default_pe_utilization(); FURIOSA_SMI_MAX_PE_SIZE as usize],
memory: default_memory_utilization(),
}
}
pub(crate) fn default_power_consumption() -> FuriosaSmiDevicePowerConsumption {
FuriosaSmiDevicePowerConsumption { rms_total: 0.0 }
}
pub(crate) fn default_temperature() -> FuriosaSmiDeviceTemperature {
FuriosaSmiDeviceTemperature {
soc_peak: 0.0,
ambient: 0.0,
}
}
pub(crate) fn default_observer_instance() -> FuriosaSmiObserverInstance {
ptr::null_mut()
}