From 8ab4885a856f21049d97a746049b71987d1c695e Mon Sep 17 00:00:00 2001 From: markls Date: Sun, 16 Sep 2007 05:35:54 +0000 Subject: [PATCH] working on mpi_comm_split. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@4636 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/smpi/sample/split.c | 14 ++++++++++++++ src/smpi/smpi_mpi.c | 16 ++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 src/smpi/sample/split.c diff --git a/src/smpi/sample/split.c b/src/smpi/sample/split.c new file mode 100644 index 0000000000..b161190195 --- /dev/null +++ b/src/smpi/sample/split.c @@ -0,0 +1,14 @@ +#include +#include + +int main(int argc, char *argv[]) { + int worldrank, localrank; + MPI_Comm localcomm; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &worldrank); + MPI_Comm_split(MPI_COMM_WORLD, worldrank % 2, worldrank, &localcomm); + MPI_Comm_rank(localcomm, &localrank); + printf("node with world rank %d has local rank %d\n", worldrank, localrank); + MPI_Finalize(); + return 0; +} diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index 97ce5dfa92..70f43ff715 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -182,6 +182,7 @@ int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_ return retval; } +// FIXME: needs to return null in event of MPI_UNDEFINED color... int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *comm_out) { int retval = MPI_SUCCESS; @@ -199,7 +200,6 @@ int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *comm_out) rank = comm->index_to_rank_map[index]; if (0 == rank) { - int *colors = xbt_new(int, comm->size); int *keys = xbt_new(int, comm->size); int i, j, k; @@ -267,18 +267,26 @@ int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *comm_out) tempcomm->rank_to_index_map[j] = indextmp; tempcomm->index_to_rank_map[indextmp] = j; } - // FIXME: now send new communicator to happy troops... + for (j = 0; j < keycount; j++) { + retval = smpi_create_request(&j, 1, MPI_INT, 0, rankstmp[j], 0, comm, &request); + request->data = tempcomm; + smpi_mpi_isend(request); + smpi_mpi_wait(request, &status); + xbt_mallocator_release(smpi_global->request_mallocator, request); + } } } - } else { - colorkey[0] = color; colorkey[1] = key; retval = smpi_create_request(colorkey, 2, MPI_INT, rank, 0, 0, comm, &request); smpi_mpi_isend(request); smpi_mpi_wait(request, &status); xbt_mallocator_release(smpi_global->request_mallocator, request); + retval = smpi_create_request(colorkey, 1, MPI_INT, 0, rank, 0, comm, &request); + smpi_mpi_irecv(request); + smpi_mpi_wait(request, &status); + comm_out = request->data; } smpi_bench_begin(); -- 2.20.1