Two defects of eoc's NVML path (feature cuda), both seen on jetson-hub's
RTX 4050 Laptop GPU (driver 595.84).
detect() ranked NVML first, so on a host with a live NVML counter every
consumer (eoc-cascade, eoc-local, eoc-streaming, eoc-agent) was handed the
GPU's counter and graded its advance Measured, with no coverage field to
say the CPU's share of the work went unread: on jetson-hub detect()
returned nvml over a live RAPL. By the family's rule a figure that does not
cover the work it is booked to is an estimate in a format without coverage.
detect() now has no NVML rung, and NvmlCounter is no longer a JouleCounter
(read_gpu_microjoules() reads it as GPU telemetry), so no consumer can grade
it Measured. JouleSource and the README say so.
And the counter does not count the board's energy while it is polled: at
the probe's 100 ms wait it ran at 81-136 W while the board drew 13-15 W
against a 65 W maximum limit. The probe now reads the board's draw with
each sample and its maximum power limit once (gpu_plausibility), and a
live counter past 1.5x the limit, past twice the mean draw plus 5 W, or
beside a draw reading past 1.5x the limit, is CounterStatus::Implausible
and NvmlCounter is not constructed.
Before: tests/nvml_hardware.rs failed on jetson-hub (status=Live against an
oracle verdict of Implausible, 119.4 W counter, 13-13.5 W draw;
detect()=nvml). After: status=Implausible, constructed=false,
detect()=rapl; 58 lib tests with cuda (57 without), the NVML and RAPL
hardware tests pass there with and without cuda.
Co-Authored-By: Claude Opus 5.5 <[email protected]>