Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions service/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,10 @@ libgeopmd_la_SOURCES = $(include_HEADERS) \
src/TimeSignal.cpp \
src/TimeSignal.hpp \
src/TimeZero.cpp \
src/VariorumIOGroup.cpp \
src/VariorumIOGroup.hpp \
src/VariorumJSONIO.cpp \
src/VariorumJSONIO.hpp \
src/geopm_hash.c \
src/geopm_plugin.cpp \
src/geopm_sched.c \
Expand Down
7 changes: 7 additions & 0 deletions service/src/IOGroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
#ifdef GEOPM_ENABLE_NVML
#include "NVMLIOGroup.hpp"
#endif
#ifdef GEOPM_VARIORUM_IOGROUP
#include "VariorumIOGroup.hpp"
#endif
#ifdef GEOPM_ENABLE_LEVELZERO
#include "LevelZeroIOGroup.hpp"
#endif
Expand Down Expand Up @@ -114,6 +117,10 @@ namespace geopm
register_plugin(NVMLIOGroup::plugin_name(),
NVMLIOGroup::make_plugin);
#endif
#ifdef GEOPM_VARIORUM_IOGROUP
register_plugin(VariorumIOGroup::plugin_name(),
VariorumIOGroup::make_plugin);
#endif
#ifdef GEOPM_ENABLE_LEVELZERO
register_plugin(LevelZeroIOGroup::plugin_name(),
LevelZeroIOGroup::make_plugin);
Expand Down
69 changes: 34 additions & 35 deletions service/src/VariorumIOGroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@

namespace geopm
{
static const std::string FRESHNESS_FILE_NAME("freshness");
static const std::string RAW_SCAN_HZ_FILE_NAME("raw_scan_hz");
// static const std::string FRESHNESS_FILE_NAME("freshness");
// static const std::string RAW_SCAN_HZ_FILE_NAME("raw_scan_hz");

static std::function<double()> get_formatted_file_reader(const std::string &path,
const std::string &units)
Expand All @@ -37,15 +37,13 @@ namespace geopm
}

