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;
103 MPI_Reduce(in, out, num_superacc*exblas::BIN_COUNT, MPI_LONG, MPI_SUM, 0,
106 MPI_Comm_rank( comm_mod, &rank);
110 MPI_Comm_size( comm_mod_reduce, &size);
113 for(
unsigned i=0; i<num_superacc; i++)
115 int imin=exblas::IMIN, imax=exblas::IMAX;
117 for(
int k=0; k<exblas::BIN_COUNT; k++)
118 in[i*BIN_COUNT+k] = out[i*BIN_COUNT+k];
120 MPI_Reduce(in, out, num_superacc*exblas::BIN_COUNT, MPI_LONG,
121 MPI_SUM, 0, comm_mod_reduce);
124 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