]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
gpu_sysman: use counter_diff() to handle counter overflow
authorEero Tamminen <eero.t.tamminen@intel.com>
Fri, 23 Feb 2024 14:54:13 +0000 (16:54 +0200)
committerMatthias Runge <mrunge@matthias-runge.de>
Tue, 14 May 2024 15:40:45 +0000 (17:40 +0200)
Assumes overflowing counters to be either at 32-bit or 64-bit,
which should cover most common cases, as long as overflow happens
at max once during query period.

Signed-off-by: Eero Tamminen <eero.t.tamminen@intel.com>
src/gpu_sysman.c

index 3533c50c00562c2c10094b2d9a12c88cfd2d8a35..0b46e96ef262f9cae0c7ab06cadd2d25fc207c2e 100644 (file)
@@ -1416,9 +1416,9 @@ static bool gpu_mems_bw(gpu_device_t *gpu) {
         (config.output & (OUTPUT_RATIO | OUTPUT_RATE))) {
       /* https://spec.oneapi.com/level-zero/latest/sysman/api.html#_CPPv419zes_mem_bandwidth_t
        */
-      uint64_t writes = bw.writeCounter - old->writeCounter;
-      uint64_t reads = bw.readCounter - old->readCounter;
-      uint64_t timediff = bw.timestamp - old->timestamp;
+      counter_t writes = counter_diff(old->writeCounter, bw.writeCounter);
+      counter_t reads = counter_diff(old->readCounter, bw.readCounter);
+      counter_t timediff = counter_diff(old->timestamp, bw.timestamp);
 
       if (config.output & OUTPUT_RATE) {
         double factor = 1.0e6 / timediff;
@@ -2121,9 +2121,9 @@ static bool gpu_fabrics(gpu_device_t *gpu) {
         (config.output & (OUTPUT_RATIO | OUTPUT_RATE))) {
       /* https://spec.oneapi.io/level-zero/latest/sysman/api.html#zes-fabric-port-throughput-t
        */
-      uint64_t writes = bw.txCounter - old->txCounter;
-      uint64_t reads = bw.rxCounter - old->rxCounter;
-      uint64_t timediff = bw.timestamp - old->timestamp;
+      counter_t writes = counter_diff(old->txCounter, bw.txCounter);
+      counter_t reads = counter_diff(old->rxCounter, bw.rxCounter);
+      counter_t timediff = counter_diff(old->timestamp, bw.timestamp);
 
       if (config.output & OUTPUT_RATE) {
         double factor = 1.0e6 / timediff;
@@ -2237,8 +2237,8 @@ static bool gpu_powers(gpu_device_t *gpu) {
     if (old->timestamp && counter.timestamp > old->timestamp &&
         (config.output & (OUTPUT_RATIO | OUTPUT_RATE))) {
 
-      uint64_t energy_diff = counter.energy - old->energy;
-      double time_diff = counter.timestamp - old->timestamp;
+      counter_t energy_diff = counter_diff(old->energy, counter.energy);
+      double time_diff = counter_diff(old->timestamp, counter.timestamp);
 
       if (config.output & OUTPUT_RATE) {
         /* microJoules / microSeconds => watts */