#include #include "nvidia-sensors.h" void init_nvml() { nvmlReturn_t result; result = nvmlInit_v2(); if (result != NVML_SUCCESS) printf("Could not init NVML: %s\n", nvmlErrorString(result)); } int get_nvml_handle(nvmlDevice_t *device, struct card_info *card) { nvmlReturn_t result; result = nvmlDeviceGetHandleByPciBusId_v2(card->pci_id, device); if (result != NVML_SUCCESS) { printf("Failed to get device handle for card at %s: %s\n", card->pci_id, nvmlErrorString(result)); return 0; } return 1; } void print_nvml_clock_reason(int compact, struct card_info *card) { unsigned long long reasons = get_nvml_clock_reasons(card); int single_reason = 1; for (int i = 0; i < (sizeof(clock_reason_names) / sizeof(struct clock_reason)); i++) { if (reasons & clock_reason_names[i].mask) { if (!single_reason) { if (compact) printf(","); else printf(", "); } single_reason = 0; if (compact) printf("%s", clock_reason_names[i].short_name); else printf("%s", clock_reason_names[i].long_name); } } if (single_reason) printf("None"); if (!compact) printf(" (0x%llx)", reasons); } unsigned int get_nvml_temp(struct card_info *card) { nvmlDevice_t nvml_device; if (!get_nvml_handle(&nvml_device, card)) return 0; unsigned int temp; nvmlReturn_t result = nvmlDeviceGetTemperature(nvml_device, NVML_TEMPERATURE_GPU, &temp); if (result != NVML_SUCCESS) { printf("Failed to get temperature for card at %s: %s\n", card->pci_id, nvmlErrorString(result)); return 0; } return temp; } unsigned long long get_nvml_clock_reasons(struct card_info *card) { nvmlDevice_t nvml_device; if (!get_nvml_handle(&nvml_device, card)) return 0; unsigned long long reasons; nvmlReturn_t result = nvmlDeviceGetCurrentClocksEventReasons(nvml_device, &reasons) ; if (result != NVML_SUCCESS) { printf("Failed to get clock reasons for card at %s: %s\n", card->pci_id, nvmlErrorString(result)); return 0; } return reasons; } unsigned int get_nvml_mem_util(struct card_info *card) { nvmlDevice_t nvml_device; if (!get_nvml_handle(&nvml_device, card)) return 0; nvmlUtilization_t util; nvmlReturn_t result = nvmlDeviceGetUtilizationRates(nvml_device, &util); if (result != NVML_SUCCESS) { printf("Failed to get clock reasons for card at %s: %s\n", card->pci_id, nvmlErrorString(result)); return 0; } return util.memory; }