VariorumIOGroup::VariorumIOGroup(const std::string &cpu_info_path)
: m_signal_available({{"Variorum::CPU_POWER", {
: m_signal_index_map({{"Variorum::CPU_POWER", {
"Point in time power",
Agg::sum,
string_format_integer,
get_formatted_file_reader(cpu_info_path + "/power", "W"),
false,
variorum_get_node_power_json,
true,
NAN,
M_UNITS_WATTS,
IOGroup::M_SIGNAL_BEHAVIOR_VARIABLE}},
}},
})
, m_time_zero(geopm::time_zero())
{
Expand All @@ -59,20 +57,20 @@ namespace geopm
m_initial_freshness =
read_double_from_file(cpu_info_path + "/" + FRESHNESS_FILE_NAME, "");

for (const auto &signal : m_signal_available) {
for (const auto &signal : m_signal_index_map) {
// Attempt to call each of the read functions so we can fail
// construction of this IOGroup if it isn't supported.
signal.second.m_read_function();
}

register_signal_alias("BOARD_POWER", "Variorum::BOARD_POWER");
register_signal_alias("BOARD_ENERGY", "Variorum::BOARD_ENERGY");
register_signal_alias("CPU_POWER", "Variorum::CPU_POWER");
// register_signal_alias("BOARD_ENERGY", "Variorum::BOARD_ENERGY");
}

std::set<std::string> VariorumIOGroup::signal_names(void) const
{
std::set<std::string> names;
for (const auto &sv : m_signal_available) {
for (const auto &sv : m_signal_index_map) {
names.insert(sv.first);
}
return names;
Expand All @@ -85,7 +83,7 @@ namespace geopm

bool VariorumIOGroup::is_valid_signal(const std::string &signal_name) const
{
return m_signal_available.find(signal_name) != m_signal_available.end();
return m_signal_index_map.find(signal_name) != m_signal_index_map.end();
}

bool VariorumIOGroup::is_valid_control(const std::string &control_name) const
Expand All @@ -95,7 +93,7 @@ namespace geopm

int VariorumIOGroup::signal_domain_type(const std::string &signal_name) const
{
return is_valid_signal(signal_name) ? GEOPM_DOMAIN_BOARD : GEOPM_DOMAIN_INVALID;
return is_valid_signal(signal_name) ? GEOPM_DOMAIN_PACKAGE : GEOPM_DOMAIN_INVALID;
}

int VariorumIOGroup::control_domain_type(const std::string &control_name) const
Expand All @@ -111,14 +109,14 @@ namespace geopm
"not valid for VariorumIOGroup",
GEOPM_ERROR_INVALID, __FILE__, __LINE__);
}
else if (domain_type != GEOPM_DOMAIN_BOARD) {
else if (domain_type != GEOPM_DOMAIN_PACKAGE) {
throw Exception("VariorumIOGroup::push_signal(): domain_type " + std::to_string(domain_type) +
"not valid for VariorumIOGroup",
GEOPM_ERROR_INVALID, __FILE__, __LINE__);
}

m_signal_available[signal_name].m_do_read = true;
return std::distance(m_signal_available.begin(), m_signal_available.find(signal_name));
m_signal_index_map[signal_name].m_do_read = true;
return std::distance(m_signal_index_map.begin(), m_signal_index_map.find(signal_name));
}

int VariorumIOGroup::push_control(const std::string &control_name,
Expand All @@ -130,7 +128,8 @@ namespace geopm

void VariorumIOGroup::read_batch(void)
{
for (auto &signal : m_signal_available) {
m_is_batch_read = true;
for (auto &signal : m_signal_index_map) {
if (signal.second.m_do_read) {
signal.second.m_value = signal.second.m_read_function();
}
Expand All @@ -142,8 +141,8 @@ namespace geopm
double VariorumIOGroup::sample(int batch_idx)
{
double result = NAN;
auto res_it = m_signal_available.begin();
if (batch_idx >= 0 && batch_idx < static_cast<int>(m_signal_available.size())) {
auto res_it = m_signal_index_map.begin();
if (batch_idx >= 0 && batch_idx < static_cast<int>(m_signal_index_map.size())) {
std::advance(res_it, batch_idx);
if(res_it->second.m_do_read) {
result = res_it->second.m_value;
Expand Down Expand Up @@ -181,7 +180,7 @@ namespace geopm
"not valid for VariorumIOGroup",
GEOPM_ERROR_INVALID, __FILE__, __LINE__);
}
return m_signal_available.find(signal_name)->second.m_read_function();
return m_signal_index_map.find(signal_name)->second.m_read_function();
}

void VariorumIOGroup::write_control(const std::string &control_name,
Expand All @@ -200,8 +199,8 @@ namespace geopm
std::function<double(const std::vector<double> &)>
VariorumIOGroup::agg_function(const std::string &signal_name) const
{
auto it = m_signal_available.find(signal_name);
if (it == m_signal_available.end()) {
auto it = m_signal_index_map.find(signal_name);
if (it == m_signal_index_map.end()) {
throw Exception("VariorumIOGroup::agg_function(): unknown how to aggregate \"" +
signal_name + "\"",
GEOPM_ERROR_INVALID, __FILE__, __LINE__);
Expand All @@ -212,8 +211,8 @@ namespace geopm
std::function<std::string(double)>
VariorumIOGroup::format_function(const std::string &signal_name) const
{
auto it = m_signal_available.find(signal_name);
if (it == m_signal_available.end()) {
auto it = m_signal_index_map.find(signal_name);
if (it == m_signal_index_map.end()) {
throw Exception("VariorumIOGroup::format_function(): unknown how to format \"" +
signal_name + "\"",
GEOPM_ERROR_INVALID, __FILE__, __LINE__);
Expand All @@ -230,8 +229,8 @@ namespace geopm
}

std::string result = "Invalid signal description: no description found.";
auto it = m_signal_available.find(signal_name);
if (it != m_signal_available.end()) {
auto it = m_signal_index_map.find(signal_name);
if (it != m_signal_index_map.end()) {
result = " description: " + it->second.m_description + '\n'; // Includes alias_for if applicable
result += " units: " + IOGroup::units_to_string(it->second.m_units) + '\n';
result += " aggregation: " + Agg::function_to_name(it->second.m_agg_function) + '\n';
Expand Down Expand Up @@ -263,8 +262,8 @@ namespace geopm
GEOPM_ERROR_INVALID, __FILE__, __LINE__);
}
int result = -1;
auto it = m_signal_available.find(signal_name);
if (it != m_signal_available.end()) {
auto it = m_signal_index_map.find(signal_name);
if (it != m_signal_index_map.end()) {
result = it->second.m_behavior;
}
#ifdef GEOPM_DEBUG
Expand Down Expand Up @@ -300,20 +299,20 @@ namespace geopm
void VariorumIOGroup::register_signal_alias(const std::string &alias_name,
const std::string &signal_name)
{
if (m_signal_available.find(alias_name) != m_signal_available.end()) {
if (m_signal_index_map.find(alias_name) != m_signal_index_map.end()) {
throw Exception("VariorumIOGroup::register_signal_alias(): signal_name " + alias_name +
" was previously registered.",
GEOPM_ERROR_INVALID, __FILE__, __LINE__);
}
auto it = m_signal_available.find(signal_name);
if (it == m_signal_available.end()) {
auto it = m_signal_index_map.find(signal_name);
if (it == m_signal_index_map.end()) {
// skip adding an alias if underlying signal is not found
return;
}
// copy signal info but append to description
m_signal_available[alias_name] = it->second;
m_signal_available[alias_name].m_description =
m_signal_available[signal_name].m_description + '\n' + " alias_for: " + signal_name;
m_signal_index_map[alias_name] = it->second;
m_signal_index_map[alias_name].m_description =
m_signal_index_map[signal_name].m_description + '\n' + " alias_for: " + signal_name;
}

void VariorumIOGroup::save_control(const std::string &save_path)
Expand Down
32 changes: 16 additions & 16 deletions service/src/VariorumIOGroup.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
* Copyright (c) 2015 - 2023, Intel Corporation
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef CNLIOGROUP_HPP_INCLUDE
#define CNLIOGROUP_HPP_INCLUDE
#ifndef VARIORUMIOGROUP_HPP_INCLUDE
#define VARIORUMIOGROUP_HPP_INCLUDE

#include <functional>
#include <map>
Expand All @@ -15,20 +15,20 @@ namespace geopm
{
/// @brief IOGroup that wraps interfaces to Compute Node Linux.
///
/// @details The CNLIOGroup provides board-level energy counters from Compute Node Linux
/// @details The VariorumIOGroup provides board-level energy counters from Compute Node Linux
/// as signals. These values are obtained through the proc(5)
class CNLIOGroup : public IOGroup
class VariorumIOGroup : public IOGroup
{
public:
CNLIOGroup();
CNLIOGroup(const std::string &pm_counters_path);
virtual ~CNLIOGroup() = default;
VariorumIOGroup();
VariorumIOGroup(const std::string &pm_counters_path);
virtual ~VariorumIOGroup() = default;
/// @return the list of signal names provided by this IOGroup.
std::set<std::string> signal_names(void) const override;
/// @return empty set; this IOGroup does not provide any controls.
std::set<std::string> control_names(void) const override;
/// @return whether the given signal_name is supported by the
/// CNLIOGroup for the current platform.
/// VariorumIOGroup for the current platform.
bool is_valid_signal(const std::string &signal_name) const override;
/// @return false; this IOGroup does not provide any controls.
bool is_valid_control(const std::string &control_name) const override;
Expand All @@ -50,7 +50,7 @@ namespace geopm
int domain_idx) override;
/// @brief Should not be called; this IOGroup does not provide any controls.
///
/// @throws geopm::Exception there are no controls supported by the CNLIOGroup
/// @throws geopm::Exception there are no controls supported by the VariorumIOGroup
int push_control(const std::string &control_name, int domain_type,
int domain_idx) override;
/// @brief Read all pushed signals from the platform so that the next call to
Expand All @@ -69,7 +69,7 @@ namespace geopm
double sample(int batch_idx) override;
/// @brief Should not be called; this IOGroup does not provide any controls.
///
/// @throws geopm::Exception there are no controls supported by the CNLIOGroup
/// @throws geopm::Exception there are no controls supported by the VariorumIOGroup
void adjust(int batch_idx, double setting) override;
/// @param signal_name Specifies the name of the signal whose value you want to get.
///
Expand All @@ -86,7 +86,7 @@ namespace geopm
int domain_idx) override;
/// @brief Should not be called; this IOGroup does not provide any controls.
///
/// @throws geopm::Exception there are no controls supported by the CNLIOGroup
/// @throws geopm::Exception there are no controls supported by the VariorumIOGroup
void write_control(const std::string &control_name, int domain_type,
int domain_idx, double setting) override;
/// @brief Does nothing; this IOGroup does not provide any controls.
Expand All @@ -109,7 +109,7 @@ namespace geopm
std::string signal_description(const std::string &signal_name) const override;
/// @brief Should not be called; this IOGroup does not provide any controls.
///
/// @throws geopm::Exception there are no controls supported by the CNLIOGroup
/// @throws geopm::Exception there are no controls supported by the VariorumIOGroup
std::string control_description(const std::string &control_name) const override;
/// @return one of the IOGroup::signal_behavior_e values which
/// describes about how a signal will change as a function of time.
Expand All @@ -132,7 +132,7 @@ namespace geopm
///
/// @see geopm::PluginFactory
static std::string plugin_name(void);
/// @return a pointer to a new CNLIOGroup object
/// @return a pointer to a new VariorumIOGroup object
///
/// @see geopm::PluginFactory
static std::unique_ptr<IOGroup> make_plugin(void);
Expand All @@ -142,13 +142,13 @@ namespace geopm

struct m_signal_info_s {
std::string m_description;
std::function<double(const std::vector<double> &)> m_agg_function;
std::function<std::string(double)> m_format_function;
// std::function<double(const std::vector<double> &)> m_agg_function;
// std::function<std::string(double)> m_format_function;
std::function<double()> m_read_function;
bool m_do_read;
double m_value;
int m_units;
int m_behavior;
// int m_behavior;
};
std::map<std::string, m_signal_info_s> m_signal_available;

Expand Down
Loading