38 #define MPI_Comm std::intptr_t 41 #include "hex-arrays.h" 65 : active_(active), iproc_(0), Nproc_(1), igroup_(0), Ngroup_(1), groupsize_(groupsize)
75 int req_flag = MPI_THREAD_SERIALIZED, prov_flag;
76 MPI_Init_thread(argc, argv, req_flag, &prov_flag);
79 if (prov_flag != MPI_THREAD_SERIALIZED)
81 std::cout <<
"Warning: The MPI implementation doesn't support MPI_THREAD_SERIALIZED. ";
82 std::cout <<
"Every MPI process may thus run only on a single core." << std::endl;
86 MPI_Comm_size(MPI_COMM_WORLD, &Nproc_);
87 MPI_Comm_rank(MPI_COMM_WORLD, &iproc_);
90 if (Nproc_ % groupsize_ != 0)
91 HexException(
"Number of processes (currently %d) must be integer mutiple of groupsize (currently %d).", Nproc_, groupsize_);
94 Ngroup_ = Nproc_ / groupsize_;
97 igroup_ = iproc_ / groupsize_;
100 for (
int i = 0; i < Ngroup_; i++)
107 igroup_ == i ? 0 : MPI_UNDEFINED,
114 groupcomm_ = newcomm;
162 return iproc_ % groupsize_ == 0;
176 return i % Nproc_ == iproc_;
190 return i % Ngroup_ == igroup_;
197 int iproc ()
const {
return iproc_; }
206 int Nproc ()
const {
return Nproc_; }
217 template <
class T>
void bcast (
int owner, T* data, std::size_t N)
const 226 N * typeinfo<T>::ncmpt,
227 typeinfo<T>::mpicmpttype(),
238 template <
class T>
void bcast (
int owner, NumberArray<T> & data)
const 244 int size = data.size();
245 MPI_Bcast(&size, 1, MPI_INT, owner, MPI_COMM_WORLD);
254 size * typeinfo<T>::ncmpt,
255 typeinfo<T>::mpicmpttype(),
266 template <
class T>
void bcast_g (
int igroup,
int groupowner, T * data, std::size_t N)
const 269 if (active_ and igroup == igroup_ and groupsize_ > 1)
275 N * typeinfo<T>::ncmpt,
276 typeinfo<T>::mpicmpttype(),
287 template <
class T>
void send (T
const * array, std::size_t size,
int origin,
int destination)
const 290 if (active_ and iproc_ == origin)
294 const_cast<T*>(array),
295 typeinfo<T>::ncmpt * size,
296 typeinfo<T>::mpicmpttype(),
308 template <
class T>
void recv (T * array, std::size_t size,
int origin,
int destination)
const 311 if (active_ and iproc_ == destination)
318 typeinfo<T>::ncmpt * size,
319 typeinfo<T>::mpicmpttype(),
344 template <
class T>
void sync (T * array, std::size_t chunksize, std::size_t Nchunk)
const 349 for (
unsigned ichunk = 0; ichunk < Nchunk; ichunk++)
353 array + ichunk * chunksize,
354 chunksize * typeinfo<T>::ncmpt,
355 typeinfo<T>::mpicmpttype(),
364 template <
class T>
void sync_m (T * array, std::size_t chunksize, std::size_t Nchunk)
const 369 for (
unsigned ichunk = 0; ichunk < Nchunk; ichunk++)
373 array + ichunk * chunksize,
374 chunksize * typeinfo<T>::ncmpt,
375 typeinfo<T>::mpicmpttype(),
387 template <
class T>
void sum (T* array, std::size_t N,
int owner = 0)
const 394 (iproc_ == owner ? MPI_IN_PLACE : array),
395 (iproc_ == owner ? array :
nullptr),
396 typeinfo<T>::ncmpt * N,
397 typeinfo<T>::mpicmpttype(),
415 template <
class T>
void syncsum (T* array, std::size_t N)
const 424 typeinfo<T>::ncmpt * N,
425 typeinfo<T>::mpicmpttype(),
442 template <
class T>
void syncsum_g (T* array, std::size_t N)
const 451 typeinfo<T>::ncmpt * N,
452 typeinfo<T>::mpicmpttype(),
463 template <
class T>
void sum_g (T* array, std::size_t N,
int destination)
const 466 if (active_ and groupsize_ > 1)
470 (
igroupproc() == destination ? MPI_IN_PLACE : array),
471 (
igroupproc() == destination ? array :
nullptr),
472 typeinfo<T>::ncmpt * N,
473 typeinfo<T>::mpicmpttype(),
485 template <
class T>
void mastersum (T* array, std::size_t N,
int destgroup)
const 492 (igroup_ == destgroup ? MPI_IN_PLACE : array),
493 (igroup_ == destgroup ? array :
nullptr),
494 typeinfo<T>::ncmpt * N,
495 typeinfo<T>::mpicmpttype(),
513 MPI_Barrier(MPI_COMM_WORLD);
521 MPI_Barrier(groupcomm_);
529 return (
void*)(std::intptr_t)groupcomm_;
555 MPI_Comm mastergroup_;
void mastersum(T *array, std::size_t N, int destgroup) const
Sum array from all group masters to one of the group masters.
Definition: parallel.h:485
int Nproc() const
Returns the size of the communicator (process count).
Definition: parallel.h:206
int iproc() const
Returns the rank of the communicator (process is).
Definition: parallel.h:197
void recv(T *array, std::size_t size, int origin, int destination) const
Receive data from a process.
Definition: parallel.h:308
int Ngroup() const
Returns the number of groups.
Definition: parallel.h:209
bool active() const
Returns true if the MPI is active.
Definition: parallel.h:194
int igroupproc() const
Returns index of rank within the group.
Definition: parallel.h:203
void wait_g() const
Definition: parallel.h:517
int groupsize() const
Return group size.
Definition: parallel.h:212
void bcast(int owner, T *data, std::size_t N) const
Broadcast array from owner to everyone.
Definition: parallel.h:217
bool isMyWork(int i) const
Returns true if the work item is assigned to this process.
Definition: parallel.h:174
void bcast_g(int igroup, int groupowner, T *data, std::size_t N) const
Broadcast array from owner to everyone in the group.
Definition: parallel.h:266
void bcast(int owner, NumberArray< T > &data) const
Broadcast array from owner to everyone.
Definition: parallel.h:238
void sum_g(T *array, std::size_t N, int destination) const
Sum array within group to a given process.
Definition: parallel.h:463
void wait() const
Wait for completition of all running tasks.
Definition: parallel.h:509
bool isMyGroupWork(int i) const
Returns true if the work item is assigned to this process' group.
Definition: parallel.h:188
void send(T const *array, std::size_t size, int origin, int destination) const
Send data to a process.
Definition: parallel.h:287
void sync(T *array, std::size_t chunksize, std::size_t Nchunk) const
Synchronize across processes by composition.
Definition: parallel.h:344
void * groupcomm() const
Definition: parallel.h:525
MPI info.
Definition: parallel.h:50
~Parallel()
Definition: parallel.h:131
bool IamMaster() const
Returns true if this process is the master process.
Definition: parallel.h:149
bool IamGroupMaster() const
Returns true if this process is the master process within a group.
Definition: parallel.h:160
Parallel(int *argc, char ***argv, bool active, int groupsize)
Constructor.
Definition: parallel.h:64
void sum(T *array, std::size_t N, int owner=0) const
Sum arrays to node.
Definition: parallel.h:387
void syncsum_g(T *array, std::size_t N) const
Synchronize across group's processes by summing.
Definition: parallel.h:442
int igroup() const
Returns the rank of process group.
Definition: parallel.h:200
void syncsum(T *array, std::size_t N) const
Synchronize across processes by summing.
Definition: parallel.h:415
void sync_m(T *array, std::size_t chunksize, std::size_t Nchunk) const
Definition: parallel.h:364