43 MPI_Comm* comm_mod, MPI_Comm* comm_mod_reduce){
47 static std::map<MPI_Comm, std::array<MPI_Comm, 2>> comm_mods;
48 assert( comm != MPI_COMM_NULL);
49 if( comm_mods.count(comm) == 1 )
51 *comm_mod = comm_mods[comm][0];
52 *comm_mod_reduce = comm_mods[comm][1];
56 MPI_Comm_rank( comm, &rank);
57 MPI_Comm_size( comm, &size);
65 MPI_Comm_split( comm, rank/mod, rank%mod, comm_mod);
68 MPI_Comm_split( comm, rank%mod, rank, comm_mod_reduce);
70 comm_mods[comm] = {*comm_mod, *comm_mod_reduce};
95MPI_Comm comm, MPI_Comm comm_mod, MPI_Comm comm_mod_reduce )
97 for(
unsigned i=0; i<num_superacc; i++)
99 int imin=exblas::IMIN, imax=exblas::IMAX;
102 int size_comm, size_comm_mod;
103 MPI_Comm_size( comm, &size_comm);
104 MPI_Comm_size( comm_mod, &size_comm_mod);
105 if( size_comm == size_comm_mod)
107 MPI_Allreduce( in, out, num_superacc*exblas::BIN_COUNT, MPI_LONG, MPI_SUM, comm);
111 MPI_Reduce(in, out, num_superacc*exblas::BIN_COUNT, MPI_LONG, MPI_SUM, 0,
114 MPI_Comm_rank( comm_mod, &rank);
118 MPI_Comm_size( comm_mod_reduce, &size);
121 for(
unsigned i=0; i<num_superacc; i++)
123 int imin=exblas::IMIN, imax=exblas::IMAX;
125 for(
int k=0; k<exblas::BIN_COUNT; k++)
126 in[i*BIN_COUNT+k] = out[i*BIN_COUNT+k];
128 MPI_Reduce(in, out, num_superacc*exblas::BIN_COUNT, MPI_LONG,
129 MPI_SUM, 0, comm_mod_reduce);
132 MPI_Bcast( out, num_superacc*exblas::BIN_COUNT, MPI_LONG, 0, comm);
bool Normalize(int64_t *accumulator, int &imin, int &imax)
Normalize a superaccumulator.
Definition accumulate.h:267
void mpi_reduce_communicator(MPI_Comm comm, MPI_Comm *comm_mod, MPI_Comm *comm_mod_reduce)
This function can be used to partition communicators for the exblas::reduce_mpi_cpu function.
Definition mpi_accumulate.h:42
void reduce_mpi_cpu(unsigned num_superacc, int64_t *in, int64_t *out, MPI_Comm comm, MPI_Comm comm_mod, MPI_Comm comm_mod_reduce)
reduce a number of superaccumulators distributed among mpi processes
Definition mpi_accumulate.h:94