From f0aa7a97261661fc3bf5c5ab9cb81128a3742bff Mon Sep 17 00:00:00 2001 From: genaud Date: Thu, 16 Jul 2009 08:49:25 +0000 Subject: [PATCH] separate user-level and internal-level for SMPI_MPI_{Reduce,Bcast} Allreduce ok. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6513 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/smpi/private.h | 11 ++++--- src/smpi/smpi_base.c | 2 +- src/smpi/smpi_mpi.c | 69 +++++++++++++++++++++++++++++--------------- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/src/smpi/private.h b/src/smpi/private.h index bfb38ef0b0..1482c3c8d6 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -124,15 +124,18 @@ void smpi_process_init(int *argc, char ***argv); void smpi_process_finalize(void); int smpi_mpi_comm_rank(smpi_mpi_communicator_t comm); +int smpi_mpi_bcast(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm); int smpi_mpi_barrier(smpi_mpi_communicator_t comm); + int smpi_mpi_isend(smpi_mpi_request_t request); int smpi_mpi_irecv(smpi_mpi_request_t request); +int smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm); int smpi_mpi_wait(smpi_mpi_request_t request, smpi_mpi_status_t * status); -int smpi_mpi_waitall(int count, smpi_mpi_request_t requests[], - smpi_mpi_status_t status[]); -int smpi_mpi_waitany(int count, smpi_mpi_request_t requests[], int *index, - smpi_mpi_status_t status[]); +int smpi_mpi_waitall(int count, smpi_mpi_request_t requests[], smpi_mpi_status_t status[]); +int smpi_mpi_waitany(int count, smpi_mpi_request_t requests[], int *index, smpi_mpi_status_t status[]); + +// utilities void smpi_execute(double duration); void smpi_start_timer(void); double smpi_stop_timer(void); diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 8057078215..498fed235e 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -315,7 +315,7 @@ int smpi_mpi_wait(smpi_mpi_request_t request, smpi_mpi_status_t * status) retval = MPI_ERR_INTERN; } else { SIMIX_mutex_lock(request->mutex); -#define DEBUG_STEPH +//#define DEBUG_STEPH #ifdef DEBUG_STEPH print_req( request ); //@@ #endif diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index 9cf5d01ddc..4ee1d8a864 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -289,6 +289,17 @@ int flat_tree_bcast(void *buf, int count, MPI_Datatype datatype, int root, return(retval); } +/** + * Bcast internal level + **/ +int smpi_mpi_bcast(void *buf, int count, MPI_Datatype datatype, int root, + MPI_Comm comm) +{ + int retval = MPI_SUCCESS; + //retval = flat_tree_bcast(buf, count, datatype, root, comm); + retval = nary_tree_bcast(buf, count, datatype, root, comm, 2 ); + return retval; +} /** * Bcast user entry point @@ -299,10 +310,7 @@ int SMPI_MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, int retval = MPI_SUCCESS; smpi_bench_end(); - - //retval = flat_tree_bcast(buf, count, datatype, root, comm); - retval = nary_tree_bcast(buf, count, datatype, root, comm, 2 ); - + smpi_mpi_bcast(buf,count,datatype,root,comm); smpi_bench_begin(); return retval; @@ -310,7 +318,7 @@ int SMPI_MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root, -//#ifdef DEBUG_REDUCE +#ifdef DEBUG_REDUCE /** * debugging helper function **/ @@ -339,11 +347,11 @@ static void print_buffer_double(void *buf, int len, char *msg, int rank) } -//#endif +#endif /** * MPI_Reduce **/ -int SMPI_MPI_Reduce(void *sendbuf, void *recvbuf, int count, +int smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) { int retval = MPI_SUCCESS; @@ -364,8 +372,7 @@ int SMPI_MPI_Reduce(void *sendbuf, void *recvbuf, int count, #ifdef DEBUG_REDUCE print_buffer_int(sendbuf, count, xbt_strdup("sndbuf"), rank); #endif - retval = - smpi_create_request(sendbuf, count, datatype, rank, root, tag, comm, + retval = smpi_create_request(sendbuf, count, datatype, rank, root, tag, comm, &request); smpi_mpi_isend(request); smpi_mpi_wait(request, MPI_STATUS_IGNORE); @@ -421,34 +428,48 @@ int SMPI_MPI_Reduce(void *sendbuf, void *recvbuf, int count, xbt_free(requests); xbt_free(tmpbufs); } - smpi_bench_begin(); return retval; } +/** + * MPI_Reduce user entry point + **/ +int SMPI_MPI_Reduce(void *sendbuf, void *recvbuf, int count, + MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) +{ +int retval = MPI_SUCCESS; + + smpi_bench_end(); + + retval = smpi_mpi_reduce(sendbuf, recvbuf, count, datatype, op, root, comm); + + smpi_bench_begin(); + return retval; +} + + + /** * MPI_Allreduce * * Same as MPI_REDUCE except that the result appears in the receive buffer of all the group members. **/ int SMPI_MPI_Allreduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm ); -int SMPI_MPI_Allreduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, - MPI_Op op, MPI_Comm comm ) + MPI_Op op, MPI_Comm comm ) { - int retval = MPI_SUCCESS; - int root=1; // arbitrary choice +int retval = MPI_SUCCESS; +int root=0; // arbitrary choice + + smpi_bench_end(); - //smpi_bench_end(); //FIXME: restaure after calling smpi_mpi_reduce instead + retval = smpi_mpi_reduce( sendbuf, recvbuf, count, datatype, op, root, comm); + if (MPI_SUCCESS != retval) + return(retval); - DEBUG0("Reduce"); - retval = SMPI_MPI_Reduce( sendbuf, recvbuf, count, datatype, op, root, comm); - if (MPI_SUCCESS != retval) - return(retval); + retval = smpi_mpi_bcast( sendbuf, count, datatype, root, comm); - DEBUG0("Reduce done, time to bcast"); - retval = SMPI_MPI_Bcast( sendbuf, count, datatype, root, comm); -// smpi_bench_begin(); - return( retval ); + smpi_bench_end(); + return( retval ); } -- 2.20.1