use std::convert::TryFrom;
use std::os::raw::c_uint;
use crate::error::NvmlError;
use crate::ffi::bindings::*;
#[cfg(feature = "serde")]
use serde_derive::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum GpmMetricId {
GraphicsUtil,
SmUtil,
SmOccupancy,
IntegerUtil,
AnyTensorUtil,
DfmaTensorUtil,
HmmaTensorUtil,
ImmaTensorUtil,
DramBwUtil,
Fp64Util,
Fp32Util,
Fp16Util,
PcieTxPerSec,
PcieRxPerSec,
Nvdec0Util,
Nvdec1Util,
Nvdec2Util,
Nvdec3Util,
Nvdec4Util,
Nvdec5Util,
Nvdec6Util,
Nvdec7Util,
Nvjpg0Util,
Nvjpg1Util,
Nvjpg2Util,
Nvjpg3Util,
Nvjpg4Util,
Nvjpg5Util,
Nvjpg6Util,
Nvjpg7Util,
Nvofa0Util,
Nvofa1Util,
NvlinkTotalRxPerSec,
NvlinkTotalTxPerSec,
NvlinkL0RxPerSec,
NvlinkL0TxPerSec,
NvlinkL1RxPerSec,
NvlinkL1TxPerSec,
NvlinkL2RxPerSec,
NvlinkL2TxPerSec,
NvlinkL3RxPerSec,
NvlinkL3TxPerSec,
NvlinkL4RxPerSec,
NvlinkL4TxPerSec,
NvlinkL5RxPerSec,
NvlinkL5TxPerSec,
NvlinkL6RxPerSec,
NvlinkL6TxPerSec,
NvlinkL7RxPerSec,
NvlinkL7TxPerSec,
NvlinkL8RxPerSec,
NvlinkL8TxPerSec,
NvlinkL9RxPerSec,
NvlinkL9TxPerSec,
NvlinkL10RxPerSec,
NvlinkL10TxPerSec,
NvlinkL11RxPerSec,
NvlinkL11TxPerSec,
NvlinkL12RxPerSec,
NvlinkL12TxPerSec,
NvlinkL13RxPerSec,
NvlinkL13TxPerSec,
NvlinkL14RxPerSec,
NvlinkL14TxPerSec,
NvlinkL15RxPerSec,
NvlinkL15TxPerSec,
NvlinkL16RxPerSec,
NvlinkL16TxPerSec,
NvlinkL17RxPerSec,
NvlinkL17TxPerSec,
}
impl GpmMetricId {
pub fn as_c(&self) -> c_uint {
match *self {
Self::GraphicsUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_GRAPHICS_UTIL,
Self::SmUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_SM_UTIL,
Self::SmOccupancy => nvmlGpmMetricId_t_NVML_GPM_METRIC_SM_OCCUPANCY,
Self::IntegerUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_INTEGER_UTIL,
Self::AnyTensorUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_ANY_TENSOR_UTIL,
Self::DfmaTensorUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_DFMA_TENSOR_UTIL,
Self::HmmaTensorUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_HMMA_TENSOR_UTIL,
Self::ImmaTensorUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_IMMA_TENSOR_UTIL,
Self::DramBwUtil => nvmlGpmMetricId_t_NVML_GPM_METRIC_DRAM_BW_UTIL,
Self::Fp64Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_FP64_UTIL,
Self::Fp32Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_FP32_UTIL,
Self::Fp16Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_FP16_UTIL,
Self::PcieTxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_PCIE_TX_PER_SEC,
Self::PcieRxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_PCIE_RX_PER_SEC,
Self::Nvdec0Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_0_UTIL,
Self::Nvdec1Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_1_UTIL,
Self::Nvdec2Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_2_UTIL,
Self::Nvdec3Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_3_UTIL,
Self::Nvdec4Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_4_UTIL,
Self::Nvdec5Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_5_UTIL,
Self::Nvdec6Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_6_UTIL,
Self::Nvdec7Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_7_UTIL,
Self::Nvjpg0Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_0_UTIL,
Self::Nvjpg1Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_1_UTIL,
Self::Nvjpg2Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_2_UTIL,
Self::Nvjpg3Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_3_UTIL,
Self::Nvjpg4Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_4_UTIL,
Self::Nvjpg5Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_5_UTIL,
Self::Nvjpg6Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_6_UTIL,
Self::Nvjpg7Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_7_UTIL,
Self::Nvofa0Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVOFA_0_UTIL,
Self::Nvofa1Util => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVOFA_1_UTIL,
Self::NvlinkTotalRxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC,
Self::NvlinkTotalTxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC,
Self::NvlinkL0RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L0_RX_PER_SEC,
Self::NvlinkL0TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L0_TX_PER_SEC,
Self::NvlinkL1RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L1_RX_PER_SEC,
Self::NvlinkL1TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L1_TX_PER_SEC,
Self::NvlinkL2RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L2_RX_PER_SEC,
Self::NvlinkL2TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L2_TX_PER_SEC,
Self::NvlinkL3RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L3_RX_PER_SEC,
Self::NvlinkL3TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L3_TX_PER_SEC,
Self::NvlinkL4RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L4_RX_PER_SEC,
Self::NvlinkL4TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L4_TX_PER_SEC,
Self::NvlinkL5RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L5_RX_PER_SEC,
Self::NvlinkL5TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L5_TX_PER_SEC,
Self::NvlinkL6RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L6_RX_PER_SEC,
Self::NvlinkL6TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L6_TX_PER_SEC,
Self::NvlinkL7RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L7_RX_PER_SEC,
Self::NvlinkL7TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L7_TX_PER_SEC,
Self::NvlinkL8RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L8_RX_PER_SEC,
Self::NvlinkL8TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L8_TX_PER_SEC,
Self::NvlinkL9RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L9_RX_PER_SEC,
Self::NvlinkL9TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L9_TX_PER_SEC,
Self::NvlinkL10RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L10_RX_PER_SEC,
Self::NvlinkL10TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L10_TX_PER_SEC,
Self::NvlinkL11RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L11_RX_PER_SEC,
Self::NvlinkL11TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L11_TX_PER_SEC,
Self::NvlinkL12RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L12_RX_PER_SEC,
Self::NvlinkL12TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L12_TX_PER_SEC,
Self::NvlinkL13RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L13_RX_PER_SEC,
Self::NvlinkL13TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L13_TX_PER_SEC,
Self::NvlinkL14RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L14_RX_PER_SEC,
Self::NvlinkL14TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L14_TX_PER_SEC,
Self::NvlinkL15RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L15_RX_PER_SEC,
Self::NvlinkL15TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L15_TX_PER_SEC,
Self::NvlinkL16RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L16_RX_PER_SEC,
Self::NvlinkL16TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L16_TX_PER_SEC,
Self::NvlinkL17RxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L17_RX_PER_SEC,
Self::NvlinkL17TxPerSec => nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L17_TX_PER_SEC,
}
}
}
impl TryFrom<c_uint> for GpmMetricId {
type Error = NvmlError;
fn try_from(data: c_uint) -> Result<Self, Self::Error> {
match data {
nvmlGpmMetricId_t_NVML_GPM_METRIC_GRAPHICS_UTIL => Ok(Self::GraphicsUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_SM_UTIL => Ok(Self::SmUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_SM_OCCUPANCY => Ok(Self::SmOccupancy),
nvmlGpmMetricId_t_NVML_GPM_METRIC_INTEGER_UTIL => Ok(Self::IntegerUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_ANY_TENSOR_UTIL => Ok(Self::AnyTensorUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_DFMA_TENSOR_UTIL => Ok(Self::DfmaTensorUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_HMMA_TENSOR_UTIL => Ok(Self::HmmaTensorUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_IMMA_TENSOR_UTIL => Ok(Self::ImmaTensorUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_DRAM_BW_UTIL => Ok(Self::DramBwUtil),
nvmlGpmMetricId_t_NVML_GPM_METRIC_FP64_UTIL => Ok(Self::Fp64Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_FP32_UTIL => Ok(Self::Fp32Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_FP16_UTIL => Ok(Self::Fp16Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_PCIE_TX_PER_SEC => Ok(Self::PcieTxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_PCIE_RX_PER_SEC => Ok(Self::PcieRxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_0_UTIL => Ok(Self::Nvdec0Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_1_UTIL => Ok(Self::Nvdec1Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_2_UTIL => Ok(Self::Nvdec2Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_3_UTIL => Ok(Self::Nvdec3Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_4_UTIL => Ok(Self::Nvdec4Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_5_UTIL => Ok(Self::Nvdec5Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_6_UTIL => Ok(Self::Nvdec6Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVDEC_7_UTIL => Ok(Self::Nvdec7Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_0_UTIL => Ok(Self::Nvjpg0Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_1_UTIL => Ok(Self::Nvjpg1Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_2_UTIL => Ok(Self::Nvjpg2Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_3_UTIL => Ok(Self::Nvjpg3Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_4_UTIL => Ok(Self::Nvjpg4Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_5_UTIL => Ok(Self::Nvjpg5Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_6_UTIL => Ok(Self::Nvjpg6Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVJPG_7_UTIL => Ok(Self::Nvjpg7Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVOFA_0_UTIL => Ok(Self::Nvofa0Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVOFA_1_UTIL => Ok(Self::Nvofa1Util),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_TOTAL_RX_PER_SEC => {
Ok(Self::NvlinkTotalRxPerSec)
}
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_TOTAL_TX_PER_SEC => {
Ok(Self::NvlinkTotalTxPerSec)
}
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L0_RX_PER_SEC => Ok(Self::NvlinkL0RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L0_TX_PER_SEC => Ok(Self::NvlinkL0TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L1_RX_PER_SEC => Ok(Self::NvlinkL1RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L1_TX_PER_SEC => Ok(Self::NvlinkL1TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L2_RX_PER_SEC => Ok(Self::NvlinkL2RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L2_TX_PER_SEC => Ok(Self::NvlinkL2TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L3_RX_PER_SEC => Ok(Self::NvlinkL3RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L3_TX_PER_SEC => Ok(Self::NvlinkL3TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L4_RX_PER_SEC => Ok(Self::NvlinkL4RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L4_TX_PER_SEC => Ok(Self::NvlinkL4TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L5_RX_PER_SEC => Ok(Self::NvlinkL5RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L5_TX_PER_SEC => Ok(Self::NvlinkL5TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L6_RX_PER_SEC => Ok(Self::NvlinkL6RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L6_TX_PER_SEC => Ok(Self::NvlinkL6TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L7_RX_PER_SEC => Ok(Self::NvlinkL7RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L7_TX_PER_SEC => Ok(Self::NvlinkL7TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L8_RX_PER_SEC => Ok(Self::NvlinkL8RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L8_TX_PER_SEC => Ok(Self::NvlinkL8TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L9_RX_PER_SEC => Ok(Self::NvlinkL9RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L9_TX_PER_SEC => Ok(Self::NvlinkL9TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L10_RX_PER_SEC => Ok(Self::NvlinkL10RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L10_TX_PER_SEC => Ok(Self::NvlinkL10TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L11_RX_PER_SEC => Ok(Self::NvlinkL11RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L11_TX_PER_SEC => Ok(Self::NvlinkL11TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L12_RX_PER_SEC => Ok(Self::NvlinkL12RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L12_TX_PER_SEC => Ok(Self::NvlinkL12TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L13_RX_PER_SEC => Ok(Self::NvlinkL13RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L13_TX_PER_SEC => Ok(Self::NvlinkL13TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L14_RX_PER_SEC => Ok(Self::NvlinkL14RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L14_TX_PER_SEC => Ok(Self::NvlinkL14TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L15_RX_PER_SEC => Ok(Self::NvlinkL15RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L15_TX_PER_SEC => Ok(Self::NvlinkL15TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L16_RX_PER_SEC => Ok(Self::NvlinkL16RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L16_TX_PER_SEC => Ok(Self::NvlinkL16TxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L17_RX_PER_SEC => Ok(Self::NvlinkL17RxPerSec),
nvmlGpmMetricId_t_NVML_GPM_METRIC_NVLINK_L17_TX_PER_SEC => Ok(Self::NvlinkL17TxPerSec),
_ => Err(NvmlError::UnexpectedVariant(data)),
}
}
}