in pkg/gpu/nvidia/metrics/util.go [97:113]
func AverageGPUUtilization(uuid string, since time.Duration) (uint, error) {
lastTs := C.ulonglong(time.Now().Add(-1*since).UnixNano() / 1000)
uuidCStr := C.CString(uuid)
var util C.uint
var sum C.uint
var sampleCount C.uint
r := C.nvmlDeviceGetAverageUsage(uuidCStr, lastTs, &util, &sum, &sampleCount)
C.free(unsafe.Pointer(uuidCStr))
if r != C.NVML_SUCCESS {
return 0, fmt.Errorf("failed to get GPU utilization for device %s, nvml return code: %v", uuid, r)
}
averageUtilization := uint(util)
if averageUtilization > 100 || averageUtilization < 0 {
return 0, fmt.Errorf("failed to get GPU utilization for device %s, out of range [0, 100] utilization: %d, sum: %d, sampleCount: %d", uuid, averageUtilization, uint(sum), uint(sampleCount))
}
return averageUtilization, nil
}