-/* Copyright (c) 2013-2017. The SimGrid Team.
+/* Copyright (c) 2013-2019. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* copyright file COPYRIGHT in the top level MVAPICH2 directory.
*
*/
-
+
//correct on stampede
#define MV2_ALLTOALL_THROTTLE_FACTOR 4
-
-#include "../colls_private.h"
+
+#include "../colls_private.hpp"
namespace simgrid{
namespace smpi{
int Coll_alltoall_mvapich2_scatter_dest::alltoall(
- void *sendbuf,
+ const void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
void *recvbuf,
MPI_Aint sendtype_extent = 0, recvtype_extent = 0;
int mpi_errno=MPI_SUCCESS;
int dst, rank;
- MPI_Request *reqarray;
- MPI_Status *starray;
-
+
if (recvcount == 0) return MPI_SUCCESS;
-
+
comm_size = comm->size();
rank = comm->rank();
-
+
/* Get extent of send and recv types */
recvtype_extent = recvtype->get_extent();
sendtype_extent = sendtype->get_extent();
-
+
/* Medium-size message. Use isend/irecv with scattered
destinations. Use Tony Ladd's modification to post only
a small number of isends/irecvs at a time. */
there are only a few isend/irecvs left)
*/
int ii, ss, bblock;
-
+
//Stampede is configured with
bblock = MV2_ALLTOALL_THROTTLE_FACTOR;//mv2_coll_param.alltoall_throttle_factor;
-
+
if (bblock >= comm_size) bblock = comm_size;
/* If throttle_factor is n, each process posts n pairs of isend/irecv
in each iteration. */
-
+
/* FIXME: This should use the memory macros (there are storage
leaks here if there is an error, for example) */
- reqarray= (MPI_Request*)xbt_malloc(2*bblock*sizeof(MPI_Request));
-
- starray=(MPI_Status *)xbt_malloc(2*bblock*sizeof(MPI_Status));
-
+ MPI_Request* reqarray = new MPI_Request[2 * bblock];
+
+ MPI_Status* starray = new MPI_Status[2 * bblock];
+
for (ii=0; ii<comm_size; ii+=bblock) {
ss = comm_size-ii < bblock ? comm_size-ii : bblock;
/* do the communication -- post ss sends and receives: */
COLL_TAG_ALLTOALL, comm);
}
-
+
/* ... then wait for them to finish: */
Request::waitall(2*ss,reqarray,starray);
-
-
+
+
/* --BEGIN ERROR HANDLING-- */
if (mpi_errno == MPI_ERR_IN_STATUS) {
for (j=0; j<2*ss; j++) {
}
}
/* --END ERROR HANDLING-- */
- xbt_free(starray);
- xbt_free(reqarray);
+ delete[] starray;
+ delete[] reqarray;
return (mpi_errno);
-
+
}
}
}