diff --git a/audit/bee b/audit/bee index 56d58b5..b4b6b5b 100755 Binary files a/audit/bee and b/audit/bee differ diff --git a/audit/internal/platform/benchmark.go b/audit/internal/platform/benchmark.go index 61bb493..3e06579 100644 --- a/audit/internal/platform/benchmark.go +++ b/audit/internal/platform/benchmark.go @@ -3126,7 +3126,7 @@ func runBenchmarkPowerCalibration( if defaultLimitW <= 0 { defaultLimitW = originalLimitW } - appliedLimitW := originalLimitW + appliedLimitW := initialBenchmarkCalibrationLimitW(info) if appliedLimitW <= 0 { appliedLimitW = defaultLimitW } @@ -3475,6 +3475,24 @@ func roundTo5W(w int) int { return ((w + 2) / 5) * 5 } +func initialBenchmarkCalibrationLimitW(info benchmarkGPUInfo) int { + defaultLimitW := int(math.Round(info.DefaultPowerLimitW)) + currentLimitW := int(math.Round(info.PowerLimitW)) + maxLimitW := int(math.Round(info.MaxPowerLimitW)) + + startW := defaultLimitW + if startW <= 0 { + startW = currentLimitW + } + if startW <= 0 { + startW = maxLimitW + } + if maxLimitW > 0 && startW > maxLimitW { + startW = maxLimitW + } + return startW +} + // meanFanRPM returns the average RPM across a set of fan readings. func meanFanRPM(fans []FanReading) float64 { if len(fans) == 0 { diff --git a/audit/internal/platform/benchmark_test.go b/audit/internal/platform/benchmark_test.go index 19671d9..b2293c7 100644 --- a/audit/internal/platform/benchmark_test.go +++ b/audit/internal/platform/benchmark_test.go @@ -197,6 +197,59 @@ func TestNormalizeNvidiaBenchmarkOptionsPreservesRunNCCLChoice(t *testing.T) { } } +func TestInitialBenchmarkCalibrationLimitW(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + info benchmarkGPUInfo + want int + }{ + { + name: "prefers default tdp over current derated limit", + info: benchmarkGPUInfo{ + PowerLimitW: 500, + DefaultPowerLimitW: 600, + MaxPowerLimitW: 600, + }, + want: 600, + }, + { + name: "caps default tdp to reported max limit", + info: benchmarkGPUInfo{ + PowerLimitW: 500, + DefaultPowerLimitW: 700, + MaxPowerLimitW: 650, + }, + want: 650, + }, + { + name: "falls back to current limit when default missing", + info: benchmarkGPUInfo{ + PowerLimitW: 525, + MaxPowerLimitW: 600, + }, + want: 525, + }, + { + name: "falls back to max limit when only that is known", + info: benchmarkGPUInfo{ + MaxPowerLimitW: 575, + }, + want: 575, + }, + } + + for _, tc := range cases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + if got := initialBenchmarkCalibrationLimitW(tc.info); got != tc.want { + t.Fatalf("initialBenchmarkCalibrationLimitW(%+v)=%d want %d", tc.info, got, tc.want) + } + }) + } +} + func TestParseBenchmarkBurnLog(t *testing.T) { t.Parallel()