X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/40616078da72e823931c1fb884949054699ec39d..ecd5f7562caf1d443bf22788fa5f4fac408776ec:/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 f93667533b..d57fd3f633 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-2014. The SimGrid Team. +/* Copyright (c) 2013-2017. 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] @@ -76,17 +76,19 @@ * [5] [5] [5] [5] [5] [5] [5] * [6] [6] [6] [6] [6] [6] [6] */ -int smpi_coll_tuned_allgatherv_ompi_bruck(void *sbuf, int scount, + +namespace simgrid{ +namespace smpi{ + +int Coll_allgatherv_ompi_bruck::allgatherv(void *sbuf, int scount, MPI_Datatype sdtype, void *rbuf, int *rcounts, - int *rdispls, + 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; MPI_Datatype new_rdtype = MPI_DATATYPE_NULL, new_sdtype = MPI_DATATYPE_NULL; @@ -94,39 +96,38 @@ int smpi_coll_tuned_allgatherv_ompi_bruck(void *sbuf, int scount, 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) { @@ -135,7 +136,7 @@ int smpi_coll_tuned_allgatherv_ompi_bruck(void *sbuf, int scount, if (distance <= (size >> 1)) { blockcount = distance; - } else { + } else { blockcount = size - distance; } @@ -148,7 +149,7 @@ int smpi_coll_tuned_allgatherv_ompi_bruck(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); @@ -167,9 +168,12 @@ int smpi_coll_tuned_allgatherv_ompi_bruck(void *sbuf, int scount, } - free(new_rcounts); + delete[] new_rcounts; return MPI_SUCCESS; } + +} +}