Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
removed check that sent/received requests are for the same size message.
[simgrid.git] / src / smpi / smpi_base.c
index 16eaeb9..f221d21 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "private.h"
 #include "xbt/time.h"
+#include "mc/mc.h"
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_base, smpi,
                                 "Logging specific to SMPI (base)");
@@ -23,10 +24,9 @@ static int match_recv(void* a, void* b) {
    MPI_Request ref = (MPI_Request)a;
    MPI_Request req = (MPI_Request)b;
 
-   xbt_assert0(ref, "Cannot match recv against null reference");
-   xbt_assert0(req, "Cannot match recv against null request");
-   return req->comm == ref->comm
-          && (ref->src == MPI_ANY_SOURCE || req->src == ref->src)
+   xbt_assert(ref, "Cannot match recv against null reference");
+   xbt_assert(req, "Cannot match recv against null request");
+   return (ref->src == MPI_ANY_SOURCE || req->src == ref->src)
           && (ref->tag == MPI_ANY_TAG || req->tag == ref->tag);
 }
 
@@ -34,10 +34,9 @@ static int match_send(void* a, void* b) {
    MPI_Request ref = (MPI_Request)a;
    MPI_Request req = (MPI_Request)b;
 
-   xbt_assert0(ref, "Cannot match send against null reference");
-   xbt_assert0(req, "Cannot match send against null request");
-   return req->comm == ref->comm
-          && (req->src == MPI_ANY_SOURCE || req->src == ref->src)
+   xbt_assert(ref, "Cannot match send against null reference");
+   xbt_assert(req, "Cannot match send against null request");
+   return (req->src == MPI_ANY_SOURCE || req->src == ref->src)
           && (req->tag == MPI_ANY_TAG || req->tag == ref->tag);
 }
 
@@ -88,7 +87,7 @@ void smpi_mpi_start(MPI_Request request)
 {
   smx_rdv_t mailbox;
 
-  xbt_assert0(!request->action,
+  xbt_assert(!request->action,
               "Cannot (re)start a non-finished communication");
   if(request->flags & RECV) {
     print_request("New recv", request);
@@ -98,7 +97,7 @@ void smpi_mpi_start(MPI_Request request)
     print_request("New send", request);
     mailbox = smpi_process_remote_mailbox(request->dst);
     request->action = SIMIX_req_comm_isend(mailbox, request->size, -1.0,
-                                           request->buf, request->size, &match_send, request);
+                                           request->buf, request->size, &match_send, request, 0);
 #ifdef HAVE_TRACING
     SIMIX_req_set_category (request->action, TRACE_internal_smpi_get_category());
 #endif
@@ -211,9 +210,8 @@ static void finish_wait(MPI_Request * request, MPI_Status * status)
     status->MPI_SOURCE = req->src;
     status->MPI_TAG = req->tag;
     status->MPI_ERROR = MPI_SUCCESS;
-    status->count = SIMIX_req_comm_get_dst_buff_size(req->action);
+    status->count = req->size;
   }
-  SIMIX_req_comm_destroy(req->action);
   print_request("Finishing", req);
   if(req->flags & NON_PERSISTENT) {
     smpi_mpi_request_free(request);
@@ -286,7 +284,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[],
     comms = xbt_dynar_new(sizeof(smx_action_t), NULL);
     map = xbt_new(int, count);
     size = 0;
-    DEBUG0("Wait for one of");
+    XBT_DEBUG("Wait for one of");
     for(i = 0; i < count; i++) {
       if(requests[i] != MPI_REQUEST_NULL) {
         print_request("   ", requests[i]);
@@ -313,16 +311,19 @@ void smpi_mpi_waitall(int count, MPI_Request requests[],
   MPI_Status stat;
   MPI_Status *pstat = status == MPI_STATUS_IGNORE ? MPI_STATUS_IGNORE : &stat;
 
-  c = count;
-  while(c > 0) {
-    index = smpi_mpi_waitany(count, requests, pstat);
-    if(index == MPI_UNDEFINED) {
-      break;
+  for(c = 0; c < count; c++) {
+    if(MC_IS_ENABLED) {
+      smpi_mpi_wait(&requests[c], pstat);
+      index = c;
+    } else {
+      index = smpi_mpi_waitany(count, requests, pstat);
+      if(index == MPI_UNDEFINED) {
+        break;
+      }
     }
     if(status != MPI_STATUS_IGNORE) {
-      memcpy(&status[index], pstat, sizeof *pstat);
+      memcpy(&status[index], pstat, sizeof(*pstat));
     }
-    c--;
   }
 }