X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b7ed19dfcc221d7b3eca182abb5c4a3946671172..HEAD:/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp?ds=sidebyside diff --git a/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp b/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp index 1bb0e53b35..2bdeb0f056 100644 --- a/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp +++ b/src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014. The SimGrid Team. +/* Copyright (c) 2013-2023. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -12,21 +12,21 @@ * Returns: MPI_SUCCESS or error code * * Description: Neighbor Exchange algorithm for allgather. - * Described by Chen et.al. in - * "Performance Evaluation of Allgather Algorithms on + * Described by Chen et.al. in + * "Performance Evaluation of Allgather Algorithms on * Terascale Linux Cluster with Fast Ethernet", - * Proceedings of the Eighth International Conference on + * Proceedings of the Eighth International Conference on * High-Performance Computing inn Asia-Pacific Region * (HPCASIA'05), 2005 - * + * * Rank r exchanges message with one of its neighbors and * forwards the data further in the next step. * * No additional memory requirements. - * + * * Limitations: Algorithm works only on even number of processes. * For odd number of processes we switch to ring algorithm. - * + * * Example on 6 nodes: * Initial state * # 0 1 2 3 4 5 @@ -61,14 +61,13 @@ * [4] [4] [4] [4] [4] [4] * [5] [5] [5] [5] [5] [5] */ - - #include "../colls_private.h" -namespace simgrid{ -namespace smpi{ +#include "../colls_private.hpp" -int -Coll_allgather_ompi_neighborexchange::allgather(void *sbuf, int scount, +namespace simgrid::smpi { + +int +allgather__ompi_neighborexchange(const void *sbuf, int scount, MPI_Datatype sdtype, void* rbuf, int rcount, MPI_Datatype rdtype, @@ -81,18 +80,18 @@ Coll_allgather_ompi_neighborexchange::allgather(void *sbuf, int scount, int i, even_rank; int err = 0; ptrdiff_t slb, rlb, sext, rext; - char *tmpsend = NULL, *tmprecv = NULL; + char *tmpsend = nullptr, *tmprecv = nullptr; size = comm->size(); rank = comm->rank(); if (size % 2) { - XBT_DEBUG( - "coll:tuned:allgather_intra_neighborexchange WARNING: odd size %d, switching to ring algorithm", + XBT_INFO( + "coll:tuned:allgather_intra_neighborexchange: odd size %d, switching to ring algorithm", size); - return Coll_allgather_ring::allgather(sbuf, scount, sdtype, - rbuf, rcount, rdtype, - comm); + return allgather__ring(sbuf, scount, sdtype, + rbuf, rcount, rdtype, + comm); } XBT_DEBUG( @@ -112,10 +111,10 @@ Coll_allgather_ompi_neighborexchange::allgather(void *sbuf, int scount, if (MPI_IN_PLACE != sbuf) { tmpsend = (char*) sbuf; Datatype::copy (tmpsend, scount, sdtype, tmprecv, rcount, rdtype); - } + } /* Determine neighbors, order in which blocks will arrive, etc. */ - even_rank = !(rank % 2); + even_rank = not(rank % 2); if (even_rank) { neighbor[0] = (rank + 1) % size; neighbor[1] = (rank - 1 + size) % size; @@ -134,10 +133,10 @@ Coll_allgather_ompi_neighborexchange::allgather(void *sbuf, int scount, /* Communication loop: - First step is special: exchange a single block with neighbor[0]. - - Rest of the steps: - update recv_data_from according to offset, and + - Rest of the steps: + update recv_data_from according to offset, and exchange two blocks with appropriate neighbor. - the send location becomes previous receve location. + the send location becomes previous receive location. */ tmprecv = (char*)rbuf + neighbor[0] * rcount * rext; tmpsend = (char*)rbuf + rank * rcount * rext; @@ -157,15 +156,15 @@ Coll_allgather_ompi_neighborexchange::allgather(void *sbuf, int scount, for (i = 1; i < (size / 2); i++) { const int i_parity = i % 2; - recv_data_from[i_parity] = + recv_data_from[i_parity] = (recv_data_from[i_parity] + offset_at_step[i_parity] + size) % size; tmprecv = (char*)rbuf + recv_data_from[i_parity] * rcount * rext; tmpsend = (char*)rbuf + send_data_from * rcount * rext; - + /* Sendreceive */ - Request::sendrecv(tmpsend, 2 * rcount, rdtype, - neighbor[i_parity], + Request::sendrecv(tmpsend, 2 * rcount, rdtype, + neighbor[i_parity], COLL_TAG_ALLGATHER, tmprecv, 2 * rcount, rdtype, neighbor[i_parity], @@ -183,6 +182,4 @@ Coll_allgather_ompi_neighborexchange::allgather(void *sbuf, int scount, return err; } - -} -} +} // namespace simgrid::smpi