Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change malloc/free to new/delete.
[simgrid.git] / src / smpi / colls / scatter / scatter-mvapich-two-level.cpp
index d2cb88f..613a306 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014. The SimGrid Team.
+/* Copyright (c) 2013-2019. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  *  (C) 2001 by Argonne National Laboratory.
  *      See COPYRIGHT in top-level directory.
  */
-#include "../colls_private.h"
+#include "../colls_private.hpp"
 
 #define MPIR_Scatter_MV2_Binomial Coll_scatter_ompi_binomial::scatter
 #define MPIR_Scatter_MV2_Direct Coll_scatter_ompi_basic_linear::scatter
 
-extern int (*MV2_Scatter_intra_function) (void *sendbuf, int sendcount, MPI_Datatype sendtype,
+extern int (*MV2_Scatter_intra_function) (const void *sendbuf, int sendcount, MPI_Datatype sendtype,
     void *recvbuf, int recvcount, MPI_Datatype recvtype,
     int root, MPI_Comm comm);
 
-int Coll_scatter_mvapich2_two_level_direct::scatter(void *sendbuf,
+namespace simgrid{
+namespace smpi{
+
+int Coll_scatter_mvapich2_two_level_direct::scatter(const void *sendbuf,
                                       int sendcnt,
                                       MPI_Datatype sendtype,
                                       void *recvbuf,
@@ -64,7 +67,7 @@ int Coll_scatter_mvapich2_two_level_direct::scatter(void *sendbuf,
     //if not set (use of the algo directly, without mvapich2 selector)
     if(MV2_Scatter_intra_function==NULL)
       MV2_Scatter_intra_function=Coll_scatter_mpich::scatter;
-    
+
     if(comm->get_leaders_comm()==MPI_COMM_NULL){
       comm->init_smp();
     }
@@ -138,51 +141,46 @@ int Coll_scatter_mvapich2_two_level_direct::scatter(void *sendbuf,
         }
 
         if (leader_comm_size > 1 && local_rank == 0) {
-            if (!comm->is_uniform()) {
-                int *displs = NULL;
-                int *sendcnts = NULL;
-                int *node_sizes;
-                int i = 0;
-                node_sizes = comm->get_non_uniform_map();
-
-                if (root != leader_of_root) {
-                    if (leader_comm_rank == leader_root) {
-                        displs = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts[0] = node_sizes[0] * nbytes;
-                        displs[0] = 0;
-
-                        for (i = 1; i < leader_comm_size; i++) {
-                            displs[i] =
-                                displs[i - 1] + node_sizes[i - 1] * nbytes;
-                            sendcnts[i] = node_sizes[i] * nbytes;
-                        }
-                    }
-                        Colls::scatterv(leader_scatter_buf, sendcnts, displs,
-                                      MPI_BYTE, tmp_buf, nbytes * local_size,
-                                      MPI_BYTE, leader_root, leader_comm);
-                } else {
-                    if (leader_comm_rank == leader_root) {
-                        displs = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts[0] = node_sizes[0] * sendcnt;
-                        displs[0] = 0;
-
-                        for (i = 1; i < leader_comm_size; i++) {
-                            displs[i] =
-                                displs[i - 1] + node_sizes[i - 1] * sendcnt;
-                            sendcnts[i] = node_sizes[i] * sendcnt;
-                        }
-                    }
-                    Colls::scatterv(sendbuf, sendcnts, displs,
-                                              sendtype, tmp_buf,
-                                              nbytes * local_size, MPI_BYTE,
-                                              leader_root, leader_comm);
+          if (not comm->is_uniform()) {
+            int* displs   = NULL;
+            int* sendcnts = NULL;
+            int* node_sizes;
+            int i      = 0;
+            node_sizes = comm->get_non_uniform_map();
+
+            if (root != leader_of_root) {
+              if (leader_comm_rank == leader_root) {
+                displs      = new int[leader_comm_size];
+                sendcnts    = new int[leader_comm_size];
+                sendcnts[0] = node_sizes[0] * nbytes;
+                displs[0]   = 0;
+
+                for (i = 1; i < leader_comm_size; i++) {
+                  displs[i]   = displs[i - 1] + node_sizes[i - 1] * nbytes;
+                  sendcnts[i] = node_sizes[i] * nbytes;
                 }
-                if (leader_comm_rank == leader_root) {
-                    xbt_free(displs);
-                    xbt_free(sendcnts);
+              }
+              Colls::scatterv(leader_scatter_buf, sendcnts, displs, MPI_BYTE, tmp_buf, nbytes * local_size, MPI_BYTE,
+                              leader_root, leader_comm);
+            } else {
+              if (leader_comm_rank == leader_root) {
+                displs      = new int[leader_comm_size];
+                sendcnts    = new int[leader_comm_size];
+                sendcnts[0] = node_sizes[0] * sendcnt;
+                displs[0]   = 0;
+
+                for (i = 1; i < leader_comm_size; i++) {
+                  displs[i]   = displs[i - 1] + node_sizes[i - 1] * sendcnt;
+                  sendcnts[i] = node_sizes[i] * sendcnt;
                 }
+              }
+              Colls::scatterv(sendbuf, sendcnts, displs, sendtype, tmp_buf, nbytes * local_size, MPI_BYTE, leader_root,
+                              leader_comm);
+            }
+            if (leader_comm_rank == leader_root) {
+              delete[] displs;
+              delete[] sendcnts;
+            }
             } else {
                 if (leader_of_root != root) {
                     mpi_errno =
@@ -225,7 +223,7 @@ int Coll_scatter_mvapich2_two_level_direct::scatter(void *sendbuf,
 }
 
 
-int Coll_scatter_mvapich2_two_level_binomial::scatter(void *sendbuf,
+int Coll_scatter_mvapich2_two_level_binomial::scatter(const void *sendbuf,
                                         int sendcnt,
                                         MPI_Datatype sendtype,
                                         void *recvbuf,
@@ -248,7 +246,7 @@ int Coll_scatter_mvapich2_two_level_binomial::scatter(void *sendbuf,
     //if not set (use of the algo directly, without mvapich2 selector)
     if(MV2_Scatter_intra_function==NULL)
       MV2_Scatter_intra_function=Coll_scatter_mpich::scatter;
-    
+
     if(comm->get_leaders_comm()==MPI_COMM_NULL){
       comm->init_smp();
     }
@@ -319,51 +317,46 @@ int Coll_scatter_mvapich2_two_level_binomial::scatter(void *sendbuf,
         }
 
         if (leader_comm_size > 1 && local_rank == 0) {
-            if (!comm->is_uniform()) {
-                int *displs = NULL;
-                int *sendcnts = NULL;
-                int *node_sizes;
-                int i = 0;
-                node_sizes = comm->get_non_uniform_map();
-
-                if (root != leader_of_root) {
-                    if (leader_comm_rank == leader_root) {
-                        displs = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts[0] = node_sizes[0] * nbytes;
-                        displs[0] = 0;
-
-                        for (i = 1; i < leader_comm_size; i++) {
-                            displs[i] =
-                                displs[i - 1] + node_sizes[i - 1] * nbytes;
-                            sendcnts[i] = node_sizes[i] * nbytes;
-                        }
-                    }
-                        Colls::scatterv(leader_scatter_buf, sendcnts, displs,
-                                      MPI_BYTE, tmp_buf, nbytes * local_size,
-                                      MPI_BYTE, leader_root, leader_comm);
-                } else {
-                    if (leader_comm_rank == leader_root) {
-                        displs = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts = static_cast<int*>(xbt_malloc(sizeof (int) * leader_comm_size));
-                        sendcnts[0] = node_sizes[0] * sendcnt;
-                        displs[0] = 0;
-
-                        for (i = 1; i < leader_comm_size; i++) {
-                            displs[i] =
-                                displs[i - 1] + node_sizes[i - 1] * sendcnt;
-                            sendcnts[i] = node_sizes[i] * sendcnt;
-                        }
-                    }
-                    Colls::scatterv(sendbuf, sendcnts, displs,
-                                              sendtype, tmp_buf,
-                                              nbytes * local_size, MPI_BYTE,
-                                              leader_root, leader_comm);
+          if (not comm->is_uniform()) {
+            int* displs   = NULL;
+            int* sendcnts = NULL;
+            int* node_sizes;
+            int i      = 0;
+            node_sizes = comm->get_non_uniform_map();
+
+            if (root != leader_of_root) {
+              if (leader_comm_rank == leader_root) {
+                displs      = new int[leader_comm_size];
+                sendcnts    = new int[leader_comm_size];
+                sendcnts[0] = node_sizes[0] * nbytes;
+                displs[0]   = 0;
+
+                for (i = 1; i < leader_comm_size; i++) {
+                  displs[i]   = displs[i - 1] + node_sizes[i - 1] * nbytes;
+                  sendcnts[i] = node_sizes[i] * nbytes;
                 }
-                if (leader_comm_rank == leader_root) {
-                    xbt_free(displs);
-                    xbt_free(sendcnts);
+              }
+              Colls::scatterv(leader_scatter_buf, sendcnts, displs, MPI_BYTE, tmp_buf, nbytes * local_size, MPI_BYTE,
+                              leader_root, leader_comm);
+            } else {
+              if (leader_comm_rank == leader_root) {
+                displs      = new int[leader_comm_size];
+                sendcnts    = new int[leader_comm_size];
+                sendcnts[0] = node_sizes[0] * sendcnt;
+                displs[0]   = 0;
+
+                for (i = 1; i < leader_comm_size; i++) {
+                  displs[i]   = displs[i - 1] + node_sizes[i - 1] * sendcnt;
+                  sendcnts[i] = node_sizes[i] * sendcnt;
                 }
+              }
+              Colls::scatterv(sendbuf, sendcnts, displs, sendtype, tmp_buf, nbytes * local_size, MPI_BYTE, leader_root,
+                              leader_comm);
+            }
+            if (leader_comm_rank == leader_root) {
+              delete[] displs;
+              delete[] sendcnts;
+            }
             } else {
                 if (leader_of_root != root) {
                     mpi_errno =
@@ -408,3 +401,6 @@ int Coll_scatter_mvapich2_two_level_binomial::scatter(void *sendbuf,
     return (mpi_errno);
 }
 
+}
+}
+