X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/19b3962253112b19308537bc2400de141c119d99..ea74f5d95928a521a588737e81f1de94eef25d19:/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp diff --git a/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp b/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp index ff68e9d1e1..05339259f6 100644 --- a/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-ompi-bruck.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2017. The SimGrid Team. +/* Copyright (c) 2013-2022. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -20,7 +20,7 @@ * Additional copyrights may follow */ -#include "../colls_private.h" +#include "../colls_private.hpp" /* * ompi_coll_tuned_allgatherv_intra_bruck * @@ -33,7 +33,7 @@ * 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: @@ -55,7 +55,7 @@ * [ ] [ ] [ ] [ ] [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] @@ -66,7 +66,7 @@ * [ ] [ ] [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] @@ -77,60 +77,57 @@ * [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) { @@ -139,7 +136,7 @@ int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount, if (distance <= (size >> 1)) { blockcount = distance; - } else { + } else { blockcount = size - distance; } @@ -152,7 +149,7 @@ int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount, 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); @@ -171,7 +168,7 @@ int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount, } - free(new_rcounts); + delete[] new_rcounts; return MPI_SUCCESS;