1
1
Signed-off-by: Ralph Castain <rhc@open-mpi.org>
Этот коммит содержится в:
Ralph Castain 2017-05-28 10:30:58 -07:00
родитель 36457cbce6
Коммит 9f1f9d6606
13 изменённых файлов: 481 добавлений и 56 удалений

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

@ -30,7 +30,7 @@ greek=
# command, or with the date (if "git describe" fails) in the form of
# "date<date>".
repo_rev=git217c369
repo_rev=git1ce71dd
# If tarball_version is not empty, it is used as the version string in
# the tarball filename, regardless of all other versions listed in
@ -44,7 +44,7 @@ tarball_version=
# The date when this release was created
date="May 25, 2017"
date="May 28, 2017"
# The shared library version of each of PMIx's public libraries.
# These versions are maintained in accordance with the "Library

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

@ -690,6 +690,44 @@ typedef struct pmix_byte_object {
} pmix_byte_object_t;
/**** PMIX DATA BUFFER ****/
typedef struct pmix_data_buffer {
/** Start of my memory */
char *base_ptr;
/** Where the next data will be packed to (within the allocated
memory starting at base_ptr) */
char *pack_ptr;
/** Where the next data will be unpacked from (within the
allocated memory starting as base_ptr) */
char *unpack_ptr;
/** Number of bytes allocated (starting at base_ptr) */
size_t bytes_allocated;
/** Number of bytes used by the buffer (i.e., amount of data --
including overhead -- packed in the buffer) */
size_t bytes_used;
} pmix_data_buffer_t;
#define PMIX_DATA_BUFFER_CREATE(m) \
do { \
(m) = (pmix_data_buffer_t*)calloc(1, sizeof(pmix_data_buffer_t)); \
} while (0)
#define PMIX_DATA_BUFFER_RELEASE(m) \
do { \
if (NULL != (m)->base_ptr) { \
free((m)->base_ptr); \
} \
free((m)); \
(m) = NULL; \
} while (0)
#define PMIX_DATA_BUFFER_CONSTRUCT(m) \
memset((m), 0, sizeof(pmix_data_buffer_t))
#define PMIX_DATA_BUFFER_DESTRUCT(m) \
do { \
if (NULL != (m)->base_ptr) { \
free((m)->base_ptr); \
} \
} while (0)
/**** PMIX PROC OBJECT ****/
typedef struct pmix_proc {
char nspace[PMIX_MAX_NSLEN+1];
@ -700,9 +738,10 @@ typedef struct pmix_proc {
(m) = (pmix_proc_t*)calloc((n) , sizeof(pmix_proc_t)); \
} while (0)
#define PMIX_PROC_RELEASE(m) \
do { \
PMIX_PROC_FREE((m)); \
#define PMIX_PROC_RELEASE(m) \
do { \
free((m)); \
(m) = NULL; \
} while (0)
#define PMIX_PROC_CONSTRUCT(m) \
@ -957,7 +996,6 @@ pmix_status_t pmix_setenv(const char *name, const char *value,
#define PMIX_SETENV(a, b, c) \
pmix_setenv((a), (b), true, (c))
/**** PMIX INFO STRUCT ****/
struct pmix_info_t {
char key[PMIX_MAX_KEYLEN+1]; // ensure room for the NULL terminator
@ -1492,6 +1530,209 @@ pmix_status_t PMIx_Store_internal(const pmix_proc_t *proc,
const char *key, pmix_value_t *val);
/**
* Top-level interface function to pack one or more values into a
* buffer.
*
* The pack function packs one or more values of a specified type into
* the specified buffer. The buffer must have already been
* initialized via the PMIX_DATA_BUFFER_CREATE or PMIX_DATA_BUFFER_CONSTRUCT
* call - otherwise, the pack_value function will return an error.
* Providing an unsupported type flag will likewise be reported as an error.
*
* Note that any data to be packed that is not hard type cast (i.e.,
* not type cast to a specific size) may lose precision when unpacked
* by a non-homogeneous recipient. The PACK function will do its best to deal
* with heterogeneity issues between the packer and unpacker in such
* cases. Sending a number larger than can be handled by the recipient
* will return an error code (generated upon unpacking) -
* the error cannot be detected during packing.
*
* @param *buffer A pointer to the buffer into which the value is to
* be packed.
*
* @param *src A void* pointer to the data that is to be packed. Note
* that strings are to be passed as (char **) - i.e., the caller must
* pass the address of the pointer to the string as the void*. This
* allows PMIx to use a single pack function, but still allow
* the caller to pass multiple strings in a single call.
*
* @param num_values An int32_t indicating the number of values that are
* to be packed, beginning at the location pointed to by src. A string
* value is counted as a single value regardless of length. The values
* must be contiguous in memory. Arrays of pointers (e.g., string
* arrays) should be contiguous, although (obviously) the data pointed
* to need not be contiguous across array entries.
*
* @param type The type of the data to be packed - must be one of the
* PMIX defined data types.
*
* @retval PMIX_SUCCESS The data was packed as requested.
*
* @retval PMIX_ERROR(s) An appropriate PMIX error code indicating the
* problem encountered. This error code should be handled
* appropriately.
*
* @code
* pmix_data_buffer_t *buffer;
* int32_t src;
*
* PMIX_DATA_BUFFER_CREATE(buffer);
* status_code = PMIx_Data_pack(buffer, &src, 1, PMIX_INT32);
* @endcode
*/
pmix_status_t PMIx_Data_pack(pmix_data_buffer_t *buffer,
void *src, int32_t num_vals,
pmix_data_type_t type);
/**
* Unpack values from a buffer.
*
* The unpack function unpacks the next value (or values) of a
* specified type from the specified buffer.
*
* The buffer must have already been initialized via an PMIX_DATA_BUFFER_CREATE or
* PMIX_DATA_BUFFER_CONSTRUCT call (and assumedly filled with some data) -
* otherwise, the unpack_value function will return an
* error. Providing an unsupported type flag will likewise be reported
* as an error, as will specifying a data type that DOES NOT match the
* type of the next item in the buffer. An attempt to read beyond the
* end of the stored data held in the buffer will also return an
* error.
*
* NOTE: it is possible for the buffer to be corrupted and that
* PMIx will *think* there is a proper variable type at the
* beginning of an unpack region - but that the value is bogus (e.g., just
* a byte field in a string array that so happens to have a value that
* matches the specified data type flag). Therefore, the data type error check
* is NOT completely safe. This is true for ALL unpack functions.
*
*
* Unpacking values is a "nondestructive" process - i.e., the values are
* not removed from the buffer. It is therefore possible for the caller
* to re-unpack a value from the same buffer by resetting the unpack_ptr.
*
* Warning: The caller is responsible for providing adequate memory
* storage for the requested data. As noted below, the user
* must provide a parameter indicating the maximum number of values that
* can be unpacked into the allocated memory. If more values exist in the
* buffer than can fit into the memory storage, then the function will unpack
* what it can fit into that location and return an error code indicating
* that the buffer was only partially unpacked.
*
* Note that any data that was not hard type cast (i.e., not type cast
* to a specific size) when packed may lose precision when unpacked by
* a non-homogeneous recipient. PMIx will do its best to deal with
* heterogeneity issues between the packer and unpacker in such
* cases. Sending a number larger than can be handled by the recipient
* will return an error code generated upon unpacking - these errors
* cannot be detected during packing.
*
* @param *buffer A pointer to the buffer from which the value will be
* extracted.
*
* @param *dest A void* pointer to the memory location into which the
* data is to be stored. Note that these values will be stored
* contiguously in memory. For strings, this pointer must be to (char
* **) to provide a means of supporting multiple string
* operations. The unpack function will allocate memory for each
* string in the array - the caller must only provide adequate memory
* for the array of pointers.
*
* @param type The type of the data to be unpacked - must be one of
* the BFROP defined data types.
*
* @retval *max_num_values The number of values actually unpacked. In
* most cases, this should match the maximum number provided in the
* parameters - but in no case will it exceed the value of this
* parameter. Note that if you unpack fewer values than are actually
* available, the buffer will be in an unpackable state - the function will
* return an error code to warn of this condition.
*
* @note The unpack function will return the actual number of values
* unpacked in this location.
*
* @retval PMIX_SUCCESS The next item in the buffer was successfully
* unpacked.
*
* @retval PMIX_ERROR(s) The unpack function returns an error code
* under one of several conditions: (a) the number of values in the
* item exceeds the max num provided by the caller; (b) the type of
* the next item in the buffer does not match the type specified by
* the caller; or (c) the unpack failed due to either an error in the
* buffer or an attempt to read past the end of the buffer.
*
* @code
* pmix_data_buffer_t *buffer;
* int32_t dest;
* char **string_array;
* int32_t num_values;
*
* num_values = 1;
* status_code = PMIx_Data_unpack(buffer, (void*)&dest, &num_values, PMIX_INT32);
*
* num_values = 5;
* string_array = malloc(num_values*sizeof(char *));
* status_code = PMIx_Data_unpack(buffer, (void*)(string_array), &num_values, PMIX_STRING);
*
* @endcode
*/
pmix_status_t PMIx_Data_unpack(pmix_data_buffer_t *buffer, void *dest,
int32_t *max_num_values,
pmix_data_type_t type);
/**
* Copy a data value from one location to another.
*
* Since registered data types can be complex structures, the system
* needs some way to know how to copy the data from one location to
* another (e.g., for storage in the registry). This function, which
* can call other copy functions to build up complex data types, defines
* the method for making a copy of the specified data type.
*
* @param **dest The address of a pointer into which the
* address of the resulting data is to be stored.
*
* @param *src A pointer to the memory location from which the
* data is to be copied.
*
* @param type The type of the data to be copied - must be one of
* the PMIx defined data types.
*
* @retval PMIX_SUCCESS The value was successfully copied.
*
* @retval PMIX_ERROR(s) An appropriate error code.
*
*/
pmix_status_t PMIx_Data_copy(void **dest, void *src, pmix_data_type_t type);
/**
* Print a data value.
*
* Since registered data types can be complex structures, the system
* needs some way to know how to print them (i.e., convert them to a string
* representation). Provided for debug purposes.
*
* @retval PMIX_SUCCESS The value was successfully printed.
*
* @retval PMIX_ERROR(s) An appropriate error code.
*/
pmix_status_t PMIx_Data_print(char **output, char *prefix,
void *src, pmix_data_type_t type);
/**
* Copy a payload from one buffer to another
*
* This function will append a copy of the payload in one buffer into
* another buffer.
* NOTE: This is NOT a destructive procedure - the
* source buffer's payload will remain intact, as will any pre-existing
* payload in the destination's buffer.
*/
pmix_status_t PMIx_Data_copy_payload(pmix_data_buffer_t *dest,
pmix_data_buffer_t *src);
/* Key-Value pair management macros */
// TODO: add all possible types/fields here.

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

@ -14,7 +14,7 @@
* Copyright (c) 2014-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2015 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2016 IBM Corporation. All rights reserved.
* Copyright (c) 2016-2017 IBM Corporation. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -46,7 +46,7 @@ pmix_pointer_array_t pmix_bfrop_types = {{0}};
pmix_data_type_t pmix_bfrop_num_reg_types = PMIX_UNDEF;
static pmix_bfrop_buffer_type_t pmix_default_buf_type = PMIX_BFROP_BUFFER_NON_DESC;
pmix_bfrop_t pmix_bfrop = {
PMIX_EXPORT pmix_bfrop_t pmix_bfrop = {
pmix_bfrop_pack,
pmix_bfrop_unpack,
pmix_bfrop_copy,
@ -149,7 +149,7 @@ PMIX_EXPORT PMIX_CLASS_INSTANCE(pmix_regex_value_t,
pmix_list_item_t,
rvcon, rvdes);
pmix_status_t pmix_bfrop_open(void)
PMIX_EXPORT pmix_status_t pmix_bfrop_open(void)
{
pmix_status_t rc;
@ -445,7 +445,7 @@ pmix_status_t pmix_bfrop_open(void)
}
pmix_status_t pmix_bfrop_close(void)
PMIX_EXPORT pmix_status_t pmix_bfrop_close(void)
{
int32_t i;

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

@ -14,4 +14,5 @@ sources += \
common/pmix_strings.c \
common/pmix_log.c \
common/pmix_jobdata.c \
common/pmix_control.c
common/pmix_control.c \
common/pmix_data.c

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

@ -0,0 +1,159 @@
/*
* 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 (c) 2007-2012 Los Alamos National Security, LLC.
* All rights reserved.
* Copyright (c) 2014-2017 Intel, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <src/include/pmix_config.h>
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#include <errno.h>
#include <stdio.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#include <pmix_common.h>
#include <pmix_rename.h>
#include "src/buffer_ops/buffer_ops.h"
#define PMIX_EMBED_DATA_BUFFER(b, db) \
do { \
(b)->base_ptr = (db)->base_ptr; \
(b)->pack_ptr = (db)->pack_ptr; \
(b)->unpack_ptr = (db)->unpack_ptr; \
(b)->bytes_allocated = (db)->bytes_allocated; \
(b)->bytes_used = (db)->bytes_used; \
(db)->base_ptr = NULL; \
(db)->pack_ptr = NULL; \
(db)->unpack_ptr = NULL; \
(db)->bytes_allocated = 0; \
(db)->bytes_used = 0; \
} while (0)
#define PMIX_EXTRACT_DATA_BUFFER(b, db) \
do { \
(db)->base_ptr = (b)->base_ptr; \
(db)->pack_ptr = (b)->pack_ptr; \
(db)->unpack_ptr = (b)->unpack_ptr; \
(db)->bytes_allocated = (b)->bytes_allocated; \
(db)->bytes_used = (b)->bytes_used; \
(b)->base_ptr = NULL; \
(b)->pack_ptr = NULL; \
(b)->unpack_ptr = NULL; \
(b)->bytes_allocated = 0; \
(b)->bytes_used = 0; \
} while (0)
PMIX_EXPORT pmix_status_t PMIx_Data_pack(pmix_data_buffer_t *buffer,
void *src, int32_t num_vals,
pmix_data_type_t type)
{
pmix_status_t rc;
pmix_buffer_t buf;
/* setup the host */
PMIX_CONSTRUCT(&buf, pmix_buffer_t);
/* embed the data buffer into a buffer */
PMIX_EMBED_DATA_BUFFER(&buf, buffer);
/* pack the value */
rc = pmix_bfrop.pack(&buf, src, num_vals, type);
/* extract the data buffer - the pointers may have changed */
PMIX_EXTRACT_DATA_BUFFER(&buf, buffer);
/* no need to cleanup as all storage was xfered */
return rc;
}
PMIX_EXPORT pmix_status_t PMIx_Data_unpack(pmix_data_buffer_t *buffer, void *dest,
int32_t *max_num_values,
pmix_data_type_t type)
{
pmix_status_t rc;
pmix_buffer_t buf;
/* setup the host */
PMIX_CONSTRUCT(&buf, pmix_buffer_t);
/* embed the data buffer into a buffer */
PMIX_EMBED_DATA_BUFFER(&buf, buffer);
/* unpack the value */
rc = pmix_bfrop.unpack(&buf, dest, max_num_values, type);
/* extract the data buffer - the pointers may have changed */
PMIX_EXTRACT_DATA_BUFFER(&buf, buffer);
/* no need to cleanup as all storage was xfered */
return rc;
}
PMIX_EXPORT pmix_status_t PMIx_Data_copy(void **dest, void *src,
pmix_data_type_t type)
{
pmix_status_t rc;
/* copy the value */
rc = pmix_bfrop.copy(dest, src, type);
return rc;
}
PMIX_EXPORT pmix_status_t PMIx_Data_print(char **output, char *prefix,
void *src, pmix_data_type_t type)
{
pmix_status_t rc;
/* print the value */
rc = pmix_bfrop.print(output, prefix, src, type);
return rc;
}
PMIX_EXPORT pmix_status_t PMIx_Data_copy_payload(pmix_data_buffer_t *dest,
pmix_data_buffer_t *src)
{
pmix_status_t rc;
pmix_buffer_t buf1, buf2;
/* setup the hosts */
PMIX_CONSTRUCT(&buf1, pmix_buffer_t);
PMIX_CONSTRUCT(&buf2, pmix_buffer_t);
/* embed the data buffer into a buffer */
PMIX_EMBED_DATA_BUFFER(&buf1, dest);
PMIX_EMBED_DATA_BUFFER(&buf2, src);
/* copy payload */
rc = pmix_bfrop.copy_payload(&buf1, &buf2);
/* extract the dest data buffer - the pointers may have changed */
PMIX_EXTRACT_DATA_BUFFER(&buf1, dest);
PMIX_EXTRACT_DATA_BUFFER(&buf2, src);
/* no need to cleanup as all storage was xfered */
return rc;
}

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

@ -20,6 +20,8 @@
#include "src/util/argv.h"
#include "src/util/compress.h"
#include "src/util/hash.h"
#include "src/util/show_help.h"
#include "src/runtime/pmix_rte.h"
#include "src/include/pmix_jobdata.h"
#if defined(PMIX_ENABLE_DSTORE) && (PMIX_ENABLE_DSTORE == 1)
@ -77,6 +79,7 @@ static inline int _rank_key_dstore_store(void *cbdata)
pmix_job_data_caddy_t *cb = (pmix_job_data_caddy_t*)cbdata;
pmix_rank_t rank;
pmix_kval_t *kv = NULL;
bool flag = true;
if (NULL == cb->bufs) {
rc = PMIX_ERR_BAD_PARAM;
@ -93,9 +96,22 @@ static inline int _rank_key_dstore_store(void *cbdata)
tmp = &(PMIX_VALUE_ARRAY_GET_ITEM(cb->bufs, pmix_buffer_t, i));
rank = 0 == i ? PMIX_RANK_WILDCARD : i - 1;
PMIX_UNLOAD_BUFFER(tmp, kv->value->data.bo.bytes, kv->value->data.bo.size);
if (PMIX_SUCCESS != (rc = cb->dstore_fn(cb->nsptr->nspace, rank, kv))) {
PMIX_ERROR_LOG(rc);
goto exit;
if (NULL == kv->value->data.bo.bytes) {
if (flag && !pmix_suppress_missing_data_warning) {
/* this occurs if the host RM did _not_ provide us with
* data for every process in the job, in non-compliance
* with the PMIx standard. Warn the user that their job
* may not scale as desired, and give them a way to turn
* that warning off in case the RM just can't do it */
pmix_show_help("help-pmix-runtime.txt", "missingdata", true);
/* only show this once */
flag = false;
}
} else {
if (PMIX_SUCCESS != (rc = cb->dstore_fn(cb->nsptr->nspace, rank, kv))) {
PMIX_ERROR_LOG(rc);
goto exit;
}
}
}

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

@ -181,6 +181,9 @@ void pmix_event_timeout_cb(int fd, short flags, void *arg);
PMIX_INFO_FREE(ch->info, ch->ninfo); \
ch->info = info; \
ch->ninfo = ninfo; \
/* reset the timer */ \
pmix_event_del(&ch->ev); \
pmix_event_add(&ch->ev, &pmix_globals.event_window); \
} \
} while(0)

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

@ -3,6 +3,8 @@
* Copyright (c) 2014-2017 Intel, Inc. All rights reserved.
* Copyright (c) 2017 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* Copyright (c) 2017 IBM Corporation. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -848,6 +850,23 @@ pmix_status_t pmix_server_notify_client_of_event(pmix_status_t status,
}
}
}
/*
* If the range is PMIX_RANGE_NAMESPACE, then they should not have set a
* PMIX_EVENT_CUSTOM_RANGE info object or at least we should ignore it
*/
if (PMIX_RANGE_NAMESPACE == cd->range) {
if (cd->targets) {
PMIX_PROC_FREE(cd->targets, cd->ntargets);
}
PMIX_PROC_CREATE(cd->targets, 1);
cd->ntargets = 1;
cd->targets[0].rank = PMIX_RANK_WILDCARD;
if (NULL == source) {
strncpy(cd->targets[0].nspace, "UNDEF", PMIX_MAX_NSLEN);
} else {
strncpy(cd->targets[0].nspace, source->nspace, PMIX_MAX_NSLEN);
}
}
/* pack the command */
if (PMIX_SUCCESS != (rc = pmix_bfrop.pack(cd->buf, &cmd, 1, PMIX_CMD))) {

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

@ -63,7 +63,7 @@ AC_DEFUN([MCA_pmix_pdl_pdlopen_CONFIG],[
])
AS_IF([test "$pmix_pdl_pdlopen_happy" = "yes"],
[pdl_pdlopen_ADD_LIBS=$pmix_pdl_pdlopen_LIBS
[pmix_pdl_pdlopen_ADD_LIBS=$pmix_pdl_pdlopen_LIBS
$1],
[$2])

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

@ -12,6 +12,7 @@
# All rights reserved.
# Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
# Copyright (c) 2014 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2017 Intel, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -31,38 +32,11 @@ PMIX developer):
%s failed
--> Returned value %d instead of PMIX_SUCCESS
#
[pmix_cr_init:no-crs]
It looks like pmix_cr_init failed. This usually means that the CRS component
could not be activated on this machine. Check the installation of your
checkpointer, MCA parameters, and configuration. If all of that seems
correct, then copy this error message with the additional information below
to the PMIX users list.
Function: %s
Return value: %d
#
# Just want a clean printout for sys limit as the
# message was already generated by show-help
[pmix_init:syslimit]
%s
#
[pmix_init:warn-fork]
A process has executed an operation involving a call to the
"fork()" system call to create a child process. PMIX is currently
operating in a condition that could result in memory corruption or
other system errors; your job may hang, crash, or produce silent
data corruption. The use of fork() (or system() or other calls that
create child processes) is strongly discouraged.
[missingdata]
PMIx has detected that the host RM failed to provide all the job-level
information specified by the PMIx standard. This is not necessarily
a fatal situation, but may negatively impact your launch performance.
The process that invoked fork was:
Local host: %s (PID %d)
If you are *absolutely sure* that your application will successfully
and correctly survive a call to fork(), you may disable this warning
by setting the mpi_warn_on_fork MCA parameter to 0.
#
[mpi-params:leave-pinned-and-pipeline-selected]
WARNING: Cannot set both the MCA parameters pmix_leave_pinned (a.k.a.,
mpi_leave_pinned) and pmix_leave_pinned_pipeline (a.k.a.,
mpi_leave_pinned_pipeline) to "true". Defaulting to mpi_leave_pinned
ONLY.
If you feel you have received this warning in error, or wish to ignore
it in the future, you can disable it by setting the PMIx MCA parameter
"pmix_suppress_missing_data_warning=1"

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

@ -43,7 +43,8 @@ bool pmix_timing_overhead = true;
static bool pmix_register_done = false;
char *pmix_net_private_ipv4 = NULL;
int pmix_event_caching_window;
int pmix_event_caching_window = 1;
bool pmix_suppress_missing_data_warning = false;
pmix_status_t pmix_register_params(void)
{
@ -91,14 +92,20 @@ pmix_status_t pmix_register_params(void)
return ret;
}
pmix_event_caching_window = 3;
(void) pmix_mca_base_var_register ("pmix", "pmix", NULL, "event_caching_window",
"Time (in seconds) to cache events before reporting them - this "
"allows for event aggregation",
"Time (in seconds) to aggregate events before reporting them - this "
"suppresses event cascades when processes abnormally terminate",
PMIX_MCA_BASE_VAR_TYPE_INT, NULL, 0, 0,
PMIX_INFO_LVL_9, PMIX_MCA_BASE_VAR_SCOPE_ALL,
PMIX_INFO_LVL_1, PMIX_MCA_BASE_VAR_SCOPE_ALL,
&pmix_event_caching_window);
(void) pmix_mca_base_var_register ("pmix", "pmix", NULL, "suppress_missing_data_warning",
"Suppress warning that PMIx is missing job-level data that "
"is supposed to be provided by the host RM.",
PMIX_MCA_BASE_VAR_TYPE_BOOL, NULL, 0, 0,
PMIX_INFO_LVL_1, PMIX_MCA_BASE_VAR_SCOPE_ALL,
&pmix_suppress_missing_data_warning);
return PMIX_SUCCESS;
}

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

@ -47,6 +47,7 @@ extern bool pmix_timing_overhead;
extern int pmix_initialized;
extern char *pmix_net_private_ipv4;
extern int pmix_event_caching_window;
extern bool pmix_suppress_missing_data_warning;
/** version string of pmix */
extern const char pmix_version_string[];

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

@ -123,8 +123,12 @@ int main(int argc, char **argv)
/* rank=0 dies */
if (4 < nprocs) {
/* have two exit */
if (myproc.rank < 2) {
/* have one exit */
if (0 == myproc.rank) {
pmix_output(0, "Client ns %s rank %d: bye-bye!", myproc.nspace, myproc.rank);
exit(1);
} else if (1 == myproc.rank) {
usleep(500000);
pmix_output(0, "Client ns %s rank %d: bye-bye!", myproc.nspace, myproc.rank);
exit(1);
}