1
1

Restore the paffinity capability, along with all the required logic to ensure we "do the right thing" when the user gives us inaccurate information about the number of slots on a remote node.

This commit was SVN r12780.
Этот коммит содержится в:
Ralph Castain 2006-12-06 15:59:34 +00:00
родитель b1e16fffac
Коммит d4bd60c9fe
20 изменённых файлов: 275 добавлений и 94 удалений

Просмотреть файл

@ -119,15 +119,17 @@ int orte_odls_default_subscribe_launch_data(orte_jobid_t job, orte_gpr_notify_cb
char *glob_keys[] = {
ORTE_JOB_APP_CONTEXT_KEY,
ORTE_JOB_VPID_START_KEY,
ORTE_JOB_VPID_RANGE_KEY
ORTE_JOB_VPID_RANGE_KEY,
ORTE_JOB_OVERSUBSCRIBE_OVERRIDE_KEY
};
int num_glob_keys = 3;
int num_glob_keys = 4;
char* keys[] = {
ORTE_PROC_NAME_KEY,
ORTE_PROC_APP_CONTEXT_KEY,
ORTE_NODE_NAME_KEY,
ORTE_NODE_OVERSUBSCRIBED_KEY
};
int num_keys = 3;
int num_keys = 4;
int i, rc;
/* get the job segment name */
@ -749,7 +751,22 @@ static int odls_default_fork_local_proc(
opal_unsetenv(param, &environ_copy);
free(param);
/* Handle processor affinity */
/* setup yield schedule and processor affinity
* We default here to always setting the affinity processor if we want
* it. The processor affinity system then determines
* if processor affinity is enabled/requested - if so, it then uses
* this value to select the process to which the proc is "assigned".
* Otherwise, the paffinity subsystem just ignores this value anyway
*/
if (oversubscribed) {
param = mca_base_param_environ_variable("mpi", NULL, "yield_when_idle");
opal_setenv(param, "1", true, &environ_copy);
} else {
param = mca_base_param_environ_variable("mpi", NULL, "yield_when_idle");
opal_setenv(param, "0", true, &environ_copy);
}
free(param);
if (want_processor) {
param = mca_base_param_environ_variable("mpi", NULL,
"paffinity_processor");
@ -757,15 +774,11 @@ static int odls_default_fork_local_proc(
opal_setenv(param, param2, true, &environ_copy);
free(param);
free(param2);
}
/* handle oversubscription - setup yield schedule */
if (oversubscribed) {
param = mca_base_param_environ_variable("mpi", NULL, "yield_when_idle");
opal_setenv(param, "1", true, &environ_copy);
} else {
param = mca_base_param_environ_variable("mpi", NULL, "yield_when_idle");
opal_setenv(param, "0", true, &environ_copy);
param = mca_base_param_environ_variable("mpi", NULL,
"paffinity_processor");
opal_unsetenv(param, &environ_copy);
free(param);
}
/* setup universe info */
@ -910,8 +923,8 @@ int orte_odls_default_launch_local_procs(orte_gpr_notify_data_t *data, char **ba
opal_list_t app_context_list;
orte_odls_child_t *child;
odls_default_app_context_t *app_item;
size_t num_processors;
bool want_processor=false, oversubscribed;
int num_processors;
bool oversubscribed=false, want_processor, *bptr, override_oversubscribed=false;
opal_list_item_t *item, *item2;
/* parse the returned data to create the required structures
@ -992,6 +1005,15 @@ int orte_odls_default_launch_local_procs(orte_gpr_notify_data_t *data, char **ba
opal_list_append(&app_context_list, &app_item->super);
kval->value->data = NULL; /* protect the data storage from later release */
}
if (strcmp(kval->key, ORTE_JOB_OVERSUBSCRIBE_OVERRIDE_KEY) == 0) {
/* this can only occur once, so just store it */
if (ORTE_SUCCESS != (rc = orte_dss.get((void**)&bptr, kval->value, ORTE_BOOL))) {
ORTE_ERROR_LOG(rc);
return rc;
}
override_oversubscribed = *bptr;
continue;
}
} /* end for loop to process global data */
} else {
/* this must have come from one of the process containers, so it must
@ -1030,6 +1052,14 @@ int orte_odls_default_launch_local_procs(orte_gpr_notify_data_t *data, char **ba
child->app_idx = *sptr; /* save the index into the app_context objects */
continue;
}
if(strcmp(kval->key, ORTE_NODE_OVERSUBSCRIBED_KEY) == 0) {
if (ORTE_SUCCESS != (rc = orte_dss.get((void**)&bptr, kval->value, ORTE_BOOL))) {
ORTE_ERROR_LOG(rc);
return rc;
}
oversubscribed = *bptr;
continue;
}
} /* kv2 */
/* protect operation on the global list of children */
OPAL_THREAD_LOCK(&orte_odls_default.mutex);
@ -1044,13 +1074,52 @@ int orte_odls_default_launch_local_procs(orte_gpr_notify_data_t *data, char **ba
} /* for j */
}
/* determine if we are oversubscribed */
oversubscribed = false; /* default to being a hog */
opal_paffinity_base_get_num_processors(&rc);
num_processors = (size_t)rc;
if (opal_list_get_size(&orte_odls_default.children) > num_processors) { /* oversubscribed */
oversubscribed = true;
/* setup for processor affinity. If there are enough physical processors on this node, then
* we indicate which processor each process should be assigned to, IFF the user has requested
* processor affinity be used - the paffinity subsystem will make that final determination. All
* we do here is indicate that we should do the definitions just in case paffinity is active
*/
if (ORTE_SUCCESS != opal_paffinity_base_get_num_processors(&num_processors)) {
/* if we cannot find the number of local processors, then default to conservative
* settings
*/
want_processor = false; /* default to not being a hog */
/* leave oversubscribed alone */
opal_output(orte_odls_globals.output,
"odls: could not get number of processors - using conservative settings");
} else {
/* only do this if we can actually get info on the number of processors */
if (opal_list_get_size(&orte_odls_default.children) > (size_t)num_processors) {
want_processor = false;
} else {
want_processor = true;
}
/* now let's deal with the oversubscribed flag - and the use-case where a hostfile or some
* other non-guaranteed-accurate method was used to inform us about our allocation. Since
* the information on the number of slots on this node could have been incorrect, we need
* to check it against the local number of processors to ensure we don't overload them
*/
if (override_oversubscribed) {
opal_output(orte_odls_globals.output, "odls: overriding oversubscription");
if (opal_list_get_size(&orte_odls_default.children) > (size_t)num_processors) {
/* if the #procs > #processors, declare us oversubscribed regardless
* of what the mapper claimed - the user may have told us something
* incorrect
*/
oversubscribed = true;
} else {
/* likewise, if there are more processors here than we were told,
* declare us to not be oversubscribed so we can be aggressive. This
* covers the case where the user didn't tell us anything about the
* number of available slots, so we defaulted to a value of 1
*/
oversubscribed = false;
}
}
}
opal_output(orte_odls_globals.output, "odls: oversubscribed set to %s want_processor set to %s",
oversubscribed ? "true" : "false", want_processor ? "true" : "false");
/* okay, now let's launch our local procs using a fork/exec */
i = 0;

Просмотреть файл

@ -30,6 +30,7 @@ libmca_ras_la_SOURCES += \
base/ras_base_no_ops.c \
base/ras_base_open.c \
base/ras_base_receive.c \
base/ras_base_support_fns.c \
base/data_type_support/ras_data_type_compare_fns.c \
base/data_type_support/ras_data_type_copy_fns.c \
base/data_type_support/ras_data_type_packing_fns.c \

66
orte/mca/ras/base/ras_base_support_fns.c Обычный файл
Просмотреть файл

@ -0,0 +1,66 @@
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "orte_config.h"
#include "orte/orte_constants.h"
#include "orte/dss/dss_types.h"
#include "orte/mca/errmgr/errmgr.h"
#include "orte/mca/gpr/gpr.h"
#include "orte/mca/schema/schema_types.h"
#include "orte/mca/ras/base/ras_private.h"
/*
* Indicate that the allocation for this job is uncertain - therefore,
* the oversubscribed condition that might results should be overridden
* locally based on the actual available hardware on the node
*/
int orte_ras_base_set_oversubscribe_override(orte_jobid_t job)
{
orte_gpr_addr_mode_t addr_mode;
char *segment;
char *tokens[] = {
ORTE_JOB_GLOBALS,
NULL
};
orte_data_value_t val = ORTE_DATA_VALUE_EMPTY;
bool trueval = true;
int rc;
addr_mode = ORTE_GPR_OVERWRITE | ORTE_GPR_TOKENS_OR | ORTE_GPR_KEYS_OR;
/* get the job segment name */
if (ORTE_SUCCESS != (rc = orte_schema.get_job_segment_name(&segment, job))) {
ORTE_ERROR_LOG(rc);
return rc;
}
/* setup the value to be true */
val.type = ORTE_BOOL;
val.data = &trueval;
if (ORTE_SUCCESS != (rc = orte_gpr.put_1(addr_mode, segment, tokens,
ORTE_JOB_OVERSUBSCRIBE_OVERRIDE_KEY, &val))) {
ORTE_ERROR_LOG(rc);
}
free(segment);
return rc;
}

Просмотреть файл

@ -80,6 +80,8 @@ ORTE_DECLSPEC int orte_ras_base_allocate_nodes(orte_jobid_t jobid,
ORTE_DECLSPEC int orte_ras_base_reallocate(orte_jobid_t parent_jobid,
orte_jobid_t child_jobid);
ORTE_DECLSPEC int orte_ras_base_set_oversubscribe_override(orte_jobid_t job);
/*
* Query the registry for all available nodes
*/

Просмотреть файл

@ -166,6 +166,15 @@ static int orte_ras_dash_host_allocate(orte_jobid_t jobid, opal_list_t *attribut
(rc = orte_ras_base_allocate_nodes(jobid, &nodes))) {
goto cleanup;
}
/* now indicate that there is uncertainty about the number of slots here,
* so the launcher should use knowledge of the local number of processors to
* override any oversubscription flags
*/
rc = orte_ras_base_set_oversubscribe_override(jobid);
if (ORTE_SUCCESS != rc) {
goto cleanup;
}
}
cleanup:

Просмотреть файл

@ -119,7 +119,16 @@ static int orte_ras_localhost_allocate(orte_jobid_t jobid, opal_list_t *attribut
goto cleanup;
}
cleanup:
/* now indicate that there is uncertainty about the number of slots here,
* so the launcher should use knowledge of the local number of processors to
* override any oversubscription flags
*/
ret = orte_ras_base_set_oversubscribe_override(jobid);
if (ORTE_SUCCESS != ret) {
goto cleanup;
}
cleanup:
item = opal_list_remove_first(&nodes);
OBJ_RELEASE(item);
OBJ_DESTRUCT(&nodes);

Просмотреть файл

@ -28,7 +28,7 @@
#include "orte/mca/rds/base/rds_private.h"
int orte_rds_base_no_op_query(void)
int orte_rds_base_no_op_query(orte_jobid_t job)
{
return ORTE_ERR_NOT_SUPPORTED;
}

Просмотреть файл

@ -30,7 +30,7 @@
/**
* Function for querying all loaded components.
*/
int orte_rds_base_query(void)
int orte_rds_base_query(orte_jobid_t job)
{
opal_list_item_t* item;
@ -39,7 +39,7 @@ int orte_rds_base_query(void)
item != opal_list_get_end(&orte_rds_base.rds_selected);
item = opal_list_get_next(item)) {
orte_rds_base_selected_t* selected = (orte_rds_base_selected_t*)item;
int rc = selected->module->query();
int rc = selected->module->query(job);
if(rc != ORTE_SUCCESS)
return rc;
}

Просмотреть файл

@ -92,6 +92,7 @@ void orte_rds_base_recv(int status, orte_process_name_t* sender,
{
orte_buffer_t answer;
orte_rds_cmd_flag_t command;
orte_jobid_t job;
orte_std_cntr_t count;
int rc;
@ -105,11 +106,17 @@ void orte_rds_base_recv(int status, orte_process_name_t* sender,
switch (command) {
case ORTE_RDS_QUERY_CMD:
if (ORTE_SUCCESS != (rc = orte_dss.pack(&answer, &command, 1, ORTE_RDS_CMD))) {
count = 1;
if (ORTE_SUCCESS != (rc = orte_dss.unpack(buffer, &job, &count, ORTE_JOBID))) {
ORTE_ERROR_LOG(rc);
return;
}
if (ORTE_SUCCESS != (rc = orte_dss.pack(&answer, &command, 1, ORTE_RDS_CMD))) {
ORTE_ERROR_LOG(rc);
}
if (ORTE_SUCCESS != (rc = orte_rds_base_query())) {
if (ORTE_SUCCESS != (rc = orte_rds_base_query(job))) {
ORTE_ERROR_LOG(rc);
}

Просмотреть файл

@ -46,7 +46,7 @@ typedef uint8_t orte_rds_cmd_flag_t;
/*
* API function definitions
*/
ORTE_DECLSPEC int orte_rds_base_query(void);
ORTE_DECLSPEC int orte_rds_base_query(orte_jobid_t job);
/*
* oob interface
@ -65,7 +65,7 @@ ORTE_DECLSPEC int orte_rds_base_store_resource(opal_list_t *resource_list);
/*
* the "null" component functions
*/
int orte_rds_base_no_op_query(void);
int orte_rds_base_no_op_query(orte_jobid_t job);
int orte_rds_base_no_op_store_resource(opal_list_t *resource_list);
#if defined(c_plusplus) || defined(__cplusplus)

Просмотреть файл

@ -372,7 +372,7 @@ unlock:
* rds_hostfile_path, and add the nodes to the registry.
*/
static int orte_rds_hostfile_query(void)
static int orte_rds_hostfile_query(orte_jobid_t job)
{
opal_list_t existing;
opal_list_t updates, rds_updates;
@ -501,6 +501,18 @@ static int orte_rds_hostfile_query(void)
if (ORTE_SUCCESS != rc) {
goto cleanup;
}
/* and now, indicate that ORTE should override any oversubscribed conditions
* based on local hardware limits since the user (a) might not have
* provided us any info on the #slots for a node, and (b) the user
* might have been wrong! If we don't check the number of local physical
* processors, then we could be too aggressive on our sched_yield setting
* and cause performance problems.
*/
rc = orte_ras_base_set_oversubscribe_override(job);
if (ORTE_SUCCESS != rc) {
goto cleanup;
}
}
cleanup:

Просмотреть файл

@ -41,7 +41,7 @@
* functions
*/
int orte_rds_proxy_query(void)
int orte_rds_proxy_query(orte_jobid_t job)
{
orte_buffer_t* cmd;
orte_buffer_t* answer;
@ -63,6 +63,12 @@ int orte_rds_proxy_query(void)
return rc;
}
if (ORTE_SUCCESS != (rc = orte_dss.pack(cmd, &job, 1, ORTE_JOBID))) {
ORTE_ERROR_LOG(rc);
OBJ_RELEASE(cmd);
return rc;
}
if (0 > orte_rml.send_buffer(orte_rds_proxy_replica, cmd, ORTE_RML_TAG_RDS, 0)) {
ORTE_ERROR_LOG(ORTE_ERR_COMM_FAILURE);
OBJ_RELEASE(cmd);

Просмотреть файл

@ -47,7 +47,7 @@ int orte_rds_proxy_finalize(void);
/*
* proxy function prototypes
*/
int orte_rds_proxy_query(void);
int orte_rds_proxy_query(orte_jobid_t job);
#if defined(c_plusplus) || defined(__cplusplus)

Просмотреть файл

@ -147,7 +147,7 @@ extern "C" {
* return_value = orte_rmgr.query();
* @endcode
*/
typedef int (*orte_rds_base_module_query_fn_t)(void);
typedef int (*orte_rds_base_module_query_fn_t)(orte_jobid_t job);
/**
* Add a list of resources to the Resource Segment

Просмотреть файл

@ -223,7 +223,7 @@ static int orte_rds_resfile_parse_site(char *site, FILE *fp)
}
int orte_rds_resfile_query(void)
int orte_rds_resfile_query(orte_jobid_t job)
{
int fileid, rc;
FILE *fp;

Просмотреть файл

@ -36,7 +36,7 @@ extern "C" {
/*
* RDS Resource file functions
*/
int orte_rds_resfile_query(void);
int orte_rds_resfile_query(orte_jobid_t job);
int orte_rds_resfile_finalize(void);

Просмотреть файл

@ -384,14 +384,6 @@ static int orte_rmgr_proxy_spawn_job(
flags = 0xff;
}
/*
* Perform resource discovery.
*/
if (ORTE_SUCCESS != (rc = orte_rds.query())) {
ORTE_ERROR_LOG(rc);
return rc;
}
/*
* Setup job and allocate resources
*/
@ -403,6 +395,13 @@ static int orte_rmgr_proxy_spawn_job(
}
}
if (flags & ORTE_RMGR_RES_DISC) {
if (ORTE_SUCCESS != (rc = orte_rds.query(*jobid))) {
ORTE_ERROR_LOG(rc);
return rc;
}
}
if (flags & ORTE_RMGR_ALLOC) {
if (ORTE_SUCCESS != (rc = orte_ras.allocate_job(*jobid, attributes))) {
ORTE_ERROR_LOG(rc);

Просмотреть файл

@ -56,10 +56,11 @@ ORTE_DECLSPEC OBJ_CLASS_DECLARATION(orte_attribute_t);
* procedure.
*/
#define ORTE_RMGR_SETUP 0x01
#define ORTE_RMGR_ALLOC 0x02
#define ORTE_RMGR_MAP 0x04
#define ORTE_RMGR_SETUP_TRIGS 0x08
#define ORTE_RMGR_LAUNCH 0x10
#define ORTE_RMGR_RES_DISC 0x02
#define ORTE_RMGR_ALLOC 0x04
#define ORTE_RMGR_MAP 0x08
#define ORTE_RMGR_SETUP_TRIGS 0x10
#define ORTE_RMGR_LAUNCH 0x20
/* direct the RMGR spawn procedure to use the provided jobid
* instead of getting a new one

Просмотреть файл

@ -336,14 +336,6 @@ static int orte_rmgr_urm_spawn_job(
flags = 0xff;
}
/*
* Perform resource discovery.
*/
if (ORTE_SUCCESS != (rc = orte_rds.query())) {
ORTE_ERROR_LOG(rc);
return rc;
}
/*
* Initialize job segment and allocate resources
*/ /* JJH Insert C/N mapping stuff here */
@ -359,6 +351,13 @@ static int orte_rmgr_urm_spawn_job(
}
}
if (flags & ORTE_RMGR_RES_DISC) {
if (ORTE_SUCCESS != (rc = orte_rds.query(*jobid))) {
ORTE_ERROR_LOG(rc);
return rc;
}
}
if (flags & ORTE_RMGR_ALLOC) {
if (ORTE_SUCCESS != (rc = orte_ras.allocate_job(*jobid, attributes))) {
ORTE_ERROR_LOG(rc);

Просмотреть файл

@ -58,46 +58,47 @@
* ORTE-wide key names for storing/retrieving data from the registry.
* Subsystem-specific keys will be defined in each=/ subsystem's xxx_types.h file.
*/
#define ORTE_CELLID_KEY "orte-cellid"
#define ORTE_JOBGRP_KEY "orte-jobgrp"
#define ORTE_JOBID_KEY "orte-jobid"
#define ORTE_VPID_KEY "orte-vpid"
#define ORTE_NODE_NAME_KEY "orte-node-name"
#define ORTE_NODE_ARCH_KEY "orte-node-arch"
#define ORTE_NODE_STATE_KEY "orte-node-state"
#define ORTE_NODE_SLOTS_KEY "orte-node-slots"
#define ORTE_NODE_SLOTS_ALLOC_KEY "orte-node-slots-alloc"
#define ORTE_NODE_SLOTS_IN_USE_KEY "orte-node-slots-in-use"
#define ORTE_NODE_SLOTS_MAX_KEY "orte-node-slots-max"
#define ORTE_NODE_ALLOC_KEY "orte-node-alloc"
#define ORTE_NODE_BOOTPROXY_KEY "orte-node-bootproxy"
#define ORTE_NODE_USERNAME_KEY "orte-node-username"
#define ORTE_NODE_OVERSUBSCRIBED_KEY "orte-node-oversubscribed"
#define ORTE_JOB_APP_CONTEXT_KEY "orte-job-app-context"
#define ORTE_JOB_SLOTS_KEY "orte-job-slots" /**< number of procs in job */
#define ORTE_JOB_VPID_START_KEY "orte-job-vpid-start"
#define ORTE_JOB_VPID_RANGE_KEY "orte-job-vpid-range"
#define ORTE_JOB_IOF_KEY "orte-job-iof"
#define ORTE_JOB_STATE_KEY "orte-job-state"
#define ORTE_PROC_NAME_KEY "orte-proc-name"
#define ORTE_PROC_RANK_KEY "orte-proc-rank"
#define ORTE_PROC_PID_KEY "orte-proc-pid"
#define ORTE_PROC_LOCAL_PID_KEY "orte-proc-local-pid"
#define ORTE_PROC_STATE_KEY "orte-proc-state"
#define ORTE_PROC_APP_CONTEXT_KEY "orte-proc-app-context"
#define ORTE_PROC_EXIT_CODE_KEY "orte-proc-exit-code"
#define ORTE_PROC_NUM_ALIVE "orte-proc-num-alive"
#define ORTE_PROC_NUM_ABORTED "orte-proc-num-aborted"
#define ORTE_PROC_NUM_FAILED_START "orte-proc-num-failed-start"
#define ORTE_PROC_NUM_AT_INIT "orte-proc-num-init"
#define ORTE_PROC_NUM_LAUNCHED "orte-proc-num-launched"
#define ORTE_PROC_NUM_RUNNING "orte-proc-num-running"
#define ORTE_PROC_NUM_AT_STG1 "orte-proc-num-stg1"
#define ORTE_PROC_NUM_AT_STG2 "orte-proc-num-stg2"
#define ORTE_PROC_NUM_AT_STG3 "orte-proc-num-stg3"
#define ORTE_PROC_NUM_FINALIZED "orte-proc-num-finalized"
#define ORTE_PROC_NUM_TERMINATED "orte-proc-num-terminated"
#define ORTE_PROC_RML_IP_ADDRESS_KEY "orte-proc-rml-ip-addr"
#define ORTE_CELLID_KEY "orte-cellid"
#define ORTE_JOBGRP_KEY "orte-jobgrp"
#define ORTE_JOBID_KEY "orte-jobid"
#define ORTE_VPID_KEY "orte-vpid"
#define ORTE_NODE_NAME_KEY "orte-node-name"
#define ORTE_NODE_ARCH_KEY "orte-node-arch"
#define ORTE_NODE_STATE_KEY "orte-node-state"
#define ORTE_NODE_SLOTS_KEY "orte-node-slots"
#define ORTE_NODE_SLOTS_ALLOC_KEY "orte-node-slots-alloc"
#define ORTE_NODE_SLOTS_IN_USE_KEY "orte-node-slots-in-use"
#define ORTE_NODE_SLOTS_MAX_KEY "orte-node-slots-max"
#define ORTE_NODE_ALLOC_KEY "orte-node-alloc"
#define ORTE_NODE_BOOTPROXY_KEY "orte-node-bootproxy"
#define ORTE_NODE_USERNAME_KEY "orte-node-username"
#define ORTE_NODE_OVERSUBSCRIBED_KEY "orte-node-oversubscribed"
#define ORTE_JOB_APP_CONTEXT_KEY "orte-job-app-context"
#define ORTE_JOB_SLOTS_KEY "orte-job-slots" /**< number of procs in job */
#define ORTE_JOB_VPID_START_KEY "orte-job-vpid-start"
#define ORTE_JOB_VPID_RANGE_KEY "orte-job-vpid-range"
#define ORTE_JOB_OVERSUBSCRIBE_OVERRIDE_KEY "orte-job-override-oversubscribe"
#define ORTE_JOB_IOF_KEY "orte-job-iof"
#define ORTE_JOB_STATE_KEY "orte-job-state"
#define ORTE_PROC_NAME_KEY "orte-proc-name"
#define ORTE_PROC_RANK_KEY "orte-proc-rank"
#define ORTE_PROC_PID_KEY "orte-proc-pid"
#define ORTE_PROC_LOCAL_PID_KEY "orte-proc-local-pid"
#define ORTE_PROC_STATE_KEY "orte-proc-state"
#define ORTE_PROC_APP_CONTEXT_KEY "orte-proc-app-context"
#define ORTE_PROC_EXIT_CODE_KEY "orte-proc-exit-code"
#define ORTE_PROC_NUM_ALIVE "orte-proc-num-alive"
#define ORTE_PROC_NUM_ABORTED "orte-proc-num-aborted"
#define ORTE_PROC_NUM_FAILED_START "orte-proc-num-failed-start"
#define ORTE_PROC_NUM_AT_INIT "orte-proc-num-init"
#define ORTE_PROC_NUM_LAUNCHED "orte-proc-num-launched"
#define ORTE_PROC_NUM_RUNNING "orte-proc-num-running"
#define ORTE_PROC_NUM_AT_STG1 "orte-proc-num-stg1"
#define ORTE_PROC_NUM_AT_STG2 "orte-proc-num-stg2"
#define ORTE_PROC_NUM_AT_STG3 "orte-proc-num-stg3"
#define ORTE_PROC_NUM_FINALIZED "orte-proc-num-finalized"
#define ORTE_PROC_NUM_TERMINATED "orte-proc-num-terminated"
#define ORTE_PROC_RML_IP_ADDRESS_KEY "orte-proc-rml-ip-addr"
/*
* ORTE-wide names for specific system triggers and subscriptions