LCOV - code coverage report
Current view: top level - Source - energyMonitor.hpp (source / functions) Coverage Total Hit
Test: coverage Lines: 0.0 % 1 0
Test Date: 2026-03-02 16:42:41 Functions: - 0 0

            Line data    Source code
       1              : #pragma once
       2              : 
       3              : #include "definition.hpp"
       4              : #include "distributed.h"
       5              : #include "logging.hpp"
       6              : 
       7              : /*!
       8              :  * Energy monitoring class using RAPL (Running Average Power Limit)
       9              :  * Monitors CPU and RAM power consumption on Linux systems
      10              :  */
      11            0 : struct EnergyDomain {
      12              :    std::string energy_path;
      13              :    std::string name;
      14              : };
      15              : 
      16              : struct PowerResult {
      17              :    double cpu_sum;
      18              :    double ram_sum;
      19              : };
      20              : 
      21              : struct CpuTimes {
      22              :    long long user, nice, system, idle, iowait, irq, softirq, steal;
      23              : };
      24              : 
      25              : class EnergyMonitor {
      26              :   public:
      27              :    explicit EnergyMonitor(int period_ms = 500);
      28              :    ~EnergyMonitor();
      29              : 
      30              :    // non copyable
      31              :    EnergyMonitor(const EnergyMonitor&) = delete;
      32              :    EnergyMonitor(const EnergyMonitor&&) = delete;
      33              :    EnergyMonitor& operator=(const EnergyMonitor&) = delete;
      34              :    EnergyMonitor& operator=(const EnergyMonitor&&) = delete;
      35              : 
      36              :    void start();
      37              :    void stop();
      38              : 
      39              :    [[nodiscard]] const Clock::time_point& getStartTime() const { return _startTime; }
      40              : 
      41              :    [[nodiscard]] double cpuW() const;
      42              :    [[nodiscard]] double ramW() const;
      43              : 
      44              : #ifdef WITH_MPI
      45              :    [[nodiscard]] PowerResult reducePower(int root = 0, MPI_Comm comm = MPI_COMM_WORLD) const;
      46              : #endif
      47              : 
      48              :    void reportPower(Logging::LogLevel level = Logging::logGUI) const;
      49              :    void reportEnergy(TimeType durationMs, Logging::LogLevel level = Logging::logGUI) const;
      50              :    void reportCost(TimeType durationMs, Logging::LogLevel level = Logging::logGUI) const;
      51              : 
      52              :   private:
      53              :    static constexpr double kWhPriceEuro = 0.2016;
      54              : 
      55              :    std::atomic<bool>   _running{false};
      56              :    std::thread         _worker;
      57              :    const int           _period;
      58              :    const int           _ncores_phys;
      59              :    Clock::time_point   _startTime;
      60              :    std::vector<EnergyDomain>      _domains;
      61              :    std::map<std::string,long long> _lastEnergy;
      62              :    std::atomic<double> _cpuWLocal{0.0};
      63              :    std::atomic<double> _ramWLocal{0.0};
      64              : 
      65              :    static CpuTimes readCpuTimes();
      66              :    [[nodiscard]] static double computeLoadFraction(const CpuTimes& prev, const CpuTimes& cur);
      67              :    [[nodiscard]] static int countPhysicalCores();
      68              :    [[nodiscard]] static long long readUj(const char* path);
      69              :    [[nodiscard]] static std::string readFile(const std::string& path);
      70              :    static void warnPermission(const std::string& p);
      71              :    [[nodiscard]] std::vector<EnergyDomain> findEnergyDomains() const;
      72              :    void loop();
      73              :    void reportValues(double cpu, double ram, const std::string& unit, Logging::LogLevel level) const;
      74              : };
      75              : 
      76              : // Global accessor functions
      77              : EnergyMonitor* getEnergyMonitor();
      78              : void initEnergyMonitor(int period_ms = 500);
      79              : void finalizeEnergyMonitor();
        

Generated by: LCOV version 2.0-1