Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
separate user-level and internal-level for SMPI_MPI_{Reduce,Bcast}
authorgenaud <genaud@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 16 Jul 2009 08:49:25 +0000 (08:49 +0000)
committergenaud <genaud@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Thu, 16 Jul 2009 08:49:25 +0000 (08:49 +0000)
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
src/smpi/smpi_base.c
src/smpi/smpi_mpi.c

index bfb38ef..1482c3c 100644 (file)
@@ -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);
index 8057078..498fed2 100644 (file)
@@ -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
index 9cf5d01..4ee1d8a 100644 (file)
@@ -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 );
 }