1
1
openmpi/orte/test/mpi/pconnect.c
Ralph Castain 6d24b34940 Extend the dpm framework API to support persistent accept/connect operations:
* paccept - establish a persistent listening port for async connect requests

* pconnect - async connect to remote process that has posted a paccept port. Provides a timeout mechanism, and allows the underlying implementation to retry until timeout 

* pclose - shuts down a prior paccept posting

Includes example programs paccept.c and pconnect.c in orte/test/mpi. New MPI extension interfaces coming...

This commit was SVN r29063.
2013-08-23 18:02:50 +00:00

99 строки
2.7 KiB
C

/* -*- C -*-
*
* $HEADER$
*
*/
#include "ompi_config.h"
#include <stdio.h>
#include "mpi.h"
#include "ompi/mca/dpm/dpm.h"
static ompi_communicator_t *newcomp;
static ompi_proc_t *sender;
static void xnt(ompi_communicator_t *newcomm,
ompi_proc_t *remote_proc,
void *cbdata)
{
bool *lock = (bool*)cbdata;
newcomp = newcomm;
sender = remote_proc;
*lock = false;
}
int main(int argc, char* argv[])
{
char port[1024];
bool lock;
FILE *fp;
int rank, rc;
int msg;
/* program requires an argument specifying the file where
* the connection info is to be found
*/
if (2 != argc) {
fprintf(stderr, "Usage: pconnect <filename>\n");
exit(1);
}
MPI_Init(&argc, &argv);
/* read the file */
fp = fopen(argv[1], "r");
fgets(port, 1024, fp);
port[strlen(port)-1] = '\0'; /* remove newline */
fclose(fp);
/* start the connect */
lock = true;
if (OMPI_SUCCESS != ompi_dpm.pconnect(port, NULL, xnt, &lock)) {
fprintf(stderr, "Failed to start connect\n");
goto cleanup;
}
/* wait for completion */
OMPI_WAIT_FOR_COMPLETION(lock);
/* allocate comm_cid */
rank = ompi_comm_rank(MPI_COMM_SELF);
rc = ompi_comm_nextcid(newcomp, /* new communicator */
MPI_COMM_SELF, /* old communicator */
NULL, /* bridge comm */
&rank, /* local leader */
&sender->proc_name, /* remote leader */
OMPI_COMM_CID_INTRA_OOB, /* mode */
true); /* send or recv first */
if ( OMPI_SUCCESS != rc ) {
fprintf(stderr, "Failed to negotiate cid\n");
goto cleanup;
}
/* activate comm and init coll-component */
rc = ompi_comm_activate(&newcomp, /* new communicator */
MPI_COMM_SELF, /* old communicator */
NULL, /* bridge comm */
&rank, /* local leader */
&sender->proc_name, /* remote leader */
OMPI_COMM_CID_INTRA_OOB, /* mode */
true); /* send or recv first */
if ( OMPI_SUCCESS != rc ) {
fprintf(stderr, "Failed to activate communicator\n");
goto cleanup;
}
fprintf(stderr, "HANDSHAKE COMPLETE\n");
msg = 38;
MPI_Send(&msg, 1, MPI_INT, 0, 1, newcomp);
MPI_Comm_disconnect(&newcomp);
fprintf(stderr, "MESSAGE SENT\n");
cleanup:
MPI_Finalize();
return 0;
}