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 4e48add..3f2ced2 100644 (file)
@@ -44,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;
 }