Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Replace some malloc/free by C++ new/delete.
[simgrid.git] / src / smpi / colls / allgatherv / allgatherv-ompi-bruck.cpp
index f936675..d57fd3f 100644 (file)
@@ -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]
  *         [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;
 
 }
 
+
+}
+}