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 dfe154d..b0a1002 100644 (file)
@@ -1,10 +1,10 @@
-/* Copyright (c) 2013-2014. 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
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#include "../colls_private.h"
+#include "../colls_private.hpp"
 
 /*****************************************************************************
 
@@ -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,14 +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
 ****************************************************************************/
-int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count,
-                                     MPI_Datatype send_type, void *recv_buff,
-                                     int recv_count, MPI_Datatype recv_type,
-                                     MPI_Comm comm)
+namespace simgrid{
+namespace smpi{
+
+
+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;
@@ -109,9 +112,8 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count,
   num_procs = comm->size();
   extent = send_type->get_extent();
 
-  if (!is_3dmesh(num_procs, &X, &Y, &Z))
-    THROWF(arg_error,0, "allgather_3dmesh algorithm can't be used with this number of processes! ");
-
+  if (not is_3dmesh(num_procs, &X, &Y, &Z))
+    throw std::invalid_argument("allgather_3dmesh algorithm can't be used with this number of processes!");
 
   num_reqs = X;
 
@@ -129,16 +131,15 @@ int smpi_coll_tuned_allgather_3dmesh(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 
+  // do local allgather/local copy
   recv_offset = rank * block_size;
   Datatype::copy(send_buff, send_count, send_type, (char *)recv_buff + recv_offset,
                  recv_count, recv_type);
 
-  // do rowwise comm 
+  // do rowwise comm
   for (i = 0; i < Y; i++) {
     src = i + my_row_base;
     if (src == rank)
@@ -202,7 +203,11 @@ int smpi_coll_tuned_allgather_3dmesh(void *send_buff, int send_count,
   }
   Request::waitall(Z - 1, req, MPI_STATUSES_IGNORE);
 
-  free(req);
+  delete[] req;
 
   return MPI_SUCCESS;
 }
+
+
+}
+}