-/* Copyright (c) 2013-2017. The SimGrid Team.
+/* Copyright (c) 2013-2021. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* Additional copyrights may follow
*/
-#include "../colls_private.h"
+#include "../colls_private.hpp"
/*
* ompi_coll_tuned_allgatherv_intra_bruck
*
* in Multiport Message-Passing Systems"
* Note: Unlike in case of allgather implementation, we relay on
* indexed datatype to select buffers appropriately.
- * The only additional memory requirement is for creation of
+ * The only additional memory requirement is for creation of
* temporary datatypes.
* Example on 7 nodes (memory lay out need not be in-order)
* Initial set up:
* [ ] [ ] [ ] [ ] [5] [5] [ ]
* [ ] [ ] [ ] [ ] [ ] [6] [6]
* Step 1: send message to (rank - 2^1), receive message from (rank + 2^1).
- * message contains all blocks from (rank) .. (rank + 2^2) with
+ * message contains all blocks from (rank) .. (rank + 2^2) with
* wrap around.
* # 0 1 2 3 4 5 6
* [0] [ ] [ ] [ ] [0] [0] [0]
* [ ] [ ] [5] [5] [5] [5] [ ]
* [ ] [ ] [ ] [6] [6] [6] [6]
* Step 2: send message to (rank - 2^2), receive message from (rank + 2^2).
- * message size is "all remaining blocks"
+ * message size is "all remaining blocks"
* # 0 1 2 3 4 5 6
* [0] [0] [0] [0] [0] [0] [0]
* [1] [1] [1] [1] [1] [1] [1]
* [6] [6] [6] [6] [6] [6] [6]
*/
-namespace simgrid{
-namespace smpi{
+namespace simgrid {
+namespace smpi {
-int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount,
- MPI_Datatype sdtype,
- void *rbuf, int *rcounts,
- int *rdispls,
- MPI_Datatype rdtype,
- MPI_Comm comm)
+int allgatherv__ompi_bruck(const void *sbuf, int scount,
+ MPI_Datatype sdtype,
+ void *rbuf, const int *rcounts,
+ const int *rdispls,
+ MPI_Datatype rdtype,
+ MPI_Comm comm)
{
int sendto, recvfrom, blockcount, i;
unsigned int distance;
- int *new_rcounts = NULL, *new_rdispls = NULL;
- int *new_scounts = NULL, *new_sdispls = NULL;
ptrdiff_t slb, rlb, sext, rext;
- char *tmpsend = NULL, *tmprecv = NULL;
+ char *tmpsend = nullptr, *tmprecv = nullptr;
MPI_Datatype new_rdtype = MPI_DATATYPE_NULL, new_sdtype = MPI_DATATYPE_NULL;
unsigned int size = comm->size();
unsigned int rank = comm->rank();
- XBT_DEBUG(
- "coll:tuned:allgather_ompi_bruck rank %d", rank);
-
+ XBT_DEBUG("coll:tuned:allgather_ompi_bruck rank %u", rank);
+
sdtype->extent(&slb, &sext);
rdtype->extent(&rlb, &rext);
/* Initialization step:
- - if send buffer is not MPI_IN_PLACE, copy send buffer to block rank of
+ - if send buffer is not MPI_IN_PLACE, copy send buffer to block rank of
the receive buffer.
*/
tmprecv = (char*) rbuf + rdispls[rank] * rext;
if (MPI_IN_PLACE != sbuf) {
tmpsend = (char*) sbuf;
- Datatype::copy(tmpsend, scount, sdtype,
+ Datatype::copy(tmpsend, scount, sdtype,
tmprecv, rcounts[rank], rdtype);
}
-
+
/* Communication step:
At every step i, rank r:
- doubles the distance
- sends message with blockcount blocks, (rbuf[rank] .. rbuf[rank + 2^i])
to rank (r - distance)
- - receives message of blockcount blocks,
- (rbuf[r + distance] ... rbuf[(r+distance) + 2^i]) from
+ - receives message of blockcount blocks,
+ (rbuf[r + distance] ... rbuf[(r+distance) + 2^i]) from
rank (r + distance)
- - blockcount doubles until the last step when only the remaining data is
+ - blockcount doubles until the last step when only the remaining data is
exchanged.
*/
- new_rcounts = (int*) calloc(4*size, sizeof(int));
- new_rdispls = new_rcounts + size;
- new_scounts = new_rdispls + size;
- new_sdispls = new_scounts + size;
+ int* new_rcounts = new int[4 * size];
+ int* new_rdispls = new_rcounts + size;
+ int* new_scounts = new_rdispls + size;
+ int* new_sdispls = new_scounts + size;
for (distance = 1; distance < size; distance<<=1) {
if (distance <= (size >> 1)) {
blockcount = distance;
- } else {
+ } else {
blockcount = size - distance;
}
new_rcounts[i] = rcounts[tmp_rrank];
new_rdispls[i] = rdispls[tmp_rrank];
}
- Datatype::create_indexed(blockcount, new_scounts, new_sdispls,
+ Datatype::create_indexed(blockcount, new_scounts, new_sdispls,
rdtype, &new_sdtype);
Datatype::create_indexed(blockcount, new_rcounts, new_rdispls,
rdtype, &new_rdtype);
}
- free(new_rcounts);
+ delete[] new_rcounts;
return MPI_SUCCESS;