
Bring Slurm PMI-1 component online Bring the s2 component online Little cleanup - let the various PMIx modules set the process name during init, and then just raise it up to the ORTE level. Required as the different PMI environments all pass the jobid in different ways. Bring the OMPI pubsub/pmi component online Get comm_spawn working again Ensure we always provide a cpuset, even if it is NULL pmix/cray: adjust cray pmix component for pmix Make changes so cray pmix can work within the integrated ompi/pmix framework. Bring singletons back online. Implement the comm_spawn operation using pmix - not tested yet Cleanup comm_spawn - procs now starting, error in connect_accept Complete integration
164 строки
6.7 KiB
C
164 строки
6.7 KiB
C
/*
|
|
* Copyright (c) 2004-2011 The Trustees of the University of Tennessee.
|
|
* All rights reserved.
|
|
* Copyright (c) 2012 Los Alamos National Security, LLC. All rights
|
|
* reserved.
|
|
* Copyright (c) 2015 Intel, Inc. All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "ompi_config.h"
|
|
#include "vprotocol_pessimist_eventlog.h"
|
|
#include "opal/mca/pmix/pmix.h"
|
|
#include "ompi/dpm/dpm.h"
|
|
|
|
int vprotocol_pessimist_event_logger_connect(int el_rank, ompi_communicator_t **el_comm)
|
|
{
|
|
int rc;
|
|
char *port;
|
|
int rank;
|
|
vprotocol_pessimist_clock_t connect_info[2];
|
|
opal_list_t results;
|
|
opal_pmix_pdata_t *pdat;
|
|
|
|
OBJ_CONSTRUCT(&results, opal_list_t);
|
|
pdat = OBJ_NEW(opal_pmix_pdata_t);
|
|
asprintf(&pdat->key, VPROTOCOL_EVENT_LOGGER_NAME_FMT, el_rank);
|
|
opal_list_append(&results, &pdat->super);
|
|
|
|
rc = opal_pmix.lookup(OPAL_PMIX_NAMESPACE, &results);
|
|
if (OPAL_SUCCESS != rc ||
|
|
OPAL_STRING != pdat->value.type ||
|
|
NULL == pdat->value.data.string) {
|
|
OPAL_LIST_DESTRUCT(&results);
|
|
return OMPI_ERR_NOT_FOUND;
|
|
}
|
|
port = strdup(pdat->value.data.string);
|
|
OPAL_LIST_DESTRUCT(&results);
|
|
V_OUTPUT_VERBOSE(45, "Found port < %s >", port);
|
|
|
|
rc = ompi_dpm_connect_accept(MPI_COMM_SELF, 0, port, true, el_comm);
|
|
if(OMPI_SUCCESS != rc) {
|
|
OMPI_ERROR_LOG(rc);
|
|
}
|
|
|
|
/* Send Rank, receive max buffer size and max_clock back */
|
|
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
|
rc = mca_pml_v.host_pml.pml_send(&rank, 1, MPI_INTEGER, 0,
|
|
VPROTOCOL_PESSIMIST_EVENTLOG_NEW_CLIENT_CMD,
|
|
MCA_PML_BASE_SEND_STANDARD,
|
|
mca_vprotocol_pessimist.el_comm);
|
|
if(OPAL_UNLIKELY(MPI_SUCCESS != rc))
|
|
OMPI_ERRHANDLER_INVOKE(mca_vprotocol_pessimist.el_comm, rc,
|
|
__FILE__ ": failed sending event logger handshake");
|
|
rc = mca_pml_v.host_pml.pml_recv(&connect_info, 2, MPI_UNSIGNED_LONG_LONG,
|
|
0, VPROTOCOL_PESSIMIST_EVENTLOG_NEW_CLIENT_CMD,
|
|
mca_vprotocol_pessimist.el_comm, MPI_STATUS_IGNORE);
|
|
if(OPAL_UNLIKELY(MPI_SUCCESS != rc)) \
|
|
OMPI_ERRHANDLER_INVOKE(mca_vprotocol_pessimist.el_comm, rc, \
|
|
__FILE__ ": failed receiving event logger handshake");
|
|
|
|
return rc;
|
|
}
|
|
|
|
int vprotocol_pessimist_event_logger_disconnect(ompi_communicator_t *el_comm)
|
|
{
|
|
ompi_dpm_disconnect(el_comm);
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
void vprotocol_pessimist_matching_replay(int *src) {
|
|
#if OPAL_ENABLE_DEBUG
|
|
vprotocol_pessimist_clock_t max = 0;
|
|
#endif
|
|
mca_vprotocol_pessimist_event_t *event;
|
|
|
|
/* searching this request in the event list */
|
|
for(event = (mca_vprotocol_pessimist_event_t *) opal_list_get_first(&mca_vprotocol_pessimist.replay_events);
|
|
event != (mca_vprotocol_pessimist_event_t *) opal_list_get_end(&mca_vprotocol_pessimist.replay_events);
|
|
event = (mca_vprotocol_pessimist_event_t *) opal_list_get_next(event))
|
|
{
|
|
vprotocol_pessimist_matching_event_t *mevent;
|
|
|
|
if(VPROTOCOL_PESSIMIST_EVENT_TYPE_MATCHING != event->type) continue;
|
|
mevent = &(event->u_event.e_matching);
|
|
if(mevent->reqid == mca_vprotocol_pessimist.clock)
|
|
{
|
|
/* this is the event to replay */
|
|
V_OUTPUT_VERBOSE(70, "pessimist: replay\tmatch\t%"PRIpclock"\trecv is forced from %d", mevent->reqid, mevent->src);
|
|
(*src) = mevent->src;
|
|
opal_list_remove_item(&mca_vprotocol_pessimist.replay_events,
|
|
(opal_list_item_t *) event);
|
|
VPESSIMIST_EVENT_RETURN(event);
|
|
}
|
|
#if OPAL_ENABLE_DEBUG
|
|
else if(mevent->reqid > max)
|
|
max = mevent->reqid;
|
|
}
|
|
/* not forcing a ANY SOURCE event whose recieve clock is lower than max
|
|
* is a bug indicating we have missed an event during logging ! */
|
|
assert(((*src) != MPI_ANY_SOURCE) || (mca_vprotocol_pessimist.clock > max));
|
|
#else
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void vprotocol_pessimist_delivery_replay(size_t n, ompi_request_t **reqs,
|
|
int *outcount, int *index,
|
|
ompi_status_public_t *status) {
|
|
mca_vprotocol_pessimist_event_t *event;
|
|
|
|
for(event = (mca_vprotocol_pessimist_event_t *) opal_list_get_first(&mca_vprotocol_pessimist.replay_events);
|
|
event != (mca_vprotocol_pessimist_event_t *) opal_list_get_end(&mca_vprotocol_pessimist.replay_events);
|
|
event = (mca_vprotocol_pessimist_event_t *) opal_list_get_next(event))
|
|
{
|
|
vprotocol_pessimist_delivery_event_t *devent;
|
|
|
|
if(VPROTOCOL_PESSIMIST_EVENT_TYPE_DELIVERY != event->type) continue;
|
|
devent = &(event->u_event.e_delivery);
|
|
if(devent->probeid < mca_vprotocol_pessimist.clock)
|
|
{
|
|
/* this particular test have to return no request completed yet */
|
|
V_OUTPUT_VERBOSE(70, "pessimist:\treplay\tdeliver\t%"PRIpclock"\tnone", mca_vprotocol_pessimist.clock);
|
|
*index = MPI_UNDEFINED;
|
|
*outcount = 0;
|
|
mca_vprotocol_pessimist.clock++;
|
|
/* This request have to stay in the queue until probeid matches */
|
|
return;
|
|
}
|
|
else if(devent->probeid == mca_vprotocol_pessimist.clock)
|
|
{
|
|
int i;
|
|
for(i = 0; i < (int) n; i++)
|
|
{
|
|
if(VPESSIMIST_FTREQ(reqs[i])->reqid == devent->reqid)
|
|
{
|
|
V_OUTPUT_VERBOSE(70, "pessimist:\treplay\tdeliver\t%"PRIpclock"\t%"PRIpclock, devent->probeid, devent->reqid);
|
|
opal_list_remove_item(&mca_vprotocol_pessimist.replay_events,
|
|
(opal_list_item_t *) event);
|
|
VPESSIMIST_EVENT_RETURN(event);
|
|
*index = i;
|
|
*outcount = 1;
|
|
mca_vprotocol_pessimist.clock++;
|
|
ompi_request_wait(&reqs[i], status);
|
|
return;
|
|
}
|
|
}
|
|
V_OUTPUT_VERBOSE(70, "pessimist:\treplay\tdeliver\t%"PRIpclock"\tnone", mca_vprotocol_pessimist.clock);
|
|
assert(devent->reqid == 0); /* make sure we don't missed a request */
|
|
*index = MPI_UNDEFINED;
|
|
*outcount = 0;
|
|
mca_vprotocol_pessimist.clock++;
|
|
opal_list_remove_item(&mca_vprotocol_pessimist.replay_events,
|
|
(opal_list_item_t *) event);
|
|
VPESSIMIST_EVENT_RETURN(event);
|
|
return;
|
|
}
|
|
}
|
|
V_OUTPUT_VERBOSE(50, "pessimist:\treplay\tdeliver\t%"PRIpclock"\tnot forced", mca_vprotocol_pessimist.clock);
|
|
}
|