geopm::MSRIOGroup – IOGroup providing MSR-based signals and controls
Synopsis
#include <MSRIOGroup.hpp>
Link with -lgeopmd
set<string> MSRIOGroup::signal_names(void) const override;
set<string> MSRIOGroup::control_names(void) const override;
bool MSRIOGroup::is_valid_signal(const string &signal_name) const override;
bool MSRIOGroup::is_valid_control(const string &control_name) const override;
int MSRIOGroup::signal_domain_type(const string &signal_name) const override;
int MSRIOGroup::control_domain_type(const string &control_name) const override;
int MSRIOGroup::push_signal(const string &signal_name,
int domain_type,
int domain_idx) override;
int MSRIOGroup::push_control(const string &control_name,
int domain_type,
int domain_idx) override;
void MSRIOGroup::read_batch(void) override;
void MSRIOGroup::write_batch(void) override;
double MSRIOGroup::sample(int sample_idx) override;
void MSRIOGroup::adjust(int control_idx,
double setting) override;
double MSRIOGroup::read_signal(const string &signal_name,
int domain_type,
int domain_idx) override;
void MSRIOGroup::write_control(const string &control_name,
int domain_type,
int domain_idx,
double setting) override;
void MSRIOGroup::save_control(void) override;
void MSRIOGroup::restore_control(void) override;
function<double(const vector<double> &)> MSRIOGroup::agg_function(const string &signal_name) const override;
function<string(double)> MSRIOGroup::format_function(const string &signal_name) const override;
string MSRIOGroup::signal_description(const string &signal_name) const override;
string MSRIOGroup::control_description(const string &control_name) const override;
int MSRIOGroup::signal_behavior(const string &signal_name) const override;
void MSRIOGroup::save_control(const string &save_path) override;
void MSRIOGroup::restore_control(const string &save_path) override;
string MSRIOGroup::name(void) const override;
void MSRIOGroup::parse_json_msrs(const string &str);
static string MSRIOGroup::msr_allowlist(int cpuid);
static int MSRIOGroup::cpuid(void);
static string MSRIOGroup::plugin_name(void);
static unique_ptr<IOGroup> MSRIOGroup::make_plugin(void);
Description
The MSRIOGroup implements the geopm::IOGroup(3) interface to provide hardware signals and controls using MSRs on Intel platforms. It relies on geopm_pio_msr(7) and geopm::MSRIO(3).
Class Methods
signal_names()
Returns the list of signal names provided by this
IOGroup
. This includes aliases for common hardware-based signals such asCPU_FREQUENCY_STATUS
, as well as the supported MSRs for the current platform.control_names()
Returns the list of control names provided by this
IOGroup
. This includes aliases for common hardware-based controls such asCPU_FREQUENCY_MAX_CONTROL
, as well as the supported MSRs for the current platform.is_valid_signal()
Returns whether the given signal_name is supported by the
MSRIOGroup
for the current platform. Note that different platforms may have different supported MSRs.is_valid_control()
Returns whether the given control_name is supported by the
MSRIOGroup
for the current platform. Note that different platforms may have different supported MSRs.signal_domain_type()
Returns the domain type for the signal specified by signal_name. The domain for a signal may be different on different platforms.
control_domain_type()
Returns the domain type for the control specified by control_name. The domain for a control may be different on different platforms.
push_signal()
Adds the signal specified by signal_name for domain_type at index domain_idx to the list of signals to be read during
read_batch()
. If the domain of a signal spans multiple Linux logical CPUs, only one CPU from that domain will be read, since all CPUs from the same domain and index will return the same value.push_control()
Adds the control specified by control_name for domain_type at index domain_idx to the list of controls to be written during
write_batch()
. If the domain of a control spans multiple Linux logical CPUs, values written to that control will be written to all CPUs in the domain.read_batch()
Sets up geopm::MSRIO(3) for batch reading if needed, then reads all pushed signals through the
MSRIO::read_batch()
method.write_batch()
Writes all adjusted values through the geopm::MSRIO(3)
write_batch()
method.sample()
Returns the value of the signal specified by a sample_idx returned from
push_signal()
. The value will have been updated by the most recent call toread_batch()
.adjust()
Sets the control specified by a control_idx returned from
push_control()
to the value setting. The value will be written to the underlying MSR by the next call towrite_batch()
.read_signal()
Immediately read and decode the underlying MSR supporting signal_name for domain_type at index domain_idx and return the result in SI units.
write_control()
Immediately encode the SI unit value setting and write the correct bits of the MSR supporting control_name for domain_type at domain_idx.
save_control()
Attempts to read and save the current values of all control MSRs for the platform. If any control is not able to be read, it will be skipped.
restore_control()
Using the values saved by
save_control()
, attempts to write back the original values of all control MSRs. Any control that is not able to be written will be skipped.agg_function()
Returns the function that should be used to aggregate signal_name. If one was not previously specified by this class, the default function is
select_first()
from geopm::Agg(3). Throws an exception if the signal_name is not valid.format_function()
Returns the function that should be used to format the signal_name. If the signal_name string ends with a
'#'
character, the function returned isstring_format_raw64()
. Throws an exception if the signal_name is not valid or if the signal_name was not found.signal_description()
Returns a string description for signal_name, if defined. Further descriptions of MSR signals can be found in The Intel Software Developer’s Manual
control_description()
Returns a string description for control_name, if defined. Further descriptions of MSR controls can be found in The Intel Software Developer’s Manual
signal_behavior()
Returns one of the
IOGroup::signal_behavior_e
values which describes about how a signal will change as a function of time. This can be used when generating reports to decide how to summarize a signal’s value for the entire application run.parse_json_msrs()
Parse a JSON string and add any raw MSRs and fields as available signals and controls.
name()
Calls
plugin_name()
internally.msr_allowlist()
Fill string with the
msr-safe
allowlist
file contents reflecting all known MSRs for the current platform, or if cpuid is provided, for the platform specified by cpuid. Returns a string formatted to be written to anmsr-safe
allowlist
file.cpuid()
Get the
cpuid
of the current platform.plugin_name()
Returns the name of the plugin to use when this plugin is registered with the
IOGroup
factory; see geopm::PluginFactory(3) for more details.make_plugin()
Returns a pointer to a new
MSRIOGroup
object; see geopm::PluginFactory(3) for more details.
Enum Type
enum m_cpuid_e {
M_CPUID_SNB = 0x62D,
M_CPUID_IVT = 0x63E,
M_CPUID_HSX = 0x63F,
M_CPUID_BDX = 0x64F,
M_CPUID_KNL = 0x657,
M_CPUID_SKX = 0x655,
M_CPUID_ICX = 0x66A,
};
enum m_cpuid_e
Contains the list of currently-supported
cpuid
values. Thecpuid
can be determined by runninglscpu
and appending the CPU family in hex to the Model in hex.
Environment
If the GEOPM_MSR_CONFIG_PATH
environment variable is set to a
colon-separated list of paths, the paths will be checked for files
starting with msr_
and ending in .json
. The /etc/geopm
directory
will also be searched. The MSRIOGroup
will attempt to load additional
MSR definitions from any JSON file it finds. The files must follow this
schema:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "https://geopm.github.io/msrs.schema.json",
"title": "MSR specification",
"definitions" : {
"msrFields": {
"type": "object",
"properties": {
"begin_bit": {
"type": "integer"
},
"end_bit": {
"type": "integer"
},
"function": {
"enum": ["scale", "log_half", "7_bit_float", "overflow", "logic"]
},
"units": {
"enum": ["none", "seconds", "hertz", "watts", "joules", "celsius", "amperes", "volts"]
},
"scalar": {
"type": "number"
},
"behavior": {
"enum": ["constant", "monotone", "variable", "label"]
},
"writeable": {
"type": "boolean"
},
"aggregation": {
"enum": ["sum", "average", "median", "logical_and", "logical_or", "region_hash", "region_hint", "min", "max", "stddev", "select_first", "expect_same"]
},
"description": {
"type": "string"
}
},
"required": ["begin_bit", "end_bit", "function", "scalar", "units", "writeable", "behavior", "aggregation"],
"additionalProperties": false
},
"msrObject": {
"type": "object",
"properties": {
"offset": {
"type": "string"
},
"domain": {
"enum": ["board", "package", "core", "cpu", "memory", "package_integrated_memory", "nic", "package_integrated_nic", "gpu", "package_integrated_gpu", "gpu_chip"]
},
"fields": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/msrFields"
}
}
},
"required": ["offset", "domain", "fields"],
"additionalProperties": false
}
},
"type": "object",
"properties": {
"msrs": {
"type": "object",
"additionalProperties": {
"$ref": "#/definitions/msrObject"
}
}
},
"additionalProperties": false
}
See Also
geopm(7), geopm::IOGroup(3), geopm_pio_msr(7), geopm::MSRIO(3), geopmlaunch(1)