#include #include #include #include struct GpuMetricsHeader_t { uint16_t structure_size; uint8_t format_revision; uint8_t content_revision; }; struct GpuMetrics_v1_1_t { uint16_t temperature_edge; uint16_t temperature_hotspot; uint16_t temperature_mem; uint16_t temperature_vrgfx; uint16_t temperature_vrsoc; uint16_t temperature_vrmem; uint16_t average_gfx_activity; uint16_t average_umc_activity; uint16_t average_mm_activity; uint16_t average_socket_power; uint64_t energy_accumulator; uint64_t system_clock_counter; uint16_t average_gfxclk_frequency; uint16_t average_socclk_frequency; uint16_t average_uclk_frequency; uint16_t average_vclk0_frequency; uint16_t average_dclk0_frequency; uint16_t average_vclk1_frequency; uint16_t average_dclk1_frequency; uint16_t current_gfxclk; uint16_t current_socclk; uint16_t current_uclk; uint16_t current_vclk0; uint16_t current_dclk0; uint16_t current_vclk1; uint16_t current_dclk1; uint32_t throttle_status; uint16_t current_fan_speed; uint16_t pcie_link_width; uint16_t pcie_link_speed; uint16_t padding; uint32_t gfx_activity_acc; uint32_t mem_activity_acc; uint16_t temperature_hbm; }; struct GpuMetrics_v1_3_t { uint16_t temperature_edge; uint16_t temperature_hotspot; uint16_t temperature_mem; uint16_t temperature_vrgfx; uint16_t temperature_vrsoc; uint16_t temperature_vrmem; uint16_t average_gfx_activity; uint16_t average_umc_activity; uint16_t average_mm_activity; uint16_t average_socket_power; uint64_t energy_accumulator; uint64_t system_clock_counter; uint16_t average_gfxclk_frequency; uint16_t average_socclk_frequency; uint16_t average_uclk_frequency; uint16_t average_vclk0_frequency; uint16_t average_dclk0_frequency; uint16_t average_vclk1_frequency; uint16_t average_dclk1_frequency; uint16_t current_gfxclk; uint16_t current_socclk; uint16_t current_uclk; uint16_t current_vclk0; uint16_t current_dclk0; uint16_t current_vclk1; uint16_t current_dclk1; uint32_t throttle_status; uint16_t current_fan_speed; uint16_t pcie_link_width; uint16_t pcie_link_speed; uint16_t padding; uint32_t gfx_activity_acc; uint32_t mem_activity_acc; uint16_t temperature_hbm; uint64_t firmware_timestamp; uint16_t voltage_soc; uint16_t voltage_gfx; uint16_t voltage_mem; uint8_t padding1; }; GpuMetricsHeader_t getGpuMetricsRev(std::string path) { GpuMetricsHeader_t header; std::ifstream f(path, std::ios::binary); if (f.good()) { f.read(reinterpret_cast(&header), sizeof(header)); std::cout << "[GpuMetrics] Read GpuMetrics format v" << std::to_string(header.format_revision) << "_" << std::to_string(header.content_revision); std::cout << ", size " << std::to_string(header.structure_size) << std::endl; } else { std::cerr << "[GpuMetrics] Error reading gpu metrics header" << std::endl; } return header; } auto getGpuMetrics(GpuMetricsHeader_t h, std::string path) { GpuMetrics_v1_3_t gpu; if (h.format_revision == 1 && h.content_revision == 3) { std::ifstream f(path, std::ios::binary); if (f.good()) { f.ignore(sizeof(h)); // skip header f.read(reinterpret_cast(&gpu), sizeof(gpu)); } } else { std::cout << "[GpuMetrics] read failed, unsupported format" << std::endl; } return gpu; } int main(int argc, char *argv[]) { std::string m = "/sys/devices/pci0000:00/0000:00:03.1/0000:08:00.0/0000:09:00.0/0000:0a:00.0/gpu_metrics"; GpuMetricsHeader_t h = getGpuMetricsRev(m); auto gpu = getGpuMetrics(h, m); std::cout << "temperature_edge: " << std::to_string(gpu.temperature_edge) << std::endl; std::cout << "temperature_hotspot: " << std::to_string(gpu.temperature_hotspot) << std::endl; std::cout << "temperature_mem: " << std::to_string(gpu.temperature_mem) << std::endl; std::cout << "temperature_vrgfx: " << std::to_string(gpu.temperature_vrgfx) << std::endl; std::cout << "temperature_vrsoc: " << std::to_string(gpu.temperature_vrsoc) << std::endl; std::cout << "temperature_vrmem: " << std::to_string(gpu.temperature_vrmem) << std::endl; std::cout << "average_gfx_activity: " << std::to_string(gpu.average_gfx_activity) << std::endl; std::cout << "average_umc_activity: " << std::to_string(gpu.average_umc_activity) << std::endl; std::cout << "average_mm_activity: " << std::to_string(gpu.average_mm_activity) << std::endl; std::cout << "average_socket_power: " << std::to_string(gpu.average_socket_power) << std::endl; std::cout << "energy_accumulator: " << std::to_string(gpu.energy_accumulator) << std::endl; std::cout << "system_clock_counter: " << std::to_string(gpu.system_clock_counter) << std::endl; std::cout << "average_gfxclk_frequency: " << std::to_string(gpu.average_gfxclk_frequency) << std::endl; std::cout << "average_socclk_frequency: " << std::to_string(gpu.average_socclk_frequency) << std::endl; std::cout << "average_uclk_frequency: " << std::to_string(gpu.average_uclk_frequency) << std::endl; std::cout << "average_vclk0_frequency: " << std::to_string(gpu.average_vclk0_frequency) << std::endl; std::cout << "average_dclk0_frequency: " << std::to_string(gpu.average_dclk0_frequency) << std::endl; std::cout << "average_vclk1_frequency: " << std::to_string(gpu.average_vclk1_frequency) << std::endl; std::cout << "average_dclk1_frequency: " << std::to_string(gpu.average_dclk1_frequency) << std::endl; std::cout << "current_gfxclk: " << std::to_string(gpu.current_gfxclk) << std::endl; std::cout << "current_socclk: " << std::to_string(gpu.current_socclk) << std::endl; std::cout << "current_uclk: " << std::to_string(gpu.current_uclk) << std::endl; std::cout << "current_vclk0: " << std::to_string(gpu.current_vclk0) << std::endl; std::cout << "current_dclk0: " << std::to_string(gpu.current_dclk0) << std::endl; std::cout << "current_vclk1: " << std::to_string(gpu.current_vclk1) << std::endl; std::cout << "current_dclk1: " << std::to_string(gpu.current_dclk1) << std::endl; std::cout << "throttle_status: " << std::to_string(gpu.throttle_status) << std::endl; std::cout << "current_fan_speed: " << std::to_string(gpu.current_fan_speed) << std::endl; std::cout << "pcie_link_width: " << std::to_string(gpu.pcie_link_width) << std::endl; std::cout << "pcie_link_speed: " << std::to_string(gpu.pcie_link_speed) << std::endl; std::cout << "gfx_activity_acc: " << std::to_string(gpu.gfx_activity_acc) << std::endl; std::cout << "mem_activity_acc: " << std::to_string(gpu.mem_activity_acc) << std::endl; std::cout << "temperature_hbm: " << std::to_string(gpu.temperature_hbm) << std::endl; std::cout << "firmware_timestamp: " << std::to_string(gpu.firmware_timestamp) << std::endl; std::cout << "voltage_soc: " << std::to_string(gpu.voltage_soc) << std::endl; std::cout << "voltage_gfx: " << std::to_string(gpu.voltage_gfx) << std::endl; std::cout << "voltage_mem: " << std::to_string(gpu.voltage_mem) << std::endl; return 0; }