Select Git revision
RaplImpl.cpp
-
Stefano Corda authoredStefano Corda authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
RaplImpl.cpp 6.71 KiB
#include <algorithm>
#include <iostream>
#include <fstream>
#include <stdexcept>
#include <unistd.h>
#include "RaplImpl.h"
namespace {
std::vector<int> GetActiveCPUs() {
cpu_set_t cpu_set;
CPU_ZERO(&cpu_set);
const int result = sched_getaffinity(0, sizeof(cpu_set), &cpu_set);
if (result == -1) {
throw std::system_error(errno, std::generic_category(),
"sched_getaffinity");
}
const int n_cpus = sysconf(_SC_NPROCESSORS_ONLN);
std::vector<int> active_cpus;
for (int cpu = 0; cpu < n_cpus; ++cpu) {
if (CPU_ISSET(cpu, &cpu_set)) {
active_cpus.push_back(cpu);
}
}
return active_cpus;
}
template <typename T>
void RemoveDuplicates(std::vector<T>& v) {
std::sort(v.begin(), v.end());
v.erase(std::unique(v.begin(), v.end()), v.end());
}
} // namespace
namespace pmt::rapl {
RaplState::operator pmt::State() {
State state;
state.timeAtRead = timeAtRead;
state.joulesAtRead = consumedEnergyTotal;
state.misc.reserve(measurements.size());
for (size_t i = 0; i < measurements.size(); i++) {
const rapl::RaplMeasurement& m = measurements[i];
const std::string name = m.name;
const double value = measurements[i].value;
state.misc.push_back({name, value});
}
return state;
}
RaplImpl::RaplImpl() {
Init();
StartThread();
}
RaplImpl::~RaplImpl() {
stopDumpThread();
StopThread();
}
std::vector<int> RaplImpl::DetectPackages() {
std::string filename;
std::ifstream file;
const int n_cpus = sysconf(_SC_NPROCESSORS_ONLN);