
http://www.open-mpi.org/community/lists/devel/2014/05/14822.php Revamp the ORTE global data structures to reduce memory footprint and add new features. Add ability to control/set cpu frequency, though this can only be done if the sys admin has setup the system to support it (or you run as root). This commit was SVN r31916.
123 строки
4.7 KiB
C
123 строки
4.7 KiB
C
/*
|
|
* Copyright (c) 2014 Intel, Inc. All rights reserved
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "orte_config.h"
|
|
#include "orte/constants.h"
|
|
|
|
#include "opal/mca/base/base.h"
|
|
|
|
#include "orte/util/show_help.h"
|
|
|
|
#include "rtc_freq.h"
|
|
|
|
/*
|
|
* Local functions
|
|
*/
|
|
|
|
static int rtc_freq_query(mca_base_module_t **module, int *priority);
|
|
static int rtc_freq_register(void);
|
|
|
|
static int my_priority;
|
|
|
|
orte_rtc_freq_component_t mca_rtc_freq_component = {
|
|
{
|
|
{
|
|
ORTE_RTC_BASE_VERSION_1_0_0,
|
|
|
|
"freq", /* MCA component name */
|
|
ORTE_MAJOR_VERSION, /* MCA component major version */
|
|
ORTE_MINOR_VERSION, /* MCA component minor version */
|
|
ORTE_RELEASE_VERSION, /* MCA component release version */
|
|
NULL, /* component open */
|
|
NULL, /* component close */
|
|
rtc_freq_query, /* component query */
|
|
rtc_freq_register /* component register */
|
|
},
|
|
{
|
|
/* The component is checkpoint ready */
|
|
MCA_BASE_METADATA_PARAM_CHECKPOINT
|
|
}
|
|
}
|
|
};
|
|
|
|
static char *freq;
|
|
|
|
static int rtc_freq_register(void)
|
|
{
|
|
mca_base_component_t *c = &mca_rtc_freq_component.super.base_version;
|
|
|
|
/* ordering here doesn't really matter */
|
|
my_priority = 50;
|
|
(void) mca_base_component_var_register (c, "priority", "Priority of the FREQ rtc component",
|
|
MCA_BASE_VAR_TYPE_INT, NULL, 0, 0,
|
|
OPAL_INFO_LVL_9,
|
|
MCA_BASE_VAR_SCOPE_READONLY,
|
|
&my_priority);
|
|
|
|
mca_rtc_freq_component.governor = NULL;
|
|
(void) mca_base_component_var_register (c, "governor", "Governor to be used by default (default: system setting)",
|
|
MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
|
|
OPAL_INFO_LVL_9,
|
|
MCA_BASE_VAR_SCOPE_READONLY,
|
|
&mca_rtc_freq_component.governor);
|
|
|
|
mca_rtc_freq_component.max_freq = NULL;
|
|
(void) mca_base_component_var_register (c, "max", "Max frequency to be used by default (default: system setting)",
|
|
MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
|
|
OPAL_INFO_LVL_9,
|
|
MCA_BASE_VAR_SCOPE_READONLY,
|
|
&mca_rtc_freq_component.max_freq);
|
|
|
|
mca_rtc_freq_component.min_freq = NULL;
|
|
(void) mca_base_component_var_register (c, "min", "Min frequency to be used by default (default: system setting)",
|
|
MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
|
|
OPAL_INFO_LVL_9,
|
|
MCA_BASE_VAR_SCOPE_READONLY,
|
|
&mca_rtc_freq_component.min_freq);
|
|
|
|
freq = NULL;
|
|
(void) mca_base_component_var_register (c, NULL, "Specific frequency to be used by default",
|
|
MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
|
|
OPAL_INFO_LVL_9,
|
|
MCA_BASE_VAR_SCOPE_READONLY,
|
|
&freq);
|
|
|
|
if (NULL != freq) {
|
|
/* if a max/min was also given, then that is an error */
|
|
if (NULL != mca_rtc_freq_component.max_freq ||
|
|
NULL != mca_rtc_freq_component.min_freq) {
|
|
orte_show_help("help-rtc-freq.txt", "conflict-freq", true, freq,
|
|
(NULL == mca_rtc_freq_component.max_freq) ? "NULL" : mca_rtc_freq_component.max_freq,
|
|
(NULL == mca_rtc_freq_component.min_freq) ? "NULL" : mca_rtc_freq_component.min_freq);
|
|
return ORTE_ERR_SILENT;
|
|
}
|
|
/* set the max/min to the given value */
|
|
mca_rtc_freq_component.max_freq = strdup(freq);
|
|
mca_rtc_freq_component.min_freq = strdup(freq);
|
|
}
|
|
|
|
return ORTE_SUCCESS;
|
|
}
|
|
|
|
|
|
static int rtc_freq_query(mca_base_module_t **module, int *priority)
|
|
{
|
|
/* in general, only root can change the frequency setting
|
|
* of a node. However, if the sys admin has configured the
|
|
* remote node with the "userspace" governor, then individual
|
|
* users will be able to do so. Hence, we allow this component
|
|
* to always be selected, and will instead error out if the
|
|
* remote node cannot support the desired setting
|
|
*/
|
|
*priority = my_priority;
|
|
*module = (mca_base_module_t *)&orte_rtc_freq_module;
|
|
|
|
return ORTE_SUCCESS;
|
|
}
|