/* selector for collective algorithms based on mpich decision logic */
-/* Copyright (c) 2009-2010, 2013-2017. The SimGrid Team.
+/* Copyright (c) 2009-2018. 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"
/* This is the default implementation of allreduce. The algorithm is:
dsize = dtype->size();
block_dsize = dsize * count;
+ /*MPICH uses SMP algorithms for all commutative ops now*/
+ if(!comm->is_smp_comm()){
+ if(comm->get_leaders_comm()==MPI_COMM_NULL){
+ comm->init_smp();
+ }
+ if(op->is_commutative())
+ return Coll_allreduce_mvapich2_two_level::allreduce (sbuf, rbuf,count, dtype, op, comm);
+ }
/* find nearest power-of-two less than or equal to comm_size */
int pof2 = 1;
if (block_dsize > large_message && count >= pof2 && (op==MPI_OP_NULL || op->is_commutative())) {
//for long messages
- return (Coll_allreduce_rab_rdb::allreduce (sbuf, rbuf,
- count, dtype,
- op, comm));
+ return Coll_allreduce_rab_rdb::allreduce (sbuf, rbuf, count, dtype, op, comm);
}else {
//for short ones and count < pof2
- return (Coll_allreduce_rdb::allreduce (sbuf, rbuf,
- count, dtype,
- op, comm));
+ return Coll_allreduce_rdb::allreduce (sbuf, rbuf, count, dtype, op, comm);
}
}
comm);
} else if (block_dsize < medium_size) {
- return Coll_alltoall_basic_linear::alltoall(sbuf, scount, sdtype,
+ return Coll_alltoall_mvapich2_scatter_dest::alltoall(sbuf, scount, sdtype,
rbuf, rcount, rdtype,
comm);
}else if (communicator_size%2){
- return Coll_alltoall_ring::alltoall(sbuf, scount, sdtype,
+ return Coll_alltoall_pair::alltoall(sbuf, scount, sdtype,
rbuf, rcount, rdtype,
comm);
}
//int segsize = 0;
size_t message_size, dsize;
+ if(!comm->is_smp_comm()){
+ if(comm->get_leaders_comm()==MPI_COMM_NULL){
+ comm->init_smp();
+ }
+ if(comm->is_uniform())
+ return Coll_bcast_SMP_binomial::bcast(buff, count, datatype, root, comm);
+ }
+
communicator_size = comm->size();
/* else we need data size for decision function */
)
{
int communicator_size=0;
- //int segsize = 0;
size_t message_size, dsize;
+
+ if(!comm->is_smp_comm()){
+ if(comm->get_leaders_comm()==MPI_COMM_NULL){
+ comm->init_smp();
+ }
+ if (op->is_commutative() == 1)
+ return Coll_reduce_mvapich2_two_level::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
+ }
+
communicator_size = comm->size();
/* need data size for decision function */
if ((count < pof2) || (message_size < 2048) || (op != MPI_OP_NULL && not op->is_commutative())) {
return Coll_reduce_binomial::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
}
- return Coll_reduce_scatter_gather::reduce(sendbuf, recvbuf, count, datatype, op, root, comm/*, module,
- segsize, max_requests*/);
+ return Coll_reduce_scatter_gather::reduce(sendbuf, recvbuf, count, datatype, op, root, comm);
}