Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
have waitall output an error if an issue is encountered in any comm, and avoid loopin...
authorAugustin Degomme <degomme@idpann.imag.fr>
Tue, 23 Oct 2012 16:04:48 +0000 (18:04 +0200)
committerAugustin Degomme <degomme@idpann.imag.fr>
Fri, 26 Oct 2012 08:07:35 +0000 (10:07 +0200)
src/smpi/private.h
src/smpi/smpi_base.c
src/smpi/smpi_pmpi.c

index 74b3568..770d816 100644 (file)
@@ -177,7 +177,7 @@ int smpi_mpi_get_count(MPI_Status * status, MPI_Datatype datatype);
 void smpi_mpi_wait(MPI_Request * request, MPI_Status * status);
 int smpi_mpi_waitany(int count, MPI_Request requests[],
                      MPI_Status * status);
-void smpi_mpi_waitall(int count, MPI_Request requests[],
+int smpi_mpi_waitall(int count, MPI_Request requests[],
                       MPI_Status status[]);
 int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices,
                       MPI_Status status[]);
index b3c0351..29b8eb7 100644 (file)
@@ -306,6 +306,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
 {
   MPI_Request req = *request;
   // if we have a sender, we should use its data, and not the data from the receive
+  //FIXME : mail fail if req->action has already been freed, the pointer being invalid
   if((req->action)&&
      (req->src==MPI_ANY_SOURCE || req->tag== MPI_ANY_TAG))
     req = (MPI_Request)SIMIX_comm_get_src_data((*request)->action);
@@ -313,7 +314,10 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
   if(status != MPI_STATUS_IGNORE) {
     status->MPI_SOURCE = req->src;
     status->MPI_TAG = req->tag;
+    //if((*request)->action && ((MPI_Request)SIMIX_comm_get_src_data((*request)->action))->size == (*request)->size)
     status->MPI_ERROR = MPI_SUCCESS;
+    //else status->MPI_ERROR = MPI_ERR_TRUNCATE;
+    // this handles the case were size in receive differs from size in send
     // FIXME: really this should just contain the count of receive-type blocks,
     // right?
     status->count = req->size;
@@ -457,8 +461,10 @@ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status*
     if(status != MPI_STATUS_IGNORE) {
       status->MPI_SOURCE = req->src;
       status->MPI_TAG = req->tag;
-      status->MPI_ERROR = MPI_SUCCESS;
-      status->count = req->size;
+      if(req->size == request->size)
+        status->MPI_ERROR = MPI_SUCCESS;
+      else status->MPI_ERROR = MPI_ERR_TRUNCATE;
+      status->count = request->size;
     }
   }
   else *flag = 0;
@@ -518,12 +524,13 @@ int smpi_mpi_waitany(int count, MPI_Request requests[],
   return index;
 }
 
-void smpi_mpi_waitall(int count, MPI_Request requests[],
+int smpi_mpi_waitall(int count, MPI_Request requests[],
                       MPI_Status status[])
 {
   int  index, c;
   MPI_Status stat;
   MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat;
+  int retvalue=MPI_SUCCESS;
   //tag invalid requests in the set
   for(c = 0; c < count; c++) {
     if(requests[c]==MPI_REQUEST_NULL || requests[c]->dst == MPI_PROC_NULL ){
@@ -548,10 +555,12 @@ void smpi_mpi_waitall(int count, MPI_Request requests[],
        }
       if(status != MPI_STATUSES_IGNORE) {
         memcpy(&status[index], pstat, sizeof(*pstat));
+        if(status[index].MPI_ERROR==MPI_ERR_TRUNCATE)retvalue=MPI_ERR_IN_STATUS;
 
       }
     }
   }
+  return retvalue;
 }
 
 int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices,
index 0db0452..a83b0bd 100644 (file)
@@ -523,8 +523,9 @@ int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup)
         if (i >= n) {
           index = smpi_group_index(group, rank);
           smpi_group_set_mapping(*newgroup, index, rank);
-          rank++;
+          
         }
+        rank++;
       }
     }
     smpi_group_use(*newgroup);
@@ -622,6 +623,7 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
               smpi_group_set_mapping(*newgroup, index, newrank);
             }
           }
+          newrank++; //added to avoid looping, need to be checked ..
         }
       }
     }
@@ -1150,16 +1152,16 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype,
                          MPI_Comm comm, MPI_Status * status)
 {
   //TODO: suboptimal implementation
-  void *recvbuf;
-  int retval, size;
// void *recvbuf;
+  int retval;
 
-  size = smpi_datatype_size(datatype) * count;
-  recvbuf = xbt_new(char, size);
+//  size = smpi_datatype_size(datatype) * count;
+//  recvbuf = xbt_new(char, size);
   retval =
-      MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count,
+      MPI_Sendrecv(buf, count, datatype, dst, sendtag, buf, count,
                    datatype, src, recvtag, comm, status);
-  memcpy(buf, recvbuf, size * sizeof(char));
-  xbt_free(recvbuf);
+/*memcpy(buf, recvbuf, size * sizeof(char));
+  xbt_free(recvbuf);*/
   return retval;
 }
 
@@ -1404,7 +1406,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
 
   TRACE_smpi_ptp_in(rank_traced, -1, -1, __FUNCTION__);
 #endif
-  smpi_mpi_waitall(count, requests, status);
+  int retval = smpi_mpi_waitall(count, requests, status);
 #ifdef HAVE_TRACING
   for (i = 0; i < count; i++) {
     int src_traced, dst_traced, is_wait_for_receive;
@@ -1423,7 +1425,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[])
   TRACE_smpi_computing_in(rank_traced);
 #endif
   smpi_bench_begin();
-  return MPI_SUCCESS;
+  return retval;
 }
 
 int PMPI_Waitsome(int incount, MPI_Request requests[], int *outcount,
@@ -1914,7 +1916,9 @@ int PMPI_Get_processor_name(char *name, int *resultlen)
 
   smpi_bench_end();
   strncpy(name, SIMIX_host_get_name(SIMIX_host_self()),
-          MPI_MAX_PROCESSOR_NAME - 1);
+          strlen(SIMIX_host_get_name(SIMIX_host_self())) < MPI_MAX_PROCESSOR_NAME - 1 ?
+          strlen(SIMIX_host_get_name(SIMIX_host_self())) +1 :
+          MPI_MAX_PROCESSOR_NAME - 1 );
   *resultlen =
       strlen(name) >
       MPI_MAX_PROCESSOR_NAME ? MPI_MAX_PROCESSOR_NAME : strlen(name);