Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot/simgrid/simgrid
[simgrid.git] / src / smpi / colls / alltoallv-ring.c
index dcbb9f4..3f2ced2 100644 (file)
@@ -1,3 +1,9 @@
+/* Copyright (c) 2013-2014. 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"
 /*****************************************************************************
 
@@ -38,14 +44,21 @@ smpi_coll_tuned_alltoallv_ring(void *send_buff, int *send_counts, int *send_disp
   num_procs = smpi_comm_size(comm);
   send_chunk = smpi_datatype_get_extent(send_type);
   recv_chunk = smpi_datatype_get_extent(recv_type);
-
+  int pof2 = ((num_procs != 0) && ((num_procs & (~num_procs + 1)) == num_procs));
   for (i = 0; i < num_procs; i++) {
-    src = (rank - i + num_procs) % num_procs;
-    dst = (rank + i) % num_procs;
+  
+    if (pof2 == 1) {
+      /* use exclusive-or algorithm */
+      src = dst = rank ^ i;
+    } else {
+      src = (rank - i + num_procs) % num_procs;
+      dst = (rank + i) % num_procs;
+    }
 
     smpi_mpi_sendrecv(send_ptr + send_disps[dst] * send_chunk, send_counts[dst], send_type, dst,
                  tag, recv_ptr + recv_disps[src] * recv_chunk, recv_counts[src], recv_type,
                  src, tag, comm, &s);
+
   }
   return MPI_SUCCESS;
 }