Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines with new year.
[simgrid.git] / src / smpi / colls / allgather / allgather-3dmesh.cpp
index 118dc79..b0a1002 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2017. The SimGrid Team.
+/* Copyright (c) 2013-2020. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -50,8 +50,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/
 
 /*****************************************************************************
- * Function: is_2dmesh
- * return: int
+ * Function: is_3dmesh
+ * return: bool
  * num: the number of processors in a communicator
  * i: x dimension
  * j: y dimension
@@ -60,7 +60,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  ****************************************************************************/
 #ifndef THREED
 #define THREED
-static int is_3dmesh(int num, int *i, int *j, int *k)
+static bool is_3dmesh(int num, int* i, int* j, int* k)
 {
   int x, max = num / 3;
   x = cbrt(num);
@@ -69,11 +69,11 @@ static int is_3dmesh(int num, int *i, int *j, int *k)
     if ((num % (x * x)) == 0) {
       *i = *j = x;
       *k = num / (x * x);
-      return 1;
+      return true;
     }
     x++;
   }
-  return 0;
+  return false;
 }
 #endif
 /*****************************************************************************
@@ -90,18 +90,17 @@ static int is_3dmesh(int num, int *i, int *j, int *k)
  * algorithm. Allgather ommunication occurs first in the x dimension, y
  * dimension, and then in the z dimension. Communication in each dimension
  * follows "simple"
- * Auther: Ahmad Faraj
+ * Author: Ahmad Faraj
 ****************************************************************************/
 namespace simgrid{
 namespace smpi{
 
 
-int Coll_allgather_3dmesh::allgather(void *send_buff, int send_count,
-                                     MPI_Datatype send_type, void *recv_buff,
-                                     int recv_count, MPI_Datatype recv_type,
-                                     MPI_Comm comm)
+int allgather__3dmesh(const void *send_buff, int send_count,
+                      MPI_Datatype send_type, void *recv_buff,
+                      int recv_count, MPI_Datatype recv_type,
+                      MPI_Comm comm)
 {
-  MPI_Request *req, *req_ptr;
   MPI_Aint extent;
 
   int i, src, dst, rank, num_procs, block_size, my_z_base;
@@ -114,8 +113,7 @@ int Coll_allgather_3dmesh::allgather(void *send_buff, int send_count,
   extent = send_type->get_extent();
 
   if (not is_3dmesh(num_procs, &X, &Y, &Z))
-    THROWF(arg_error,0, "allgather_3dmesh algorithm can't be used with this number of processes! ");
-
+    throw std::invalid_argument("allgather_3dmesh algorithm can't be used with this number of processes!");
 
   num_reqs = X;
 
@@ -133,9 +131,8 @@ int Coll_allgather_3dmesh::allgather(void *send_buff, int send_count,
 
   block_size = extent * send_count;
 
-  req = (MPI_Request *) xbt_malloc(num_reqs * sizeof(MPI_Request));
-
-  req_ptr = req;
+  MPI_Request* req     = new MPI_Request[num_reqs];
+  MPI_Request* req_ptr = req;
 
   // do local allgather/local copy
   recv_offset = rank * block_size;
@@ -206,7 +203,7 @@ int Coll_allgather_3dmesh::allgather(void *send_buff, int send_count,
   }
   Request::waitall(Z - 1, req, MPI_STATUSES_IGNORE);
 
-  free(req);
+  delete[] req;
 
   return MPI_SUCCESS;
 }