Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 3 Mar 2017 12:51:44 +0000 (13:51 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 3 Mar 2017 12:51:44 +0000 (13:51 +0100)
1  2 
src/smpi/smpi_base.cpp

diff --combined src/smpi/smpi_base.cpp
@@@ -332,7 -332,7 +332,7 @@@ void smpi_mpi_start(MPI_Request request
      // we make a copy here, as the size is modified by simix, and we may reuse the request in another receive later
      request->real_size=request->size;
      request->action = simcall_comm_irecv(SIMIX_process_self(), mailbox, request->buf, &request->real_size, &match_recv,
-                                          ! smpi_process_get_replaying()? &smpi_comm_copy_buffer_callback
+                                          ! smpi_process_get_replaying()? smpi_comm_copy_data_callback
                                           : &smpi_comm_null_copy_buffer_callback, request, -1.0);
      XBT_DEBUG("recv simcall posted");
  
      request->action = simcall_comm_isend(SIMIX_process_from_PID(request->src+1), mailbox, request->size, -1.0,
                                           buf, request->real_size, &match_send,
                           &xbt_free_f, // how to free the userdata if a detached send fails
-                          !smpi_process_get_replaying() ? &smpi_comm_copy_buffer_callback
+                          !smpi_process_get_replaying() ? smpi_comm_copy_data_callback
                           : &smpi_comm_null_copy_buffer_callback, request,
                           // detach if msg size < eager/rdv switch limit
                           request->detached);
@@@ -1338,8 -1338,7 +1338,8 @@@ void smpi_mpi_allreduce(void *sendbuf, 
  void smpi_mpi_scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
  {
    int system_tag = -888;
 -  MPI_Aint lb = 0, dataext = 0;
 +  MPI_Aint lb      = 0;
 +  MPI_Aint dataext = 0;
  
    int rank = smpi_comm_rank(comm);
    int size = smpi_comm_size(comm);
  void smpi_mpi_exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
  {
    int system_tag = -888;
 -  MPI_Aint lb = 0, dataext = 0;
 +  MPI_Aint lb         = 0;
 +  MPI_Aint dataext    = 0;
    int recvbuf_is_empty=1;
    int rank = smpi_comm_rank(comm);
    int size = smpi_comm_size(comm);
    }
    // Wait for completion of all comms.
    smpi_mpi_startall(size - 1, requests);
 +
    if(smpi_op_is_commute(op)){
      for (int other = 0; other < size - 1; other++) {
        index = smpi_mpi_waitany(size - 1, requests, MPI_STATUS_IGNORE);
      for (int other = 0; other < size - 1; other++) {
        smpi_mpi_wait(&(requests[other]), MPI_STATUS_IGNORE);
        if(index < rank) {
 -          if(recvbuf_is_empty){
 -            smpi_datatype_copy(tmpbufs[other], count, datatype, recvbuf, count, datatype);
 -            recvbuf_is_empty=0;
 -          } else
 -            smpi_op_apply(op, tmpbufs[other], recvbuf, &count, &datatype);
 +        if (recvbuf_is_empty) {
 +          smpi_datatype_copy(tmpbufs[other], count, datatype, recvbuf, count, datatype);
 +          recvbuf_is_empty = 0;
 +        } else
 +          smpi_op_apply(op, tmpbufs[other], recvbuf, &count, &datatype);
        }
      }
    }