X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8ab4885a856f21049d97a746049b71987d1c695e..70e4dad5ffd1ba6f56eb7bc97408411b9a73119b:/src/smpi/smpi_mpi.c diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index 70f43ff715..b29243e007 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -1,3 +1,5 @@ +// FIXME: remove +#include #include "private.h" int MPI_Init(int *argc, char ***argv) @@ -102,14 +104,9 @@ int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI smpi_bench_end(); - if (NULL == request) { - retval = MPI_ERR_ARG; - } else { - int dst = 0; - retval = smpi_create_request(buf, count, datatype, src, dst, tag, comm, request); - if (NULL != *request && MPI_SUCCESS == retval) { - retval = smpi_mpi_irecv(*request); - } + retval = smpi_create_request(buf, count, datatype, src, 0, tag, comm, request); + if (NULL != *request && MPI_SUCCESS == retval) { + retval = smpi_mpi_irecv(*request); } smpi_bench_begin(); @@ -120,12 +117,11 @@ int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status) { int retval = MPI_SUCCESS; - int dst = 0; smpi_mpi_request_t request; smpi_bench_end(); - retval = smpi_create_request(buf, count, datatype, src, dst, tag, comm, &request); + retval = smpi_create_request(buf, count, datatype, src, 0, tag, comm, &request); if (NULL != request && MPI_SUCCESS == retval) { retval = smpi_mpi_irecv(request); if (MPI_SUCCESS == retval) { @@ -145,14 +141,9 @@ int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI smpi_bench_end(); - if (NULL == request) { - retval = MPI_ERR_ARG; - } else { - int src = 0; - retval = smpi_create_request(buf, count, datatype, src, dst, tag, comm, request); - if (NULL != *request && MPI_SUCCESS == retval) { - retval = smpi_mpi_isend(*request); - } + retval = smpi_create_request(buf, count, datatype, 0, dst, tag, comm, request); + if (NULL != *request && MPI_SUCCESS == retval) { + retval = smpi_mpi_isend(*request); } smpi_bench_begin(); @@ -163,12 +154,11 @@ int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_Comm comm) { int retval = MPI_SUCCESS; - int src = 0; smpi_mpi_request_t request; smpi_bench_end(); - retval = smpi_create_request(buf, count, datatype, src, dst, tag, comm, &request); + retval = smpi_create_request(buf, count, datatype, 0, dst, tag, comm, &request); if (NULL != request && MPI_SUCCESS == retval) { retval = smpi_mpi_isend(request); if (MPI_SUCCESS == retval) { @@ -182,7 +172,35 @@ int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dst, int tag, MPI_ return retval; } +int MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm) { + + int retval = MPI_SUCCESS; + int rank; + smpi_mpi_request_t request; + + smpi_bench_end(); + + rank = smpi_mpi_comm_rank(comm); + + if (rank == root) { + retval = smpi_create_request(buf, count, datatype, root, (root + 1) % comm->size, 0, comm, &request); + request->forward = comm->size - 1; + smpi_mpi_isend(request); + } else { + retval = smpi_create_request(buf, count, datatype, MPI_ANY_SOURCE, rank, 0, comm, &request); + smpi_mpi_irecv(request); + } + + smpi_mpi_wait(request, MPI_STATUS_IGNORE); + xbt_mallocator_release(smpi_global->request_mallocator, request); + + smpi_bench_begin(); + + return retval; +} + // FIXME: needs to return null in event of MPI_UNDEFINED color... +// FIXME: seriously, this isn't pretty int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *comm_out) { int retval = MPI_SUCCESS; @@ -286,7 +304,7 @@ int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *comm_out) 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; + *comm_out = request->data; } smpi_bench_begin();