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();
|