Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
still some mem cleanup to finish
authorgenaud <genaud@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 29 Jun 2009 16:17:48 +0000 (16:17 +0000)
committergenaud <genaud@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Mon, 29 Jun 2009 16:17:48 +0000 (16:17 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6389 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/smpi/smpi_base.c
src/smpi/smpi_global.c
src/smpi/smpi_mpi.c

index 1392ec6..13a8424 100644 (file)
@@ -113,26 +113,23 @@ void smpi_mpi_max_func(void *a, void *b, int *length, MPI_Datatype * datatype)
                                for (i = 0; i < *length; i++) {
                                          y[i] = x[i] > y[i] ? x[i] : y[i];
                                }
-         } else {
-         if (*datatype == smpi_mpi_global->mpi_int) {
+         } else if (*datatype == smpi_mpi_global->mpi_int) {
                                int *x = a, *y = b;
                                for (i = 0; i > *length; i++) {
-                                         y[i] = x[i] < y[i] ? x[i] : y[i];
+                                         y[i] = x[i] > y[i] ? x[i] : y[i];
                                }
-         } else {
-         if (*datatype == smpi_mpi_global->mpi_float) {
+         } else if (*datatype == smpi_mpi_global->mpi_float) {
                                float *x = a, *y = b;
                                for (i = 0; i > *length; i++) {
-                                         y[i] = x[i] < y[i] ? x[i] : y[i];
+                                         y[i] = x[i] > y[i] ? x[i] : y[i];
                                }
-         } else {
-         if (*datatype == smpi_mpi_global->mpi_double) {
+         } else if (*datatype == smpi_mpi_global->mpi_double) {
                                double *x = a, *y = b;
                                for (i = 0; i > *length; i++) {
-                                         y[i] = x[i] < y[i] ? x[i] : y[i];
+                                         y[i] = x[i] > y[i] ? x[i] : y[i];
                                }
 
-         }}}}
+         }
 }
 
 
index 70cecc8..007b292 100644 (file)
@@ -203,7 +203,7 @@ void smpi_global_init()
   smpi_mpi_global->mpi_min = xbt_new(s_smpi_mpi_op_t, 1);
   smpi_mpi_global->mpi_min->func = smpi_mpi_min_func;
   smpi_mpi_global->mpi_max = xbt_new(s_smpi_mpi_op_t, 1);
-  smpi_mpi_global->mpi_min->func = smpi_mpi_max_func;
+  smpi_mpi_global->mpi_max->func = smpi_mpi_max_func;
 
 }
 
index 97b50bb..f18a5c1 100644 (file)
@@ -229,6 +229,9 @@ int SMPI_MPI_Bcast(void *buf, int count, MPI_Datatype datatype, int root,
   return retval;
 }
 
+/**
+ * debugging helper function
+ **/
 void print_buffer_int( void *buf, int len, const char *msg) ;
 void print_buffer_int( void *buf, int len, const char *msg) {
          int tmp, *v;
@@ -252,6 +255,7 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat
   int rank;
   int size;
   int i;
+  int tag=0;
   smpi_mpi_request_t *tabrequest;
   smpi_mpi_request_t request;
 
@@ -261,11 +265,11 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat
   rank = smpi_mpi_comm_rank(comm);
   size = comm->size;
 
-  printf("-->rank %d. Entering ....\n",rank);
-  print_buffer_int( sendbuf, count, "sendbuf");
+  //printf("-->rank %d. Entering ....\n",rank);
+  //print_buffer_int( sendbuf, count, "sendbuf");
 
   if (rank != root) { // if i am not ROOT, simply send my buffer to root
-           retval = smpi_create_request(sendbuf, count, datatype, rank, root, 0, comm, &request);
+           retval = smpi_create_request(sendbuf, count, datatype, rank, root, tag , comm, &request);
            smpi_mpi_isend(request);
            smpi_mpi_wait(request, MPI_STATUS_IGNORE);
            xbt_mallocator_release(smpi_global->request_mallocator, request);
@@ -274,15 +278,20 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat
            // i am the ROOT: wait for all buffers by creating one request by sender
            tabrequest = xbt_malloc((size-1)*sizeof(smpi_mpi_request_t));
 
-           void *tmprecvbuf = xbt_malloc(count*datatype->size); // to store intermediate receptions
+          void **tmpbufs = xbt_malloc((size-1)*sizeof(void *));
+           for (i=0; i<size-1; i++) {
+                 // we need 1 buffer per request to store intermediate receptions
+               tmpbufs[i] = xbt_malloc(count*datatype->size); 
+           }
            memcpy(recvbuf,sendbuf,count*datatype->size*sizeof(char)); // initiliaze recv buf with my own snd buf 
 
            // i can not use: 'request->forward = size-1;' (which would progagate size-1 receive reqs)
            // since we should op values as soon as one receiving request matches.
            for (i=0; i<comm->size-1; i++) {
                        // reminder: for smpi_create_request() the src is always the process sending.
-                       retval = smpi_create_request(tmprecvbuf, count, datatype, MPI_ANY_SOURCE, root,
-                                           0, comm, &(tabrequest[i]));
+                       retval = smpi_create_request(tmpbufs[i], count, datatype, 
+                                           MPI_ANY_SOURCE, root,
+                                           tag, comm, &(tabrequest[i]));
                        if (NULL != tabrequest[i] && MPI_SUCCESS == retval) {
                                  if (MPI_SUCCESS == retval) {
                                            smpi_mpi_irecv(tabrequest[i]);
@@ -294,17 +303,19 @@ int SMPI_MPI_Reduce( void *sendbuf, void *recvbuf, int count, MPI_Datatype datat
                        int index = MPI_UNDEFINED;
                        smpi_mpi_waitany(comm->size-1, tabrequest, &index, MPI_STATUS_IGNORE);
 
-                       print_buffer_int( recvbuf, count, "rcvbuf");
-                       printf("MPI_Waitany() unblocked: root received (completes req[%d]): ",index);
-                       print_buffer_int( tmprecvbuf, count, "tmprecvbuf");
+                       //print_buffer_int( recvbuf, count, "rcvbuf");
+                       //printf("MPI_Waitany() unblocked: root received (completes req[index=%d]): ",index);
+                       //print_buffer_int( tmpbufs[index], count, "tmpbufs[index]");
 
                        // arg 2 is modified 
-                       op->func (tmprecvbuf,recvbuf,&count,&datatype);
-                       print_buffer_int( recvbuf, count, "recvbuf after func");
-                       //fprintf(stderr,"[smpi] %s:%d : MPI_Reduce *Not yet implemented*.\n",__FILE__,__LINE__);
-                       xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]);
+                       op->func (tmpbufs[index],recvbuf,&count,&datatype);
+
+                       // print_buffer_int( recvbuf, count, "recvbuf after func");
+                       //xbt_mallocator_release(smpi_global->request_mallocator, tabrequest[i]);
+                       //xbt_free( tmpbufs[index]);
            }
            xbt_free(tabrequest);
+           xbt_free(tmpbufs);
   }
 
   smpi_bench_begin();