sync with pmix master (repo_rev git69c398e)
Этот коммит содержится в:
родитель
5787e9248f
Коммит
cc5e1e26a5
@ -30,7 +30,7 @@ greek=a1
|
|||||||
# command, or with the date (if "git describe" fails) in the form of
|
# command, or with the date (if "git describe" fails) in the form of
|
||||||
# "date<date>".
|
# "date<date>".
|
||||||
|
|
||||||
repo_rev=git3c37421
|
repo_rev=git69c398e
|
||||||
|
|
||||||
# If tarball_version is not empty, it is used as the version string in
|
# If tarball_version is not empty, it is used as the version string in
|
||||||
# the tarball filename, regardless of all other versions listed in
|
# the tarball filename, regardless of all other versions listed in
|
||||||
@ -44,7 +44,7 @@ tarball_version=
|
|||||||
|
|
||||||
# The date when this release was created
|
# The date when this release was created
|
||||||
|
|
||||||
date="Oct 02, 2015"
|
date="Oct 09, 2015"
|
||||||
|
|
||||||
# The shared library version of each of PMIx's public libraries.
|
# The shared library version of each of PMIx's public libraries.
|
||||||
# These versions are maintained in accordance with the "Library
|
# These versions are maintained in accordance with the "Library
|
||||||
|
@ -343,26 +343,26 @@ static void errhandler(pmix_status_t status,
|
|||||||
pmix_proc_t procs[], size_t nprocs,
|
pmix_proc_t procs[], size_t nprocs,
|
||||||
pmix_info_t info[], size_t ninfo)
|
pmix_info_t info[], size_t ninfo)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: ERRHANDLER CALLED WITH STATUS %d", status);
|
pmix_output_verbose(0, pmix_globals.debug_output, "SERVER: ERRHANDLER CALLED WITH STATUS %d", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void op_callbk(pmix_status_t status,
|
static void op_callbk(pmix_status_t status,
|
||||||
void *cbdata)
|
void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: OP CALLBACK CALLED WITH STATUS %d", status);
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: OP CALLBACK CALLED WITH STATUS %d", status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void errhandler_reg_callbk (pmix_status_t status,
|
static void errhandler_reg_callbk (pmix_status_t status,
|
||||||
int errhandler_ref,
|
int errhandler_ref,
|
||||||
void *cbdata)
|
void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: ERRHANDLER REGISTRATION CALLBACK CALLED WITH STATUS %d, ref=%d",
|
pmix_output_verbose(1, pmix_globals.debug_output, "SERVER: ERRHANDLER REGISTRATION CALLBACK CALLED WITH STATUS %d, ref=%d",
|
||||||
status, errhandler_ref);
|
status, errhandler_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int connected(const pmix_proc_t *proc, void *server_object)
|
static int connected(const pmix_proc_t *proc, void *server_object)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: CONNECTED %s:%d", proc->nspace, proc->rank);
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: CONNECTED %s:%d", proc->nspace, proc->rank);
|
||||||
return PMIX_SUCCESS;
|
return PMIX_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -370,7 +370,7 @@ static int connected(const pmix_proc_t *proc, void *server_object)
|
|||||||
static int finalized(const pmix_proc_t *proc, void *server_object,
|
static int finalized(const pmix_proc_t *proc, void *server_object,
|
||||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: FINALIZED %s:%d", proc->nspace, proc->rank);
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: FINALIZED %s:%d", proc->nspace, proc->rank);
|
||||||
--wakeup;
|
--wakeup;
|
||||||
/* ensure we call the cbfunc so the proc can exit! */
|
/* ensure we call the cbfunc so the proc can exit! */
|
||||||
if (NULL != cbfunc) {
|
if (NULL != cbfunc) {
|
||||||
@ -399,7 +399,7 @@ static pmix_status_t abort_fn(const pmix_proc_t *proc,
|
|||||||
pmix_status_t rc;
|
pmix_status_t rc;
|
||||||
myxfer_t *x;
|
myxfer_t *x;
|
||||||
|
|
||||||
pmix_output_verbose(2, "SERVER: ABORT on %s:%d", procs[0].nspace, procs[0].rank);
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: ABORT on %s:%d", procs[0].nspace, procs[0].rank);
|
||||||
|
|
||||||
/* instead of aborting the specified procs, notify them
|
/* instead of aborting the specified procs, notify them
|
||||||
* (if they have registered their errhandler) */
|
* (if they have registered their errhandler) */
|
||||||
@ -423,7 +423,7 @@ static pmix_status_t abort_fn(const pmix_proc_t *proc,
|
|||||||
if (PMIX_SUCCESS != (rc = PMIx_Notify_error(status, procs, nprocs,
|
if (PMIX_SUCCESS != (rc = PMIx_Notify_error(status, procs, nprocs,
|
||||||
&x->caller, 1, x->info, 2,
|
&x->caller, 1, x->info, 2,
|
||||||
abcbfunc, x))) {
|
abcbfunc, x))) {
|
||||||
pmix_output_verbose(1, "SERVER: FAILED NOTIFY ERROR %d", (int)rc);
|
pmix_output_verbose(0, pmix_globals.debug_output, "SERVER: FAILED NOTIFY ERROR %d", (int)rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return PMIX_SUCCESS;
|
return PMIX_SUCCESS;
|
||||||
@ -435,7 +435,7 @@ static int fencenb_fn(const pmix_proc_t procs[], size_t nprocs,
|
|||||||
char *data, size_t ndata,
|
char *data, size_t ndata,
|
||||||
pmix_modex_cbfunc_t cbfunc, void *cbdata)
|
pmix_modex_cbfunc_t cbfunc, void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: FENCENB");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: FENCENB");
|
||||||
/* pass the provided data back to each participating proc */
|
/* pass the provided data back to each participating proc */
|
||||||
if (NULL != cbfunc) {
|
if (NULL != cbfunc) {
|
||||||
cbfunc(PMIX_SUCCESS, data, ndata, cbdata, NULL, NULL);
|
cbfunc(PMIX_SUCCESS, data, ndata, cbdata, NULL, NULL);
|
||||||
@ -448,7 +448,7 @@ static int dmodex_fn(const pmix_proc_t *proc,
|
|||||||
const pmix_info_t info[], size_t ninfo,
|
const pmix_info_t info[], size_t ninfo,
|
||||||
pmix_modex_cbfunc_t cbfunc, void *cbdata)
|
pmix_modex_cbfunc_t cbfunc, void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: DMODEX");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: DMODEX");
|
||||||
|
|
||||||
/* we don't have any data for remote procs as this
|
/* we don't have any data for remote procs as this
|
||||||
* test only runs one server - so report accordingly */
|
* test only runs one server - so report accordingly */
|
||||||
@ -466,7 +466,7 @@ static int publish_fn(const pmix_proc_t *proc,
|
|||||||
pmix_locdat_t *p;
|
pmix_locdat_t *p;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
pmix_output_verbose(2, "SERVER: PUBLISH");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: PUBLISH");
|
||||||
|
|
||||||
for (n=0; n < ninfo; n++) {
|
for (n=0; n < ninfo; n++) {
|
||||||
p = PMIX_NEW(pmix_locdat_t);
|
p = PMIX_NEW(pmix_locdat_t);
|
||||||
@ -493,7 +493,7 @@ static int lookup_fn(const pmix_proc_t *proc, char **keys,
|
|||||||
pmix_pdata_t *pd;
|
pmix_pdata_t *pd;
|
||||||
pmix_status_t ret = PMIX_ERR_NOT_FOUND;
|
pmix_status_t ret = PMIX_ERR_NOT_FOUND;
|
||||||
|
|
||||||
pmix_output_verbose(2, "SERVER: LOOKUP");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: LOOKUP");
|
||||||
|
|
||||||
PMIX_CONSTRUCT(&results, pmix_list_t);
|
PMIX_CONSTRUCT(&results, pmix_list_t);
|
||||||
|
|
||||||
@ -539,7 +539,7 @@ static int unpublish_fn(const pmix_proc_t *proc, char **keys,
|
|||||||
pmix_locdat_t *p, *p2;
|
pmix_locdat_t *p, *p2;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
pmix_output_verbose(2, "SERVER: UNPUBLISH");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: UNPUBLISH");
|
||||||
|
|
||||||
for (n=0; NULL != keys[n]; n++) {
|
for (n=0; NULL != keys[n]; n++) {
|
||||||
PMIX_LIST_FOREACH_SAFE(p, p2, &pubdata, pmix_locdat_t) {
|
PMIX_LIST_FOREACH_SAFE(p, p2, &pubdata, pmix_locdat_t) {
|
||||||
@ -572,7 +572,7 @@ static int spawn_fn(const pmix_proc_t *proc,
|
|||||||
{
|
{
|
||||||
myxfer_t *x;
|
myxfer_t *x;
|
||||||
|
|
||||||
pmix_output_verbose(2, "SERVER: SPAWN");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: SPAWN");
|
||||||
|
|
||||||
/* in practice, we would pass this request to the local
|
/* in practice, we would pass this request to the local
|
||||||
* resource manager for launch, and then have that server
|
* resource manager for launch, and then have that server
|
||||||
@ -595,7 +595,7 @@ static int connect_fn(const pmix_proc_t procs[], size_t nprocs,
|
|||||||
const pmix_info_t info[], size_t ninfo,
|
const pmix_info_t info[], size_t ninfo,
|
||||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: CONNECT");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: CONNECT");
|
||||||
|
|
||||||
/* in practice, we would pass this request to the local
|
/* in practice, we would pass this request to the local
|
||||||
* resource manager for handling */
|
* resource manager for handling */
|
||||||
@ -612,7 +612,7 @@ static int disconnect_fn(const pmix_proc_t procs[], size_t nprocs,
|
|||||||
const pmix_info_t info[], size_t ninfo,
|
const pmix_info_t info[], size_t ninfo,
|
||||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: DISCONNECT");
|
pmix_output_verbose(2, pmix_globals.debug_output,"SERVER: DISCONNECT");
|
||||||
|
|
||||||
/* in practice, we would pass this request to the local
|
/* in practice, we would pass this request to the local
|
||||||
* resource manager for handling */
|
* resource manager for handling */
|
||||||
@ -627,7 +627,7 @@ static int disconnect_fn(const pmix_proc_t procs[], size_t nprocs,
|
|||||||
static int register_events_fn(const pmix_info_t info[], size_t ninfo,
|
static int register_events_fn(const pmix_info_t info[], size_t ninfo,
|
||||||
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
pmix_op_cbfunc_t cbfunc, void *cbdata)
|
||||||
{
|
{
|
||||||
pmix_output_verbose(2, "SERVER: REGISTER EVENTS");
|
pmix_output_verbose(2, pmix_globals.debug_output, "SERVER: REGISTER EVENTS");
|
||||||
|
|
||||||
/* in practice, we would pass this request to the local
|
/* in practice, we would pass this request to the local
|
||||||
* resource manager for handling */
|
* resource manager for handling */
|
||||||
|
@ -109,7 +109,7 @@ typedef struct PMI2_Connect_comm {
|
|||||||
- appnum - which executable is this on the mpiexec commandline
|
- appnum - which executable is this on the mpiexec commandline
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
Initialize PMI for this process group. The value of spawned indicates whether
|
Initialize PMI for this process group. The value of spawned indicates whether
|
||||||
@ -123,7 +123,7 @@ int PMI2_Init(int *spawned, int *size, int *rank, int *appnum);
|
|||||||
PMI2_Finalize - finalize the Process Manager Interface
|
PMI2_Finalize - finalize the Process Manager Interface
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
Finalize PMI for this job.
|
Finalize PMI for this job.
|
||||||
@ -175,7 +175,7 @@ int PMI2_Abort(int flag, const char msg[]);
|
|||||||
- errors - array of errors for each command
|
- errors - array of errors for each command
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
This function spawns a set of processes into a new job. The 'count'
|
This function spawns a set of processes into a new job. The 'count'
|
||||||
@ -211,11 +211,29 @@ int PMI2_Job_Spawn(int count, const char * cmds[],
|
|||||||
. jobid - the job id of this job
|
. jobid - the job id of this job
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
@*/
|
@*/
|
||||||
int PMI2_Job_GetId(char jobid[], int jobid_size);
|
int PMI2_Job_GetId(char jobid[], int jobid_size);
|
||||||
|
|
||||||
|
/*@
|
||||||
|
PMI2_Job_GetRank - get rank of this job
|
||||||
|
Output parameters:
|
||||||
|
. rank - the rank of this job
|
||||||
|
Return values:
|
||||||
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
@*/
|
||||||
|
int PMI2_Job_GetRank(int* rank);
|
||||||
|
|
||||||
|
/*@
|
||||||
|
PMI2_Info_GetSize - get the number of processes on the node
|
||||||
|
Output parameters:
|
||||||
|
. rank - the rank of this job
|
||||||
|
Return values:
|
||||||
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
@*/
|
||||||
|
int PMI2_Info_GetSize(int* size);
|
||||||
|
|
||||||
/*@
|
/*@
|
||||||
PMI2_Job_Connect - connect to the parallel job with ID jobid
|
PMI2_Job_Connect - connect to the parallel job with ID jobid
|
||||||
|
|
||||||
@ -227,7 +245,7 @@ int PMI2_Job_GetId(char jobid[], int jobid_size);
|
|||||||
the remote job
|
the remote job
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
This just "registers" the other parallel job as part of a parallel
|
This just "registers" the other parallel job as part of a parallel
|
||||||
@ -247,7 +265,7 @@ int PMI2_Job_Connect(const char jobid[], PMI2_Connect_comm_t *conn);
|
|||||||
. jobid - job id of the job to connect to
|
. jobid - job id of the job to connect to
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
@*/
|
@*/
|
||||||
int PMI2_Job_Disconnect(const char jobid[]);
|
int PMI2_Job_Disconnect(const char jobid[]);
|
||||||
@ -260,7 +278,7 @@ int PMI2_Job_Disconnect(const char jobid[]);
|
|||||||
- value - value
|
- value - value
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
If multiple PMI2_KVS_Put calls are made with the same key between
|
If multiple PMI2_KVS_Put calls are made with the same key between
|
||||||
@ -274,7 +292,7 @@ int PMI2_KVS_Put(const char key[], const char value[]);
|
|||||||
PMI2_KVS_Fence - commit all PMI2_KVS_Put calls made before this fence
|
PMI2_KVS_Fence - commit all PMI2_KVS_Put calls made before this fence
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
This is a collective call across the job. It has semantics that are
|
This is a collective call across the job. It has semantics that are
|
||||||
@ -310,7 +328,7 @@ int PMI2_KVS_Fence(void);
|
|||||||
than maxvalue, the negative of the required length is returned
|
than maxvalue, the negative of the required length is returned
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
@*/
|
@*/
|
||||||
int PMI2_KVS_Get(const char *jobid, int src_pmi_id, const char key[], char value [], int maxvalue, int *vallen);
|
int PMI2_KVS_Get(const char *jobid, int src_pmi_id, const char key[], char value [], int maxvalue, int *vallen);
|
||||||
@ -330,7 +348,7 @@ int PMI2_KVS_Get(const char *jobid, int src_pmi_id, const char key[], char value
|
|||||||
- found - non-zero indicates that the attribute was found
|
- found - non-zero indicates that the attribute was found
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
This provides a way, when combined with PMI2_Info_PutNodeAttr, for
|
This provides a way, when combined with PMI2_Info_PutNodeAttr, for
|
||||||
@ -369,7 +387,7 @@ int PMI2_Info_GetNodeAttr(const char name[], char value[], int valuelen, int *fo
|
|||||||
- found - non-zero if attribute was found
|
- found - non-zero if attribute was found
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
Notice that, unlike PMI2_Info_GetNodeAttr, this function does not
|
Notice that, unlike PMI2_Info_GetNodeAttr, this function does not
|
||||||
@ -398,7 +416,7 @@ int PMI2_Info_GetNodeAttrIntArray(const char name[], int array[], int arraylen,
|
|||||||
- value - the value of the attribute
|
- value - the value of the attribute
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
For example, it might be used to share segment ids with other
|
For example, it might be used to share segment ids with other
|
||||||
@ -420,7 +438,7 @@ int PMI2_Info_PutNodeAttr(const char name[], const char value[]);
|
|||||||
- found - non-zero indicates that the attribute was found
|
- found - non-zero indicates that the attribute was found
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
@*/
|
@*/
|
||||||
int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *found);
|
int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *found);
|
||||||
@ -439,7 +457,7 @@ int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *fou
|
|||||||
- found - non-zero if attribute was found
|
- found - non-zero if attribute was found
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
Predefined array attribute names:
|
Predefined array attribute names:
|
||||||
|
|
||||||
@ -499,7 +517,7 @@ int PMI2_Info_GetJobAttrIntArray(const char name[], int array[], int arraylen, i
|
|||||||
- port - string representing the port on which to contact the service
|
- port - string representing the port on which to contact the service
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
@*/
|
@*/
|
||||||
int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_ptr, const char port[]);
|
int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_ptr, const char port[]);
|
||||||
@ -516,7 +534,7 @@ int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_pt
|
|||||||
. port - string representing the port on which to contact the service
|
. port - string representing the port on which to contact the service
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
@*/
|
@*/
|
||||||
int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr,
|
int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr,
|
||||||
@ -529,7 +547,7 @@ int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr
|
|||||||
- info_ptr -
|
- info_ptr -
|
||||||
|
|
||||||
Return values:
|
Return values:
|
||||||
Returns 'MPI_SUCCESS' on success and an MPI error code on failure.
|
Returns 'PMI2_SUCCESS' on success and an PMI error code on failure.
|
||||||
|
|
||||||
@*/
|
@*/
|
||||||
int PMI2_Nameserv_unpublish(const char service_name[],
|
int PMI2_Nameserv_unpublish(const char service_name[],
|
||||||
|
@ -470,10 +470,10 @@ typedef struct {
|
|||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
#define PMIX_INFO_LOAD(m, k, v, t) \
|
#define PMIX_INFO_LOAD(m, k, v, t) \
|
||||||
if (NULL != (m)) { \
|
do { \
|
||||||
(void)strncpy((m)->key, (k), PMIX_MAX_KEYLEN); \
|
(void)strncpy((m)->key, (k), PMIX_MAX_KEYLEN); \
|
||||||
pmix_value_load(&((m)->value), (v), (t)); \
|
pmix_value_load(&((m)->value), (v), (t)); \
|
||||||
}
|
} while(0);
|
||||||
|
|
||||||
|
|
||||||
/**** PMIX LOOKUP RETURN STRUCT ****/
|
/**** PMIX LOOKUP RETURN STRUCT ****/
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015 Research Organization for Information Science
|
* Copyright (c) 2015 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015 Research Organization for Information Science
|
* Copyright (c) 2015 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
||||||
* Copyright (c) 2014 Research Organization for Information Science
|
* Copyright (c) 2014 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
@ -37,53 +39,79 @@
|
|||||||
#include "src/util/error.h"
|
#include "src/util/error.h"
|
||||||
#include "src/util/output.h"
|
#include "src/util/output.h"
|
||||||
|
|
||||||
|
#define PMI_MAX_ID_LEN PMIX_MAX_NSLEN /* Maximim size of PMI process group ID */
|
||||||
|
#define PMI_MAX_KEY_LEN PMIX_MAX_KEYLEN /* Maximum size of a PMI key */
|
||||||
|
#define PMI_MAX_KVSNAME_LEN PMIX_MAX_NSLEN /* Maximum size of KVS name */
|
||||||
|
#define PMI_MAX_VAL_LEN 4096 /* Maximum size of a PMI value */
|
||||||
|
|
||||||
|
#define PMI_CHECK() \
|
||||||
|
do { \
|
||||||
|
if (!pmi_init) { \
|
||||||
|
return PMI_FAIL; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/* local functions */
|
/* local functions */
|
||||||
static pmix_status_t convert_int(int *value, pmix_value_t *kv);
|
static pmix_status_t convert_int(int *value, pmix_value_t *kv);
|
||||||
static int convert_err(pmix_status_t rc);
|
static int convert_err(pmix_status_t rc);
|
||||||
static pmix_proc_t myproc;
|
static pmix_proc_t myproc;
|
||||||
static bool data_commited = false;
|
static bool data_commited = false;
|
||||||
|
static int pmi_init = 0;
|
||||||
|
|
||||||
int PMI_Init( int *spawned )
|
int PMI_Init(int *spawned)
|
||||||
{
|
{
|
||||||
pmix_value_t *kv;
|
pmix_value_t *val;
|
||||||
pmix_status_t rc;
|
pmix_status_t rc;
|
||||||
|
|
||||||
if (PMIX_SUCCESS != PMIx_Init(&myproc)) {
|
if (PMIX_SUCCESS != PMIx_Init(&myproc)) {
|
||||||
return PMI_ERR_INIT;
|
return PMI_ERR_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == spawned) {
|
if (NULL != spawned) {
|
||||||
return PMI_SUCCESS;
|
/* get the spawned flag */
|
||||||
|
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_SPAWNED, NULL, 0, &val)) {
|
||||||
|
rc = convert_int(spawned, val);
|
||||||
|
PMIX_VALUE_RELEASE(val);
|
||||||
|
if (PMIX_SUCCESS != rc) {
|
||||||
|
return convert_err(rc);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* if not found, default to not spawned */
|
||||||
|
*spawned = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
pmi_init = 1;
|
||||||
|
|
||||||
/* get the spawned flag - this will likely pull
|
|
||||||
* down all attributes assigned to the job, thus
|
|
||||||
* making all subsequent "get" operations purely
|
|
||||||
* local */
|
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_SPAWNED, NULL, 0, &kv)) {
|
|
||||||
rc = convert_int(spawned, kv);
|
|
||||||
PMIX_VALUE_RELEASE(kv);
|
|
||||||
return convert_err(rc);
|
|
||||||
}
|
|
||||||
/* if it wasn't found, then default to "not spawned" */
|
|
||||||
*spawned = 0;
|
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_Initialized(PMI_BOOL *initialized)
|
int PMI_Initialized(PMI_BOOL *initialized)
|
||||||
{
|
{
|
||||||
*initialized = (PMI_BOOL)PMIx_Initialized();
|
if (NULL == initialized) {
|
||||||
|
return PMI_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
*initialized = (PMIx_Initialized() ? PMI_TRUE : PMI_FALSE);
|
||||||
|
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_Finalize(void)
|
int PMI_Finalize(void)
|
||||||
{
|
{
|
||||||
return PMIx_Finalize();
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
|
pmi_init = 0;
|
||||||
|
rc = PMIx_Finalize();
|
||||||
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_Abort(int flag, const char msg[])
|
int PMI_Abort(int flag, const char msg[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
rc = PMIx_Abort(flag, msg, NULL, 0);
|
rc = PMIx_Abort(flag, msg, NULL, 0);
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
@ -93,12 +121,23 @@ int PMI_Abort(int flag, const char msg[])
|
|||||||
* provided kvsname as we only put into our own nspace */
|
* provided kvsname as we only put into our own nspace */
|
||||||
int PMI_KVS_Put(const char kvsname[], const char key[], const char value[])
|
int PMI_KVS_Put(const char kvsname[], const char key[], const char value[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_value_t val;
|
pmix_value_t val;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
|
if ((kvsname == NULL) || (strlen(kvsname) > PMI_MAX_KVSNAME_LEN)) {
|
||||||
|
return PMI_ERR_INVALID_KVS;
|
||||||
|
}
|
||||||
|
if ((key == NULL) || (strlen(key) >PMI_MAX_KEY_LEN)) {
|
||||||
|
return PMI_ERR_INVALID_KEY;
|
||||||
|
}
|
||||||
|
if ((value == NULL) || (strlen(value) > PMI_MAX_VAL_LEN)) {
|
||||||
|
return PMI_ERR_INVALID_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||||
"PMI_KVS_Put: KVS=%s, key=%s value=%s",
|
"PMI_KVS_Put: KVS=%s, key=%s value=%s", kvsname, key, value);
|
||||||
kvsname, key, value);
|
|
||||||
|
|
||||||
val.type = PMIX_STRING;
|
val.type = PMIX_STRING;
|
||||||
val.data.string = (char*)value;
|
val.data.string = (char*)value;
|
||||||
@ -109,10 +148,16 @@ int PMI_KVS_Put(const char kvsname[], const char key[], const char value[])
|
|||||||
/* KVS_Commit */
|
/* KVS_Commit */
|
||||||
int PMI_KVS_Commit(const char kvsname[])
|
int PMI_KVS_Commit(const char kvsname[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
|
|
||||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
PMI_CHECK();
|
||||||
"PMI_KVS_Commit: KVS=%s", kvsname);
|
|
||||||
|
if ((kvsname == NULL) || (strlen(kvsname) > PMI_MAX_KVSNAME_LEN)) {
|
||||||
|
return PMI_ERR_INVALID_KVS;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmix_output_verbose(2, pmix_globals.debug_output, "PMI_KVS_Commit: KVS=%s",
|
||||||
|
kvsname);
|
||||||
|
|
||||||
rc = PMIx_Commit();
|
rc = PMIx_Commit();
|
||||||
/* PMIx permits only one data commit! */
|
/* PMIx permits only one data commit! */
|
||||||
@ -122,27 +167,38 @@ int PMI_KVS_Commit(const char kvsname[])
|
|||||||
|
|
||||||
int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int length)
|
int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int length)
|
||||||
{
|
{
|
||||||
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_value_t *val;
|
pmix_value_t *val;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
static pmix_proc_t proc;
|
static pmix_proc_t proc;
|
||||||
uint32_t procnum;
|
uint32_t procnum;
|
||||||
proc = myproc;
|
proc = myproc;
|
||||||
int rc;
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
|
if ((kvsname == NULL) || (strlen(kvsname) > PMI_MAX_KVSNAME_LEN)) {
|
||||||
|
return PMI_ERR_INVALID_KVS;
|
||||||
|
}
|
||||||
|
if ((key == NULL) || (strlen(key) >PMI_MAX_KEY_LEN)) {
|
||||||
|
return PMI_ERR_INVALID_KEY;
|
||||||
|
}
|
||||||
|
if (value == NULL) {
|
||||||
|
return PMI_ERR_INVALID_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||||
"PMI_KVS_Get: KVS=%s, key=%s value=%s",
|
"PMI_KVS_Get: KVS=%s, key=%s value=%s", kvsname, key, value);
|
||||||
kvsname, key, value);
|
|
||||||
|
|
||||||
/* PMI-1 expects resource manager to set
|
/* PMI-1 expects resource manager to set
|
||||||
* process mapping in ANL notation. */
|
* process mapping in ANL notation. */
|
||||||
if( !strcmp(key, ANL_MAPPING) ) {
|
if (!strcmp(key, ANL_MAPPING)) {
|
||||||
/* we are looking in the job-data. If there is nothing there
|
/* we are looking in the job-data. If there is nothing there
|
||||||
* we don't want to look in rank's data, thus set rank to widcard */
|
* we don't want to look in rank's data, thus set rank to widcard */
|
||||||
proc.rank = PMIX_RANK_WILDCARD;
|
proc.rank = PMIX_RANK_WILDCARD;
|
||||||
if( PMIX_SUCCESS == PMIx_Get(&proc, PMIX_ANL_MAP, NULL, 0, &val) &&
|
if (PMIX_SUCCESS == PMIx_Get(&proc, PMIX_ANL_MAP, NULL, 0, &val) &&
|
||||||
(NULL != val) && (PMIX_STRING == val->type) ){
|
(NULL != val) && (PMIX_STRING == val->type)) {
|
||||||
strncpy(value,val->data.string,length);
|
strncpy(value, val->data.string, length);
|
||||||
PMIX_VALUE_FREE(val,1);
|
PMIX_VALUE_FREE(val, 1);
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
/* artpol:
|
/* artpol:
|
||||||
@ -167,47 +223,49 @@ int PMI_KVS_Get( const char kvsname[], const char key[], char value[], int lengt
|
|||||||
* an error and don't try to use direct modex.
|
* an error and don't try to use direct modex.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (PMIX_SUCCESS != (rc = PMIx_Get(&myproc,PMIX_JOB_SIZE, NULL, 0,&val))) {
|
if (PMIX_SUCCESS != (rc = PMIx_Get(&myproc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||||
pmix_output_verbose(2, pmix_globals.debug_output,
|
pmix_output_verbose(2, pmix_globals.debug_output,
|
||||||
"pmi1: executing put for KVS %s, key %s value %s",
|
"pmi1: executing put for KVS %s, key %s value %s", kvsname, key,
|
||||||
kvsname, key, value);
|
value);
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
procnum = val->data.uint32;
|
procnum = val->data.uint32;
|
||||||
PMIX_VALUE_FREE(val,1);
|
PMIX_VALUE_FREE(val, 1);
|
||||||
|
|
||||||
for( i=0; i < procnum; i++){
|
for (i = 0; i < procnum; i++) {
|
||||||
proc.rank = i;
|
proc.rank = i;
|
||||||
if( PMIX_SUCCESS == PMIx_Get(&proc, key, NULL, 0, &val) &&
|
if (PMIX_SUCCESS == PMIx_Get(&proc, key, NULL, 0, &val) && (NULL != val)
|
||||||
(NULL != val) && (PMIX_STRING == val->type) ){
|
&& (PMIX_STRING == val->type)) {
|
||||||
strncpy(value,val->data.string,length);
|
strncpy(value, val->data.string, length);
|
||||||
PMIX_VALUE_FREE(val,1);
|
PMIX_VALUE_FREE(val, 1);
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
PMIX_VALUE_FREE(val,1);
|
PMIX_VALUE_FREE(val, 1);
|
||||||
}
|
}
|
||||||
return PMI_FAIL;
|
return PMI_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Barrier only applies to our own nspace, and we want all
|
/* Barrier only applies to our own nspace, and we want all
|
||||||
* data to be collected upon completion */
|
* data to be collected upon completion */
|
||||||
int PMI_Barrier(void)
|
int PMI_Barrier(void)
|
||||||
{
|
{
|
||||||
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_info_t buf;
|
pmix_info_t buf;
|
||||||
int rc, ninfo = 0;
|
int ninfo = 0;
|
||||||
pmix_info_t *info = NULL;
|
pmix_info_t *info = NULL;
|
||||||
|
|
||||||
if( data_commited ){
|
PMI_CHECK();
|
||||||
bool val = 1;
|
|
||||||
|
if (data_commited) {
|
||||||
|
bool val = 1;
|
||||||
info = &buf;
|
info = &buf;
|
||||||
PMIX_INFO_CONSTRUCT(info);
|
PMIX_INFO_CONSTRUCT(info);
|
||||||
PMIX_INFO_LOAD(info, PMIX_COLLECT_DATA, &val, PMIX_BOOL );
|
PMIX_INFO_LOAD(info, PMIX_COLLECT_DATA, &val, PMIX_BOOL);
|
||||||
ninfo = 1;
|
ninfo = 1;
|
||||||
}
|
}
|
||||||
rc = PMIx_Fence(NULL, 0, info, ninfo);
|
rc = PMIx_Fence(NULL, 0, info, ninfo);
|
||||||
|
|
||||||
if( NULL != info ){
|
if (NULL != info) {
|
||||||
PMIX_INFO_DESTRUCT(info);
|
PMIX_INFO_DESTRUCT(info);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
@ -215,16 +273,18 @@ int PMI_Barrier(void)
|
|||||||
|
|
||||||
int PMI_Get_size(int *size)
|
int PMI_Get_size(int *size)
|
||||||
{
|
{
|
||||||
pmix_value_t *kv;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_status_t rc;
|
pmix_value_t *val;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL == size) {
|
if (NULL == size) {
|
||||||
return PMI_FAIL;
|
return PMI_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_JOB_SIZE, NULL, 0, &kv)) {
|
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_JOB_SIZE, NULL, 0, &val)) {
|
||||||
rc = convert_int(size, kv);
|
rc = convert_int(size, val);
|
||||||
PMIX_VALUE_RELEASE(kv);
|
PMIX_VALUE_RELEASE(val);
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,26 +293,30 @@ int PMI_Get_size(int *size)
|
|||||||
|
|
||||||
int PMI_Get_rank(int *rk)
|
int PMI_Get_rank(int *rk)
|
||||||
{
|
{
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL == rk) {
|
if (NULL == rk) {
|
||||||
return PMI_FAIL;
|
return PMI_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
*rk = pmix_globals.myid.rank;
|
*rk = myproc.rank;
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_Get_universe_size(int *size)
|
int PMI_Get_universe_size(int *size)
|
||||||
{
|
{
|
||||||
pmix_value_t *kv;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_status_t rc;
|
pmix_value_t *val;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL == size) {
|
if (NULL == size) {
|
||||||
return PMI_FAIL;
|
return PMI_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_UNIV_SIZE, NULL, 0, &kv)) {
|
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_UNIV_SIZE, NULL, 0, &val)) {
|
||||||
rc = convert_int(size, kv);
|
rc = convert_int(size, val);
|
||||||
PMIX_VALUE_RELEASE(kv);
|
PMIX_VALUE_RELEASE(val);
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
return PMI_FAIL;
|
return PMI_FAIL;
|
||||||
@ -260,13 +324,15 @@ int PMI_Get_universe_size(int *size)
|
|||||||
|
|
||||||
int PMI_Get_appnum(int *appnum)
|
int PMI_Get_appnum(int *appnum)
|
||||||
{
|
{
|
||||||
pmix_value_t *kv;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_status_t rc;
|
pmix_value_t *val;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL != appnum &&
|
if (NULL != appnum &&
|
||||||
PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_APPNUM, NULL, 0, &kv)) {
|
PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_APPNUM, NULL, 0, &val)) {
|
||||||
rc = convert_int(appnum, kv);
|
rc = convert_int(appnum, val);
|
||||||
PMIX_VALUE_RELEASE(kv);
|
PMIX_VALUE_RELEASE(val);
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,16 +341,19 @@ int PMI_Get_appnum(int *appnum)
|
|||||||
|
|
||||||
int PMI_Publish_name(const char service_name[], const char port[])
|
int PMI_Publish_name(const char service_name[], const char port[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_info_t info;
|
pmix_info_t info;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL == service_name || NULL == port) {
|
if (NULL == service_name || NULL == port) {
|
||||||
return convert_err(PMIX_ERR_BAD_PARAM);
|
return PMI_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pass the service/port */
|
/* pass the service/port */
|
||||||
(void)strncpy(info.key, service_name, PMIX_MAX_KEYLEN);
|
(void) strncpy(info.key, service_name, PMIX_MAX_KEYLEN);
|
||||||
info.value.type = PMIX_STRING;
|
info.value.type = PMIX_STRING;
|
||||||
info.value.data.string = (char*)port;
|
info.value.data.string = (char*) port;
|
||||||
|
|
||||||
/* publish the info - PMI-1 doesn't support
|
/* publish the info - PMI-1 doesn't support
|
||||||
* any scope other than inside our own nspace */
|
* any scope other than inside our own nspace */
|
||||||
@ -295,11 +364,17 @@ int PMI_Publish_name(const char service_name[], const char port[])
|
|||||||
|
|
||||||
int PMI_Unpublish_name(const char service_name[])
|
int PMI_Unpublish_name(const char service_name[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
char *keys[2];
|
char *keys[2];
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
|
if (NULL == service_name) {
|
||||||
|
return PMI_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
/* pass the service */
|
/* pass the service */
|
||||||
keys[0] = (char*)service_name;
|
keys[0] = (char*) service_name;
|
||||||
keys[1] = NULL;
|
keys[1] = NULL;
|
||||||
|
|
||||||
rc = PMIx_Unpublish(keys, NULL, 0);
|
rc = PMIx_Unpublish(keys, NULL, 0);
|
||||||
@ -308,13 +383,19 @@ int PMI_Unpublish_name(const char service_name[])
|
|||||||
|
|
||||||
int PMI_Lookup_name(const char service_name[], char port[])
|
int PMI_Lookup_name(const char service_name[], char port[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_pdata_t pdata;
|
pmix_pdata_t pdata;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
|
if (NULL == service_name || NULL == port) {
|
||||||
|
return PMI_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
PMIX_PDATA_CONSTRUCT(&pdata);
|
PMIX_PDATA_CONSTRUCT(&pdata);
|
||||||
|
|
||||||
/* pass the service */
|
/* pass the service */
|
||||||
(void)strncpy(pdata.key, service_name, PMIX_MAX_KEYLEN);
|
(void) strncpy(pdata.key, service_name, PMIX_MAX_KEYLEN);
|
||||||
|
|
||||||
/* PMI-1 doesn't want the nspace back */
|
/* PMI-1 doesn't want the nspace back */
|
||||||
if (PMIX_SUCCESS != (rc = PMIx_Lookup(&pdata, 1, NULL, 0))) {
|
if (PMIX_SUCCESS != (rc = PMIx_Lookup(&pdata, 1, NULL, 0))) {
|
||||||
@ -322,8 +403,7 @@ int PMI_Lookup_name(const char service_name[], char port[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* should have received a string back */
|
/* should have received a string back */
|
||||||
if (PMIX_STRING != pdata.value.type ||
|
if (PMIX_STRING != pdata.value.type || NULL == pdata.value.data.string) {
|
||||||
NULL == pdata.value.data.string) {
|
|
||||||
return convert_err(PMIX_ERR_NOT_FOUND);
|
return convert_err(PMIX_ERR_NOT_FOUND);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -332,7 +412,7 @@ int PMI_Lookup_name(const char service_name[], char port[])
|
|||||||
* potential we could overrun it. As this feature
|
* potential we could overrun it. As this feature
|
||||||
* isn't widely supported in PMI-1, try being
|
* isn't widely supported in PMI-1, try being
|
||||||
* conservative */
|
* conservative */
|
||||||
(void)strncpy(port, pdata.value.data.string, PMIX_MAX_KEYLEN);
|
(void) strncpy(port, pdata.value.data.string, PMIX_MAX_KEYLEN);
|
||||||
PMIX_PDATA_DESTRUCT(&pdata);
|
PMIX_PDATA_DESTRUCT(&pdata);
|
||||||
|
|
||||||
return PMIX_SUCCESS;
|
return PMIX_SUCCESS;
|
||||||
@ -343,37 +423,54 @@ int PMI_Get_id(char id_str[], int length)
|
|||||||
/* we already obtained our nspace during PMI_Init,
|
/* we already obtained our nspace during PMI_Init,
|
||||||
* so all we have to do here is return it */
|
* so all we have to do here is return it */
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
/* bozo check */
|
/* bozo check */
|
||||||
if (NULL == id_str) {
|
if (NULL == id_str) {
|
||||||
return PMI_ERR_INVALID_ARGS;
|
return PMI_ERR_INVALID_ARGS;
|
||||||
}
|
}
|
||||||
(void)strncpy(id_str, pmix_globals.myid.nspace, length);
|
if (length < PMI_MAX_ID_LEN) {
|
||||||
|
return PMI_ERR_INVALID_LENGTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) strncpy(id_str, myproc.nspace, length);
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_Get_kvs_domain_id(char id_str[], int length)
|
int PMI_Get_kvs_domain_id(char id_str[], int length)
|
||||||
{
|
{
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
/* same as PMI_Get_id */
|
/* same as PMI_Get_id */
|
||||||
return PMI_Get_id(id_str, length);
|
return PMI_Get_id(id_str, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_Get_id_length_max(int *length)
|
int PMI_Get_id_length_max(int *length)
|
||||||
{
|
{
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL == length) {
|
if (NULL == length) {
|
||||||
return PMI_ERR_INVALID_VAL_LENGTH;
|
return PMI_ERR_INVALID_VAL_LENGTH;
|
||||||
}
|
}
|
||||||
*length = PMIX_MAX_KEYLEN;
|
|
||||||
|
*length = PMI_MAX_ID_LEN;
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_Get_clique_size(int *size)
|
int PMI_Get_clique_size(int *size)
|
||||||
{
|
{
|
||||||
pmix_value_t *kv;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_status_t rc;
|
pmix_value_t *val;
|
||||||
|
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_LOCAL_SIZE, NULL, 0, &kv)) {
|
PMI_CHECK();
|
||||||
rc = convert_int(size, kv);
|
|
||||||
PMIX_VALUE_RELEASE(kv);
|
if (NULL == size) {
|
||||||
|
return PMI_ERR_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_LOCAL_SIZE, NULL, 0, &val)) {
|
||||||
|
rc = convert_int(size, val);
|
||||||
|
PMIX_VALUE_RELEASE(val);
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -382,19 +479,25 @@ int PMI_Get_clique_size(int *size)
|
|||||||
|
|
||||||
int PMI_Get_clique_ranks(int ranks[], int length)
|
int PMI_Get_clique_ranks(int ranks[], int length)
|
||||||
{
|
{
|
||||||
pmix_value_t *kv;
|
pmix_value_t *val;
|
||||||
char **rks;
|
char **rks;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_LOCAL_PEERS, NULL, 0, &kv)) {
|
PMI_CHECK();
|
||||||
|
|
||||||
|
if (NULL == ranks) {
|
||||||
|
return PMI_ERR_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_LOCAL_PEERS, NULL, 0, &val)) {
|
||||||
/* kv will contain a string of comma-separated
|
/* kv will contain a string of comma-separated
|
||||||
* ranks on my node */
|
* ranks on my node */
|
||||||
rks = pmix_argv_split(kv->data.string, ',');
|
rks = pmix_argv_split(val->data.string, ',');
|
||||||
for (i=0; NULL != rks[i] && i < length; i++) {
|
for (i = 0; NULL != rks[i] && i < length; i++) {
|
||||||
ranks[i] = strtol(rks[i], NULL, 10);
|
ranks[i] = strtol(rks[i], NULL, 10);
|
||||||
}
|
}
|
||||||
pmix_argv_free(rks);
|
pmix_argv_free(rks);
|
||||||
PMIX_VALUE_RELEASE(kv);
|
PMIX_VALUE_RELEASE(val);
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
return PMI_FAIL;
|
return PMI_FAIL;
|
||||||
@ -402,36 +505,47 @@ int PMI_Get_clique_ranks(int ranks[], int length)
|
|||||||
|
|
||||||
int PMI_KVS_Get_my_name(char kvsname[], int length)
|
int PMI_KVS_Get_my_name(char kvsname[], int length)
|
||||||
{
|
{
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
/* same as PMI_Get_id */
|
/* same as PMI_Get_id */
|
||||||
return PMI_Get_id(kvsname, length);
|
return PMI_Get_id(kvsname, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_KVS_Get_name_length_max(int *length)
|
int PMI_KVS_Get_name_length_max(int *length)
|
||||||
{
|
{
|
||||||
if (NULL == length) {
|
PMI_CHECK();
|
||||||
return PMI_ERR_INVALID_VAL_LENGTH;
|
|
||||||
|
if (NULL == length) {
|
||||||
|
return PMI_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
*length = PMIX_MAX_NSLEN;
|
|
||||||
|
*length = PMI_MAX_KVSNAME_LEN;
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_KVS_Get_key_length_max(int *length)
|
int PMI_KVS_Get_key_length_max(int *length)
|
||||||
{
|
{
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL == length) {
|
if (NULL == length) {
|
||||||
return PMI_ERR_INVALID_VAL_LENGTH;
|
return PMI_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
*length = PMIX_MAX_KEYLEN;
|
|
||||||
|
*length = PMI_MAX_KEY_LEN;
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI_KVS_Get_value_length_max(int *length)
|
int PMI_KVS_Get_value_length_max(int *length)
|
||||||
{
|
{
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
if (NULL == length) {
|
if (NULL == length) {
|
||||||
return PMI_ERR_INVALID_VAL_LENGTH;
|
return PMI_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* don't give them an enormous size of some implementations
|
/* don't give them an enormous size of some implementations
|
||||||
* immediately malloc a data block for their use */
|
* immediately malloc a data block for their use */
|
||||||
*length = 4096;
|
*length = PMI_MAX_VAL_LEN;
|
||||||
return PMI_SUCCESS;
|
return PMI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -473,31 +587,37 @@ int PMI_Spawn_multiple(int count,
|
|||||||
const PMI_keyval_t preput_keyval_vector[],
|
const PMI_keyval_t preput_keyval_vector[],
|
||||||
int errors[])
|
int errors[])
|
||||||
{
|
{
|
||||||
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_app_t *apps;
|
pmix_app_t *apps;
|
||||||
int i, k;
|
int i, k;
|
||||||
pmix_status_t rc;
|
|
||||||
size_t j;
|
size_t j;
|
||||||
char *evar;
|
char *evar;
|
||||||
|
|
||||||
|
PMI_CHECK();
|
||||||
|
|
||||||
|
if (NULL == cmds) {
|
||||||
|
return PMI_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
/* setup the apps */
|
/* setup the apps */
|
||||||
PMIX_APP_CREATE(apps, count);
|
PMIX_APP_CREATE(apps, count);
|
||||||
for (i=0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
apps[i].cmd = strdup(cmds[i]);
|
apps[i].cmd = strdup(cmds[i]);
|
||||||
apps[i].maxprocs = maxprocs[i];
|
apps[i].maxprocs = maxprocs[i];
|
||||||
apps[i].argv = pmix_argv_copy((char**)argvs[i]);
|
apps[i].argv = pmix_argv_copy((char**) argvs[i]);
|
||||||
apps[i].argc = pmix_argv_count(apps[i].argv);
|
apps[i].argc = pmix_argv_count(apps[i].argv);
|
||||||
apps[i].ninfo = info_keyval_sizesp[i];
|
apps[i].ninfo = info_keyval_sizesp[i];
|
||||||
if (0 < apps[i].ninfo) {
|
if (0 < apps[i].ninfo) {
|
||||||
apps[i].info = (pmix_info_t*)malloc(apps[i].ninfo * sizeof(pmix_info_t));
|
apps[i].info = (pmix_info_t*)malloc(apps[i].ninfo * sizeof(pmix_info_t));
|
||||||
/* copy the info objects */
|
/* copy the info objects */
|
||||||
for (j=0; j < apps[i].ninfo; j++) {
|
for (j = 0; j < apps[i].ninfo; j++) {
|
||||||
(void)strncpy(apps[i].info[j].key, info_keyval_vectors[i][j].key, PMIX_MAX_KEYLEN);
|
(void)strncpy(apps[i].info[j].key, info_keyval_vectors[i][j].key, PMIX_MAX_KEYLEN);
|
||||||
apps[i].info[j].value.type = PMIX_STRING;
|
apps[i].info[j].value.type = PMIX_STRING;
|
||||||
apps[i].info[j].value.data.string = strdup(info_keyval_vectors[i][j].val);
|
apps[i].info[j].value.data.string = strdup(info_keyval_vectors[i][j].val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* push the preput values into the apps environ */
|
/* push the preput values into the apps environ */
|
||||||
for (k=0; k < preput_keyval_size; k++) {
|
for (k = 0; k < preput_keyval_size; k++) {
|
||||||
(void)asprintf(&evar, "%s=%s", preput_keyval_vector[k].key, preput_keyval_vector[k].val);
|
(void)asprintf(&evar, "%s=%s", preput_keyval_vector[k].key, preput_keyval_vector[k].val);
|
||||||
pmix_argv_append_nosize(&apps[i].env, evar);
|
pmix_argv_append_nosize(&apps[i].env, evar);
|
||||||
free(evar);
|
free(evar);
|
||||||
@ -506,12 +626,12 @@ int PMI_Spawn_multiple(int count,
|
|||||||
|
|
||||||
rc = PMIx_Spawn(NULL, 0, apps, count, NULL);
|
rc = PMIx_Spawn(NULL, 0, apps, count, NULL);
|
||||||
/* tear down the apps array */
|
/* tear down the apps array */
|
||||||
for (i=0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
PMIX_APP_DESTRUCT(&apps[i]);
|
PMIX_APP_DESTRUCT(&apps[i]);
|
||||||
}
|
}
|
||||||
free(apps);
|
free(apps);
|
||||||
if (NULL != errors) {
|
if (NULL != errors) {
|
||||||
for (i=0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
errors[i] = convert_err(rc);
|
errors[i] = convert_err(rc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -546,12 +666,11 @@ int PMI_Get_options(char *str, int *length)
|
|||||||
return PMI_FAIL;
|
return PMI_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*** UTILITY FUNCTIONS ***/
|
/*** UTILITY FUNCTIONS ***/
|
||||||
/* internal function */
|
/* internal function */
|
||||||
static pmix_status_t convert_int(int *value, pmix_value_t *kv)
|
static pmix_status_t convert_int(int *value, pmix_value_t *kv)
|
||||||
{
|
{
|
||||||
switch(kv->type) {
|
switch (kv->type) {
|
||||||
case PMIX_INT:
|
case PMIX_INT:
|
||||||
*value = kv->data.integer;
|
*value = kv->data.integer;
|
||||||
break;
|
break;
|
||||||
@ -600,7 +719,7 @@ static pmix_status_t convert_int(int *value, pmix_value_t *kv)
|
|||||||
|
|
||||||
static int convert_err(pmix_status_t rc)
|
static int convert_err(pmix_status_t rc)
|
||||||
{
|
{
|
||||||
switch(rc) {
|
switch (rc) {
|
||||||
case PMIX_ERR_INVALID_SIZE:
|
case PMIX_ERR_INVALID_SIZE:
|
||||||
return PMI_ERR_INVALID_SIZE;
|
return PMI_ERR_INVALID_SIZE;
|
||||||
|
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
|
||||||
* Copyright (c) 2014-2015 Research Organization for Information Science
|
* Copyright (c) 2015 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
@ -35,15 +37,24 @@
|
|||||||
#include "src/util/error.h"
|
#include "src/util/error.h"
|
||||||
#include "src/util/output.h"
|
#include "src/util/output.h"
|
||||||
|
|
||||||
|
#define PMI2_CHECK() \
|
||||||
|
do { \
|
||||||
|
if (!pmi2_init) { \
|
||||||
|
return PMI2_FAIL; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
/* local functions */
|
/* local functions */
|
||||||
static pmix_status_t convert_int(int *value, pmix_value_t *kv);
|
static pmix_status_t convert_int(int *value, pmix_value_t *kv);
|
||||||
static int convert_err(pmix_status_t rc);
|
static int convert_err(pmix_status_t rc);
|
||||||
static pmix_proc_t myproc;
|
static pmix_proc_t myproc;
|
||||||
|
static int pmi2_init = 0;
|
||||||
|
|
||||||
int PMI2_Init(int *spawned, int *size, int *rank, int *appnum)
|
int PMI2_Init(int *spawned, int *size, int *rank, int *appnum)
|
||||||
{
|
{
|
||||||
pmix_value_t *kv;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_status_t rc;
|
pmix_value_t *val;
|
||||||
|
pmix_proc_t proc;
|
||||||
|
|
||||||
if (PMIX_SUCCESS != PMIx_Init(&myproc)) {
|
if (PMIX_SUCCESS != PMIx_Init(&myproc)) {
|
||||||
return PMI2_ERR_INIT;
|
return PMI2_ERR_INIT;
|
||||||
@ -52,14 +63,18 @@ int PMI2_Init(int *spawned, int *size, int *rank, int *appnum)
|
|||||||
/* get the rank */
|
/* get the rank */
|
||||||
*rank = myproc.rank;
|
*rank = myproc.rank;
|
||||||
|
|
||||||
|
/* getting internal key requires special rank value */
|
||||||
|
memcpy(&proc, &myproc, sizeof(myproc));
|
||||||
|
proc.rank = PMIX_RANK_WILDCARD;
|
||||||
|
|
||||||
if (NULL != size) {
|
if (NULL != size) {
|
||||||
/* get the universe size - this will likely pull
|
/* get the universe size - this will likely pull
|
||||||
* down all attributes assigned to the job, thus
|
* down all attributes assigned to the job, thus
|
||||||
* making all subsequent "get" operations purely
|
* making all subsequent "get" operations purely
|
||||||
* local */
|
* local */
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_UNIV_SIZE, NULL, 0, &kv)) {
|
if (PMIX_SUCCESS == PMIx_Get(&proc, PMIX_UNIV_SIZE, NULL, 0, &val)) {
|
||||||
rc = convert_int(size, kv);
|
rc = convert_int(size, val);
|
||||||
PMIX_VALUE_RELEASE(kv);
|
PMIX_VALUE_RELEASE(val);
|
||||||
if (PMIX_SUCCESS != rc) {
|
if (PMIX_SUCCESS != rc) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -71,9 +86,9 @@ int PMI2_Init(int *spawned, int *size, int *rank, int *appnum)
|
|||||||
|
|
||||||
if (NULL != spawned) {
|
if (NULL != spawned) {
|
||||||
/* get the spawned flag */
|
/* get the spawned flag */
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_SPAWNED, NULL, 0, &kv)) {
|
if (PMIX_SUCCESS == PMIx_Get(&proc, PMIX_SPAWNED, NULL, 0, &val)) {
|
||||||
rc = convert_int(spawned, kv);
|
rc = convert_int(spawned, val);
|
||||||
PMIX_VALUE_RELEASE(kv);
|
PMIX_VALUE_RELEASE(val);
|
||||||
if (PMIX_SUCCESS != rc) {
|
if (PMIX_SUCCESS != rc) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -85,9 +100,9 @@ int PMI2_Init(int *spawned, int *size, int *rank, int *appnum)
|
|||||||
|
|
||||||
if (NULL != appnum) {
|
if (NULL != appnum) {
|
||||||
/* get our appnum */
|
/* get our appnum */
|
||||||
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_APPNUM, NULL, 0, &kv)) {
|
if (PMIX_SUCCESS == PMIx_Get(&proc, PMIX_APPNUM, NULL, 0, &val)) {
|
||||||
rc = convert_int(appnum, kv);
|
rc = convert_int(appnum, val);
|
||||||
PMIX_VALUE_RELEASE(kv);
|
PMIX_VALUE_RELEASE(val);
|
||||||
if (PMIX_SUCCESS != rc) {
|
if (PMIX_SUCCESS != rc) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -96,6 +111,7 @@ int PMI2_Init(int *spawned, int *size, int *rank, int *appnum)
|
|||||||
*appnum = 0;
|
*appnum = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pmi2_init = 1;
|
||||||
|
|
||||||
return PMI2_SUCCESS;
|
return PMI2_SUCCESS;
|
||||||
|
|
||||||
@ -112,15 +128,20 @@ int PMI2_Initialized(void)
|
|||||||
|
|
||||||
int PMI2_Finalize(void)
|
int PMI2_Finalize(void)
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
pmi2_init = 0;
|
||||||
rc = PMIx_Finalize();
|
rc = PMIx_Finalize();
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI2_Abort(int flag, const char msg[])
|
int PMI2_Abort(int flag, const char msg[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
rc = PMIx_Abort(flag, msg, NULL, 0);
|
rc = PMIx_Abort(flag, msg, NULL, 0);
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
@ -129,9 +150,18 @@ int PMI2_Abort(int flag, const char msg[])
|
|||||||
/* KVS_Put - we default to PMIX_GLOBAL scope */
|
/* KVS_Put - we default to PMIX_GLOBAL scope */
|
||||||
int PMI2_KVS_Put(const char key[], const char value[])
|
int PMI2_KVS_Put(const char key[], const char value[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_value_t val;
|
pmix_value_t val;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if ((NULL == key) || (NULL == value)) {
|
||||||
|
return PMI2_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
pmix_output_verbose(3, pmix_globals.debug_output,
|
||||||
|
"PMI2_KVS_Put: key=%s value=%s", key, value);
|
||||||
|
|
||||||
val.type = PMIX_STRING;
|
val.type = PMIX_STRING;
|
||||||
val.data.string = (char*)value;
|
val.data.string = (char*)value;
|
||||||
rc = PMIx_Put(PMIX_GLOBAL, key, &val);
|
rc = PMIx_Put(PMIX_GLOBAL, key, &val);
|
||||||
@ -141,14 +171,26 @@ int PMI2_KVS_Put(const char key[], const char value[])
|
|||||||
/* KVS_Fence */
|
/* KVS_Fence */
|
||||||
int PMI2_KVS_Fence(void)
|
int PMI2_KVS_Fence(void)
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
if (PMIX_SUCCESS != (rc = PMIx_Commit())) {
|
if (PMIX_SUCCESS != (rc = PMIx_Commit())) {
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we want all data to be collected upon completion */
|
/* we want all data to be collected upon completion */
|
||||||
rc = PMIx_Fence(NULL, 0, NULL, 0);
|
{
|
||||||
|
pmix_info_t info;
|
||||||
|
int ninfo = 1;
|
||||||
|
bool val = 1;
|
||||||
|
|
||||||
|
PMIX_INFO_CONSTRUCT(&info);
|
||||||
|
PMIX_INFO_LOAD(&info, PMIX_COLLECT_DATA, &val, PMIX_BOOL);
|
||||||
|
rc = PMIx_Fence(NULL, 0, &info, ninfo);
|
||||||
|
PMIX_INFO_DESTRUCT(&info);
|
||||||
|
}
|
||||||
|
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,33 +203,68 @@ int PMI2_KVS_Get(const char *jobid, int src_pmi_id,
|
|||||||
const char key[], char value [],
|
const char key[], char value [],
|
||||||
int maxvalue, int *vallen)
|
int maxvalue, int *vallen)
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_value_t *val;
|
pmix_value_t *val;
|
||||||
pmix_proc_t proc;
|
pmix_proc_t proc;
|
||||||
|
uint32_t procnum = 0;
|
||||||
|
|
||||||
(void)strncpy(proc.nspace, (jobid ? jobid : myproc.nspace), sizeof(myproc.nspace));
|
PMI2_CHECK();
|
||||||
proc.rank = (src_pmi_id == PMI2_ID_NULL ? myproc.rank : src_pmi_id);
|
|
||||||
rc = PMIx_Get(&proc, key, NULL, 0, &val);
|
if ((NULL == key) || (NULL == value)) {
|
||||||
if (PMIX_SUCCESS == rc && NULL != val) {
|
return PMI2_ERR_INVALID_ARG;
|
||||||
if (PMIX_STRING != val->type) {
|
|
||||||
/* this is an error */
|
|
||||||
PMIX_VALUE_RELEASE(val);
|
|
||||||
return PMI2_FAIL;
|
|
||||||
}
|
|
||||||
if (NULL != val->data.string) {
|
|
||||||
(void)strncpy(value, val->data.string, maxvalue);
|
|
||||||
*vallen = strlen(val->data.string);
|
|
||||||
}
|
|
||||||
PMIX_VALUE_RELEASE(val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pmix_output_verbose(3, pmix_globals.debug_output,
|
||||||
|
"PMI2_KVS_Get: key=%s jobid=%s src_pmi_id=%d", key, (jobid ? jobid : "null"), src_pmi_id);
|
||||||
|
|
||||||
|
(void)strncpy(proc.nspace, (jobid ? jobid : myproc.nspace), PMIX_MAX_NSLEN);
|
||||||
|
if (src_pmi_id == PMI2_ID_NULL) {
|
||||||
|
proc.rank = PMIX_RANK_WILDCARD;
|
||||||
|
if (PMIX_SUCCESS != (rc = PMIx_Get(&myproc, PMIX_JOB_SIZE, NULL, 0, &val))) {
|
||||||
|
return convert_err(rc);
|
||||||
|
}
|
||||||
|
procnum = val->data.uint32;
|
||||||
|
PMIX_VALUE_RELEASE(val);
|
||||||
|
proc.rank = 0;
|
||||||
|
} else {
|
||||||
|
proc.rank = src_pmi_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
rc = PMIx_Get(&proc, key, NULL, 0, &val);
|
||||||
|
if (PMIX_SUCCESS == rc && NULL != val) {
|
||||||
|
if (PMIX_STRING != val->type) {
|
||||||
|
/* this is an error */
|
||||||
|
PMIX_VALUE_RELEASE(val);
|
||||||
|
return PMI2_FAIL;
|
||||||
|
}
|
||||||
|
if (NULL != val->data.string) {
|
||||||
|
(void)strncpy(value, val->data.string, maxvalue);
|
||||||
|
*vallen = strlen(val->data.string);
|
||||||
|
}
|
||||||
|
PMIX_VALUE_RELEASE(val);
|
||||||
|
break;
|
||||||
|
} else if (PMIX_ERR_NOT_FOUND == rc) {
|
||||||
|
proc.rank++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (proc.rank < (int)procnum);
|
||||||
|
|
||||||
return convert_err(rc);
|
return convert_err(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int PMI2_Info_GetNodeAttr(const char name[], char value[], int valuelen, int *found, int waitfor)
|
int PMI2_Info_GetNodeAttr(const char name[], char value[], int valuelen, int *found, int waitfor)
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_value_t *val;
|
pmix_value_t *val;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if ((NULL == name) || (NULL == value) || (NULL == found)) {
|
||||||
|
return PMI2_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
*found = 0;
|
*found = 0;
|
||||||
rc = PMIx_Get(&myproc, name, NULL, 0, &val);
|
rc = PMIx_Get(&myproc, name, NULL, 0, &val);
|
||||||
if (PMIX_SUCCESS == rc && NULL != val) {
|
if (PMIX_SUCCESS == rc && NULL != val) {
|
||||||
@ -210,9 +287,15 @@ int PMI2_Info_GetNodeAttr(const char name[], char value[], int valuelen, int *fo
|
|||||||
/* push info at the PMIX_LOCAL scope */
|
/* push info at the PMIX_LOCAL scope */
|
||||||
int PMI2_Info_PutNodeAttr(const char name[], const char value[])
|
int PMI2_Info_PutNodeAttr(const char name[], const char value[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_value_t val;
|
pmix_value_t val;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if ((NULL == name) || (NULL == value)) {
|
||||||
|
return PMI2_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
val.type = PMIX_STRING;
|
val.type = PMIX_STRING;
|
||||||
val.data.string = (char*)value;
|
val.data.string = (char*)value;
|
||||||
rc = PMIx_Put(PMIX_LOCAL, name, &val);
|
rc = PMIx_Put(PMIX_LOCAL, name, &val);
|
||||||
@ -221,11 +304,22 @@ int PMI2_Info_PutNodeAttr(const char name[], const char value[])
|
|||||||
|
|
||||||
int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *found)
|
int PMI2_Info_GetJobAttr(const char name[], char value[], int valuelen, int *found)
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_value_t *val;
|
pmix_value_t *val;
|
||||||
|
pmix_proc_t proc;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if ((NULL == name) || (NULL == value) || (NULL == found)) {
|
||||||
|
return PMI2_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* getting internal key requires special rank value */
|
||||||
|
memcpy(&proc, &myproc, sizeof(myproc));
|
||||||
|
proc.rank = PMIX_RANK_WILDCARD;
|
||||||
|
|
||||||
*found = 0;
|
*found = 0;
|
||||||
rc = PMIx_Get(&myproc, name, NULL, 0, &val);
|
rc = PMIx_Get(&proc, name, NULL, 0, &val);
|
||||||
if (PMIX_SUCCESS == rc && NULL != val) {
|
if (PMIX_SUCCESS == rc && NULL != val) {
|
||||||
if (PMIX_STRING != val->type) {
|
if (PMIX_STRING != val->type) {
|
||||||
/* this is an error */
|
/* this is an error */
|
||||||
@ -250,13 +344,16 @@ int PMI2_Info_GetJobAttrIntArray(const char name[], int array[], int arraylen, i
|
|||||||
|
|
||||||
int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_ptr, const char port[])
|
int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_ptr, const char port[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
int nvals;
|
int nvals;
|
||||||
pmix_info_t info[2];
|
pmix_info_t info[2];
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
if (NULL == service_name || NULL == port) {
|
if (NULL == service_name || NULL == port) {
|
||||||
return PMI2_ERR_INVALID_ARG;
|
return PMI2_ERR_INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* pass the service/port */
|
/* pass the service/port */
|
||||||
(void)strncpy(info[0].key, service_name, PMIX_MAX_KEYLEN);
|
(void)strncpy(info[0].key, service_name, PMIX_MAX_KEYLEN);
|
||||||
info[0].value.type = PMIX_STRING;
|
info[0].value.type = PMIX_STRING;
|
||||||
@ -280,8 +377,14 @@ int PMI2_Nameserv_publish(const char service_name[], const PMI_keyval_t *info_pt
|
|||||||
int PMI2_Nameserv_unpublish(const char service_name[],
|
int PMI2_Nameserv_unpublish(const char service_name[],
|
||||||
const PMI_keyval_t *info_ptr)
|
const PMI_keyval_t *info_ptr)
|
||||||
{
|
{
|
||||||
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
char *keys[3];
|
char *keys[3];
|
||||||
pmix_status_t rc;
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if (NULL == service_name || NULL == info_ptr) {
|
||||||
|
return PMI2_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
/* pass the service */
|
/* pass the service */
|
||||||
keys[0] = (char*)service_name;
|
keys[0] = (char*)service_name;
|
||||||
@ -300,10 +403,16 @@ int PMI2_Nameserv_unpublish(const char service_name[],
|
|||||||
int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr,
|
int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr,
|
||||||
char port[], int portLen)
|
char port[], int portLen)
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
int nvals;
|
int nvals;
|
||||||
pmix_pdata_t pdata[2];
|
pmix_pdata_t pdata[2];
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if (NULL == service_name || NULL == info_ptr || NULL == port) {
|
||||||
|
return PMI2_ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
PMIX_PDATA_CONSTRUCT(&pdata[0]);
|
PMIX_PDATA_CONSTRUCT(&pdata[0]);
|
||||||
PMIX_PDATA_CONSTRUCT(&pdata[1]);
|
PMIX_PDATA_CONSTRUCT(&pdata[1]);
|
||||||
|
|
||||||
@ -347,9 +456,11 @@ int PMI2_Nameserv_lookup(const char service_name[], const PMI_keyval_t *info_ptr
|
|||||||
|
|
||||||
int PMI2_Job_GetId(char jobid[], int jobid_size)
|
int PMI2_Job_GetId(char jobid[], int jobid_size)
|
||||||
{
|
{
|
||||||
/* we already obtained our nspace during PMI_Init,
|
/* we already obtained our nspace during pmi2_init,
|
||||||
* so all we have to do here is return it */
|
* so all we have to do here is return it */
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
/* bozo check */
|
/* bozo check */
|
||||||
if (NULL == jobid) {
|
if (NULL == jobid) {
|
||||||
return PMI2_ERR_INVALID_ARGS;
|
return PMI2_ERR_INVALID_ARGS;
|
||||||
@ -358,11 +469,48 @@ int PMI2_Job_GetId(char jobid[], int jobid_size)
|
|||||||
return PMI2_SUCCESS;
|
return PMI2_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PMI2_Job_GetRank(int *rank)
|
||||||
|
{
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if (NULL == rank) {
|
||||||
|
return PMI2_ERR_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
*rank = myproc.rank;
|
||||||
|
return PMI2_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PMI2_Info_GetSize(int *size)
|
||||||
|
{
|
||||||
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
|
pmix_value_t *val;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if (NULL == size) {
|
||||||
|
return PMI2_ERR_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMIX_SUCCESS == PMIx_Get(&myproc, PMIX_LOCAL_SIZE, NULL, 0, &val)) {
|
||||||
|
rc = convert_int(size, val);
|
||||||
|
PMIX_VALUE_RELEASE(val);
|
||||||
|
return convert_err(rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PMI2_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
int PMI2_Job_Connect(const char jobid[], PMI2_Connect_comm_t *conn)
|
int PMI2_Job_Connect(const char jobid[], PMI2_Connect_comm_t *conn)
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_proc_t proc;
|
pmix_proc_t proc;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if (NULL == jobid || NULL == conn) {
|
||||||
|
return PMI2_ERR_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
(void)strncpy(proc.nspace, (jobid ? jobid : myproc.nspace), sizeof(myproc.nspace));
|
(void)strncpy(proc.nspace, (jobid ? jobid : myproc.nspace), sizeof(myproc.nspace));
|
||||||
proc.rank = PMIX_RANK_WILDCARD;
|
proc.rank = PMIX_RANK_WILDCARD;
|
||||||
rc = PMIx_Connect(&proc, 1, NULL, 0);
|
rc = PMIx_Connect(&proc, 1, NULL, 0);
|
||||||
@ -371,9 +519,15 @@ int PMI2_Job_Connect(const char jobid[], PMI2_Connect_comm_t *conn)
|
|||||||
|
|
||||||
int PMI2_Job_Disconnect(const char jobid[])
|
int PMI2_Job_Disconnect(const char jobid[])
|
||||||
{
|
{
|
||||||
pmix_status_t rc;
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_proc_t proc;
|
pmix_proc_t proc;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if (NULL == jobid) {
|
||||||
|
return PMI2_ERR_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
(void)strncpy(proc.nspace, (jobid ? jobid : myproc.nspace), sizeof(myproc.nspace));
|
(void)strncpy(proc.nspace, (jobid ? jobid : myproc.nspace), sizeof(myproc.nspace));
|
||||||
proc.rank = PMIX_RANK_WILDCARD;
|
proc.rank = PMIX_RANK_WILDCARD;
|
||||||
rc = PMIx_Disconnect(&proc, 1, NULL, 0);
|
rc = PMIx_Disconnect(&proc, 1, NULL, 0);
|
||||||
@ -390,12 +544,18 @@ int PMI2_Job_Spawn(int count, const char * cmds[],
|
|||||||
char jobId[], int jobIdSize,
|
char jobId[], int jobIdSize,
|
||||||
int errors[])
|
int errors[])
|
||||||
{
|
{
|
||||||
|
pmix_status_t rc = PMIX_SUCCESS;
|
||||||
pmix_app_t *apps;
|
pmix_app_t *apps;
|
||||||
int i, k;
|
int i, k;
|
||||||
pmix_status_t rc;
|
|
||||||
size_t j;
|
size_t j;
|
||||||
char *evar;
|
char *evar;
|
||||||
|
|
||||||
|
PMI2_CHECK();
|
||||||
|
|
||||||
|
if (NULL == cmds) {
|
||||||
|
return PMI2_ERR_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
/* setup the apps */
|
/* setup the apps */
|
||||||
PMIX_APP_CREATE(apps, count);
|
PMIX_APP_CREATE(apps, count);
|
||||||
for (i=0; i < count; i++) {
|
for (i=0; i < count; i++) {
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
* Copyright (c) 2014 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
* Copyright (c) 2014-2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
* Copyright (c) 2014-2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
* Copyright (c) 2014-2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
* Copyright (c) 2014-2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved
|
* Copyright (c) 2015 Intel, Inc. All rights reserved
|
||||||
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Copyright (c) 2015 Research Organization for Information Science
|
* Copyright (c) 2015 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,19 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
|
|
||||||
* University Research and Technology
|
|
||||||
* Corporation. All rights reserved.
|
|
||||||
* Copyright (c) 2004-2011 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) 2006-2013 Los Alamos National Security, LLC.
|
|
||||||
* All rights reserved.
|
|
||||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
|
||||||
* Copyright (c) 2013-2014 Intel, Inc. All rights reserved.
|
* Copyright (c) 2013-2014 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
@ -74,6 +62,8 @@ static int test_item5(void);
|
|||||||
static int test_item6(void);
|
static int test_item6(void);
|
||||||
static int test_item7(void);
|
static int test_item7(void);
|
||||||
static int test_item8(void);
|
static int test_item8(void);
|
||||||
|
/* several sequence of fences is a buggy case for pmix v1.0 (see https://github.com/open-mpi/pmix/issues/37) */
|
||||||
|
static int test_item9(void);
|
||||||
|
|
||||||
static int spawned, size, rank, appnum;
|
static int spawned, size, rank, appnum;
|
||||||
static char jobid[100];
|
static char jobid[100];
|
||||||
@ -149,6 +139,12 @@ int main(int argc, char **argv)
|
|||||||
log_info("TI8 : %s\n", (rc ? "FAIL" : "PASS"));
|
log_info("TI8 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ti || 9 == ti) {
|
||||||
|
rc = test_item9();
|
||||||
|
ret += (rc ? 1 : 0);
|
||||||
|
log_info("TI9 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
|
}
|
||||||
|
|
||||||
if (PMI2_SUCCESS != (rc = PMI2_Finalize())) {
|
if (PMI2_SUCCESS != (rc = PMI2_Finalize())) {
|
||||||
log_fatal("PMI2_Finalize failed: %d\n", rc);
|
log_fatal("PMI2_Finalize failed: %d\n", rc);
|
||||||
return rc;
|
return rc;
|
||||||
@ -160,6 +156,7 @@ int main(int argc, char **argv)
|
|||||||
static int test_item1(void)
|
static int test_item1(void)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
int val = 0;
|
||||||
|
|
||||||
log_info("spawned=%d size=%d rank=%d appnum=%d\n", spawned, size, rank, appnum);
|
log_info("spawned=%d size=%d rank=%d appnum=%d\n", spawned, size, rank, appnum);
|
||||||
|
|
||||||
@ -175,9 +172,22 @@ static int test_item1(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
log_info("jobid=%s\n", jobid);
|
log_info("jobid=%s\n", jobid);
|
||||||
|
|
||||||
log_assert(memcmp(jobid, __FUNCTION__, sizeof(__FUNCTION__)), "");
|
log_assert(memcmp(jobid, __FUNCTION__, sizeof(__FUNCTION__)), "");
|
||||||
|
|
||||||
|
val = random_value(10, 100);
|
||||||
|
if (PMI2_SUCCESS != (rc = PMI2_Job_GetRank(&val))) {
|
||||||
|
log_fatal("PMI2_Job_GetRank failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_assert(rank == val, "");
|
||||||
|
|
||||||
|
val = -1;
|
||||||
|
if (PMI2_SUCCESS != (rc = PMI2_Info_GetSize(&val))) {
|
||||||
|
log_fatal("PMI2_Info_GetSize failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_assert(0 < val, "");
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,8 +343,8 @@ static int test_item7(void)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PMI2_SUCCESS != (rc = PMI2_KVS_Get(jobid, PMI2_ID_NULL, tkey, val, sizeof(val), &len))) {
|
if (PMI2_SUCCESS != (rc = PMI2_KVS_Get(jobid, i, tkey, val, sizeof(val), &len))) {
|
||||||
log_fatal("PMI2_KVS_Get %d\n", rc);
|
log_fatal("PMI2_KVS_Get [%s=?] %d\n", tkey, rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,18 +358,58 @@ static int test_item7(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int test_item8(void)
|
static int test_item8(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
int len;
|
||||||
|
char tkey[PMI2_MAX_VALLEN];
|
||||||
|
char tval[PMI2_MAX_VALLEN];
|
||||||
|
char val[PMI2_MAX_VALLEN];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
sprintf(tkey, "KEY-%d", i);
|
||||||
|
sprintf(tval, "VALUE-%d", i);
|
||||||
|
if (i == rank) {
|
||||||
|
if (PMI2_SUCCESS != (rc = PMI2_KVS_Put(tkey, tval))) {
|
||||||
|
log_fatal("PMI2_KVS_Put [%s=%s] %d\n", tkey, tval, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMI2_SUCCESS != (rc = PMI2_KVS_Fence())) {
|
||||||
|
log_fatal("PMI2_KVS_Fence %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMI2_SUCCESS != (rc = PMI2_KVS_Get(jobid, PMI2_ID_NULL, tkey, val, sizeof(val), &len))) {
|
||||||
|
log_fatal("PMI2_KVS_Get [%s=?] %d\n", tkey, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("tkey=%s tval=%s val=%s len=%d\n", tkey, tval, val, len);
|
||||||
|
|
||||||
|
log_assert((int)strlen(tval) == len, "value does not meet expectation");
|
||||||
|
log_assert(!strcmp(tval, val), "value does not meet expectation");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item9(void)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int i, j, r;
|
int i, j, r;
|
||||||
char symb, symb_start = 'a';
|
char symb, symb_start = 'a';
|
||||||
int fence_cnt;
|
int fence_cnt;
|
||||||
int fence_num = random_value(2, 10);
|
int fence_num = random_value(2, 10);
|
||||||
int keys_per_fence = random_value(10, 1000);
|
int keys_per_fence = random_value(10, 100);
|
||||||
int val_size = random_value(10, PMI2_MAX_VALLEN);
|
int val_size = random_value(10, PMI2_MAX_VALLEN / 10);
|
||||||
int keys_total = 0;
|
int keys_total = 0;
|
||||||
|
|
||||||
fence_cnt = 0;
|
fence_cnt = 0;
|
||||||
while (fence_cnt < fence_num) {
|
while (fence_cnt < fence_num) {
|
||||||
|
log_info("fence_cnt=%d of fence_num=%d keys_per_fence=%d keys_total=%d val_size=%d\n",
|
||||||
|
fence_cnt, fence_num, keys_per_fence, keys_total, val_size);
|
||||||
symb = symb_start;
|
symb = symb_start;
|
||||||
for (i = 0; i < keys_per_fence; i++) {
|
for (i = 0; i < keys_per_fence; i++) {
|
||||||
char key[PMI2_MAX_KEYLEN];
|
char key[PMI2_MAX_KEYLEN];
|
||||||
@ -376,6 +426,7 @@ static int test_item8(void)
|
|||||||
log_fatal("PMI2_KVS_Put [%s=%s] %d\n", key, val, rc);
|
log_fatal("PMI2_KVS_Put [%s=%s] %d\n", key, val, rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
log_info("PMI2_KVS_Put [rank=%d %s] %d\n", rank, key, rc);
|
||||||
}
|
}
|
||||||
symb_start = symb;
|
symb_start = symb;
|
||||||
keys_total += keys_per_fence;
|
keys_total += keys_per_fence;
|
||||||
@ -393,11 +444,13 @@ static int test_item8(void)
|
|||||||
char val[PMI2_MAX_VALLEN] = "";
|
char val[PMI2_MAX_VALLEN] = "";
|
||||||
sprintf(key, "RANK%d-key-%d", r, i);
|
sprintf(key, "RANK%d-key-%d", r, i);
|
||||||
|
|
||||||
if (PMI2_SUCCESS != (rc = PMI2_KVS_Get(jobid, PMI2_ID_NULL, key, val, sizeof(val), &len))) {
|
if (PMI2_SUCCESS != (rc = PMI2_KVS_Get(jobid, r, key, val, sizeof(val), &len))) {
|
||||||
log_fatal("PMI2_KVS_Get %d\n", rc);
|
log_fatal("PMI2_KVS_Get [%s=?] %d\n", key, rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_info("PMI2_KVS_Get [rank=%d %s] %d\n", rank, key, rc);
|
||||||
|
|
||||||
if (len != val_size) {
|
if (len != val_size) {
|
||||||
log_fatal("%d: failure on rank %d, key #%d: len mismatch:"
|
log_fatal("%d: failure on rank %d, key #%d: len mismatch:"
|
||||||
" %d instead of %d\n", rank, r, i, len, val_size);
|
" %d instead of %d\n", rank, r, i, len, val_size);
|
||||||
|
@ -1,19 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
|
|
||||||
* University Research and Technology
|
|
||||||
* Corporation. All rights reserved.
|
|
||||||
* Copyright (c) 2004-2011 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) 2006-2013 Los Alamos National Security, LLC.
|
|
||||||
* All rights reserved.
|
|
||||||
* Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* Copyright (c) 2011 Oak Ridge National Labs. All rights reserved.
|
|
||||||
* Copyright (c) 2013-2014 Intel, Inc. All rights reserved.
|
* Copyright (c) 2013-2014 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
@ -24,52 +12,410 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include "pmi.h"
|
#include "pmi.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Target is legacy SLURM pmi library implementation */
|
||||||
|
static int _legacy = 0;
|
||||||
|
/* Verbose level 0-silent, 1-fatal, 2-error, 3+ debug*/
|
||||||
|
static int _verbose = 1;
|
||||||
|
|
||||||
|
#define log_fatal(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (_verbose > 0) \
|
||||||
|
fprintf(stderr, "FATAL " fmt, ##__VA_ARGS__); \
|
||||||
|
exit(rc); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define log_error(fmt) \
|
||||||
|
do { \
|
||||||
|
if (_verbose > 1) \
|
||||||
|
fprintf(stderr, "ERROR " fmt); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define log_info(fmt, ...) \
|
||||||
|
do { \
|
||||||
|
if (_verbose > 2) \
|
||||||
|
fprintf(stderr, "INFO " fmt, ##__VA_ARGS__); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define log_assert(e, msg) \
|
||||||
|
do { \
|
||||||
|
if (!(e)) { \
|
||||||
|
log_fatal("%s at %s:%d\n", msg, __FUNCTION__, __LINE__); \
|
||||||
|
rc = -1; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static inline long random_value(long min_value, long max_value)
|
||||||
|
{
|
||||||
|
return ((min_value >= max_value) ? min_value : min_value + (rand() % (max_value - min_value + 1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item1(void);
|
||||||
|
static int test_item2(void);
|
||||||
|
static int test_item3(void);
|
||||||
|
static int test_item4(void);
|
||||||
|
static int test_item5(void);
|
||||||
|
static int test_item6(void);
|
||||||
|
static int test_item7(void);
|
||||||
|
static int test_item8(void);
|
||||||
|
|
||||||
|
static int spawned, size, rank, appnum;
|
||||||
|
static char jobid[255];
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int spawned;
|
int ret = 0;
|
||||||
int rc;
|
int rc;
|
||||||
|
char *str = NULL;
|
||||||
|
int ti = (argc > 1 ? atoi(argv[1]) : 0);
|
||||||
|
|
||||||
/* init us */
|
srand(time(NULL));
|
||||||
|
str = getenv("VERBOSE");
|
||||||
|
_verbose = (str ? atoi(str) : _verbose);
|
||||||
|
str = getenv("LEGACY");
|
||||||
|
_legacy = (str ? atoi(str) : _legacy);
|
||||||
|
|
||||||
|
spawned = random_value(10, 20);
|
||||||
|
size = random_value(10, 20);
|
||||||
|
rank = random_value(10, 20);
|
||||||
|
appnum = random_value(10, 20);
|
||||||
if (PMI_SUCCESS != (rc = PMI_Init(&spawned))) {
|
if (PMI_SUCCESS != (rc = PMI_Init(&spawned))) {
|
||||||
fprintf(stderr, "PMI_Init failed: %d\n", rc);
|
log_fatal("PMI_Init failed: %d\n", rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
key = "local-key";
|
/* this test should be always run */
|
||||||
PMIX_VAL_SET(&value, int, 12345, rc, kvp_error );
|
if (1) {
|
||||||
if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_LOCAL, key, &value))) {
|
rc = test_item1();
|
||||||
fprintf(stderr, "PMIx_Put failed: %d\n", rc);
|
ret += (rc ? 1 : 0);
|
||||||
|
log_info("TI1 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
}
|
}
|
||||||
|
|
||||||
key = "remote-key";
|
if (!ti || 2 == ti) {
|
||||||
char *ptr = "Test string";
|
rc = test_item2();
|
||||||
PMIX_VAL_SET(&value, string, ptr, rc, kvp_error );
|
ret += (rc ? 1 : 0);
|
||||||
if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_REMOTE, key, &value))) {
|
log_info("TI2 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
fprintf(stderr, "PMIx_Put failed: %d\n", rc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
key = "global-key";
|
if (!ti || 3 == ti) {
|
||||||
PMIX_VAL_SET(&value, float, 10.15, rc, kvp_error );
|
rc = test_item3();
|
||||||
if (PMIX_SUCCESS != (rc = PMIx_Put(PMIX_GLOBAL, key, &value))) {
|
ret += (rc ? 1 : 0);
|
||||||
fprintf(stderr, "PMIx_Put failed: %d\n", rc);
|
log_info("TI3 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Submit the data */
|
if (!ti || 4 == ti) {
|
||||||
pmix_range_t range;
|
rc = test_item4();
|
||||||
range.ranks = NULL;
|
ret += (rc ? 1 : 0);
|
||||||
range.nranks = 0;
|
log_info("TI4 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
if (PMIX_SUCCESS != (rc = PMIx_Fence(NULL, 0))) {
|
|
||||||
fprintf(stderr, "PMIx_Fence failed: %d\n", rc);
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
/* finalize us */
|
if (!ti || 5 == ti) {
|
||||||
|
rc = test_item5();
|
||||||
|
ret += (rc ? 1 : 0);
|
||||||
|
log_info("TI5 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ti || 6 == ti) {
|
||||||
|
rc = test_item6();
|
||||||
|
ret += (rc ? 1 : 0);
|
||||||
|
log_info("TI6 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ti || 7 == ti) {
|
||||||
|
rc = test_item7();
|
||||||
|
ret += (rc ? 1 : 0);
|
||||||
|
log_info("TI7 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ti || 8 == ti) {
|
||||||
|
rc = test_item8();
|
||||||
|
ret += (rc ? 1 : 0);
|
||||||
|
log_info("TI8 : %s\n", (rc ? "FAIL" : "PASS"));
|
||||||
|
}
|
||||||
|
|
||||||
if (PMI_SUCCESS != (rc = PMI_Finalize())) {
|
if (PMI_SUCCESS != (rc = PMI_Finalize())) {
|
||||||
fprintf(stderr, "PMI_Finalize failed: %d\n", rc);
|
log_fatal("PMI_Finalize failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item1(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
int val = 0;
|
||||||
|
|
||||||
|
log_assert(spawned == PMI_FALSE || spawned == PMI_TRUE, "");
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_size(&size))) {
|
||||||
|
log_fatal("PMI_Get_Size failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_assert(size >= 0, "");
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_rank(&rank))) {
|
||||||
|
log_fatal("PMI_Get_Rank failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_assert(rank >= 0, "");
|
||||||
|
log_assert(rank < size, "");
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_appnum(&appnum))) {
|
||||||
|
log_fatal("PMI_Get_appnum failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("spawned=%d size=%d rank=%d appnum=%d\n", spawned, size, rank, appnum);
|
||||||
|
|
||||||
|
val = random_value(10, 100);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_universe_size(&val))) {
|
||||||
|
log_fatal("PMI_Get_universe_size failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_assert(size == val, "");
|
||||||
|
|
||||||
|
val = random_value(10, 100);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_id_length_max(&val))) {
|
||||||
|
log_fatal("PMI_Get_id_length_max failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_info("PMI_Get_id_length_max=%d\n", val);
|
||||||
|
if (!_legacy) {
|
||||||
|
log_assert(sizeof(jobid) == val, "Check PMIX_MAX_NSLEN value in pmix_common.h");
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(jobid, "%s", __FUNCTION__);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_id(jobid, sizeof(jobid)))) {
|
||||||
|
log_fatal("PMI_Get_id failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("jobid=%s\n", jobid);
|
||||||
|
log_assert(memcmp(jobid, __FUNCTION__, sizeof(__FUNCTION__)), "");
|
||||||
|
|
||||||
|
sprintf(jobid, "%s", __FUNCTION__);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_kvs_domain_id(jobid, sizeof(jobid)))) {
|
||||||
|
log_fatal("PMI_Get_kvs_domain_id failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("PMI_Get_kvs_domain_id=%s\n", jobid);
|
||||||
|
log_assert(memcmp(jobid, __FUNCTION__, sizeof(__FUNCTION__)), "");
|
||||||
|
|
||||||
|
sprintf(jobid, "%s", __FUNCTION__);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Get_my_name(jobid, sizeof(jobid)))) {
|
||||||
|
log_fatal("PMI_KVS_Get_my_name failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("PMI_KVS_Get_my_name=%s\n", jobid);
|
||||||
|
log_assert(memcmp(jobid, __FUNCTION__, sizeof(__FUNCTION__)), "");
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item2(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
PMI_BOOL val;
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Initialized(&val))) {
|
||||||
|
log_fatal("PMI_Initialized failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_assert(PMI_TRUE == val, "");
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item3(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
int val = 0;
|
||||||
|
|
||||||
|
val = random_value(10, 100);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Get_key_length_max(&val))) {
|
||||||
|
log_fatal("PMI_KVS_Get_key_length_max failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_info("PMI_KVS_Get_key_length_max=%d\n", val);
|
||||||
|
if (!_legacy) {
|
||||||
|
log_assert(511 == val, "Check PMIX_MAX_KEYLEN value in pmix_common.h");
|
||||||
|
}
|
||||||
|
|
||||||
|
val = random_value(10, 100);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Get_value_length_max(&val))) {
|
||||||
|
log_fatal("PMI_KVS_Get_value_length_max failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_info("PMI_KVS_Get_value_length_max=%d\n", val);
|
||||||
|
if (!_legacy) {
|
||||||
|
log_assert(4096 == val, "Check limitation for a value");
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item4(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
int val = 0;
|
||||||
|
int *ranks = NULL;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
val = -1;
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_clique_size(&val))) {
|
||||||
|
log_fatal("PMI_Get_clique_size failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_info("PMI_Get_clique_size=%d\n", val);
|
||||||
|
log_assert((0 < val) && (val <= size), "");
|
||||||
|
|
||||||
|
ranks = alloca(val);
|
||||||
|
if (!ranks) {
|
||||||
|
return PMI_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(ranks, (-1), val);
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Get_clique_ranks(ranks, val))) {
|
||||||
|
log_fatal("PMI_Get_clique_ranks failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < val; i++) {
|
||||||
|
if (!((0 <= ranks[i]) && (ranks[i] < size))) {
|
||||||
|
log_fatal("found invalid value in ranks array: ranks[%d]=%d\n", i, ranks[i]);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item5(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
char *val = NULL;
|
||||||
|
int val_size = 0;
|
||||||
|
/* Predefined Job attributes */
|
||||||
|
const char *tkeys[] = {
|
||||||
|
"PMI_process_mapping",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
const char **ptr = tkeys;
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Get_value_length_max(&val_size))) {
|
||||||
|
log_fatal("PMI_KVS_Get_value_length_max failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = alloca(val_size);
|
||||||
|
if (!val) {
|
||||||
|
return PMI_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*ptr) {
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Get(jobid, *ptr, val, val_size))) {
|
||||||
|
log_fatal("PMI_KVS_Get: [%s] %d\n", *ptr, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_info("key=%s value=%.80s\n", *ptr, val);
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item6(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
char nspace[100];
|
||||||
|
|
||||||
|
log_error("pmix does not support this functionality\n");
|
||||||
|
return rc;
|
||||||
|
if (0 == rank) {
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Create(nspace, sizeof(nspace)))) {
|
||||||
|
log_fatal("PMI_KVS_Create failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
log_info("nspace=%s\n", nspace);
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Destroy(nspace))) {
|
||||||
|
log_fatal("PMI_KVS_Destroy failed: %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item7(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
char val[100];
|
||||||
|
const char *tkey = __FUNCTION__;
|
||||||
|
const char *tval = __FILE__;
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Put(jobid, tkey, tval))) {
|
||||||
|
log_fatal("PMI_KVS_Put %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Get(jobid, tkey, val, sizeof(val)))) {
|
||||||
|
log_fatal("PMI_KVS_Get %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("tkey=%s tval=%s val=%s\n", tkey, tval, val);
|
||||||
|
|
||||||
|
log_assert(!strcmp(tval, val), "value does not meet expectation");
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_item8(void)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
char tkey[100];
|
||||||
|
char tval[100];
|
||||||
|
char val[100];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
sprintf(tkey, "KEY-%d", i);
|
||||||
|
sprintf(tval, "VALUE-%d", i);
|
||||||
|
if (i == rank) {
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Put(jobid, tkey, tval))) {
|
||||||
|
log_fatal("PMI_KVS_Put [%s=%s] %d\n", tkey, tval, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Commit(jobid))) {
|
||||||
|
log_fatal("PMI_KVS_Commit %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_Barrier())) {
|
||||||
|
log_fatal("PMI_Barrier %d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PMI_SUCCESS != (rc = PMI_KVS_Get(jobid, tkey, val, sizeof(val)))) {
|
||||||
|
log_fatal("PMI_KVS_Get [%s=?] %d\n", tkey, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("tkey=%s tval=%s val=%s\n", tkey, tval, val);
|
||||||
|
|
||||||
|
log_assert(!strcmp(tval, val), "value does not meet expectation");
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015 Research Organization for Information Science
|
* Copyright (c) 2015 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015 Research Organization for Information Science
|
* Copyright (c) 2015 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2013-2015 Intel, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
* Copyright (c) 2015 Artem Y. Polyakov <artpol84@gmail.com>.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Copyright (c) 2015 Research Organization for Information Science
|
* Copyright (c) 2015 Research Organization for Information Science
|
||||||
* and Technology (RIST). All rights reserved.
|
* and Technology (RIST). All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
||||||
|
* Copyright (c) 2015 Mellanox Technologies, Inc.
|
||||||
|
* All rights reserved.
|
||||||
* $COPYRIGHT$
|
* $COPYRIGHT$
|
||||||
*
|
*
|
||||||
* Additional copyrights may follow
|
* Additional copyrights may follow
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user