Nektar++
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Protected Attributes | List of all members
Nektar::LibUtilities::CommMpi Class Reference

A global linear system. More...

#include <CommMpi.h>

Inheritance diagram for Nektar::LibUtilities::CommMpi:
[legend]

Public Member Functions

 CommMpi (int narg, char *arg[])
 
virtual ~CommMpi () override
 
MPI_Comm GetComm ()
 
- Public Member Functions inherited from Nektar::LibUtilities::Comm
 Comm (int narg, char *arg[])
 
virtual ~Comm ()
 
void Finalise ()
 
int GetSize () const
 Returns number of processes. More...
 
int GetRank ()
 
const std::string & GetType () const
 
void Block ()
 Block execution until all processes reach this point. More...
 
NekDouble Wtime ()
 Return the time in seconds. More...
 
template<class T >
void Send (int pProc, T &pData)
 
template<class T >
void Recv (int pProc, T &pData)
 
template<class T >
void SendRecv (int pSendProc, T &pSendData, int pRecvProc, T &pRecvData)
 
template<class T >
void SendRecvReplace (int pSendProc, int pRecvProc, T &pData)
 
template<class T >
void AllReduce (T &pData, enum ReduceOperator pOp)
 
template<class T >
void AlltoAll (T &pSendData, T &pRecvData)
 
template<class T1 , class T2 >
void AlltoAllv (T1 &pSendData, T2 &pSendDataSizeMap, T2 &pSendDataOffsetMap, T1 &pRecvData, T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
 
template<class T >
void AllGather (T &pSendData, T &pRecvData)
 
template<class T >
void AllGatherv (T &pSendData, T &pRecvData, Array< OneD, int > &pRecvDataSizeMap, Array< OneD, int > &pRecvDataOffsetMap)
 
template<class T >
void AllGatherv (T &pRecvData, Array< OneD, int > &pRecvDataSizeMap, Array< OneD, int > &pRecvDataOffsetMap)
 
template<class T >
void Bcast (T &pData, int pRoot)
 
template<class T >
void Exscan (T &pData, enum ReduceOperator pOp, T &ans)
 
template<class T >
Gather (int rootProc, T &val)
 
template<class T >
Scatter (int rootProc, T &pData)
 
template<class T >
void DistGraphCreateAdjacent (T &sources, T &sourceweights, int reorder)
 
template<class T1 , class T2 >
void NeighborAlltoAllv (T1 &pSendData, T2 &pSendDataSizeMap, T2 &pSendDataOffsetMap, T1 &pRecvData, T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
 
template<class T >
void Irsend (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void Isend (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void SendInit (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void Irecv (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
template<class T >
void RecvInit (int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
 
void StartAll (const CommRequestSharedPtr &request)
 
void WaitAll (const CommRequestSharedPtr &request)
 
CommRequestSharedPtr CreateRequest (int num)
 
CommSharedPtr CommCreateIf (int flag)
 If the flag is non-zero create a new communicator. More...
 
void SplitComm (int pRows, int pColumns, int pTime=1)
 Splits this communicator into a grid of size pRows*pColumns and creates row and column communicators. By default the communicator is a single row. More...
 
CommSharedPtr GetRowComm ()
 Retrieve the row communicator to which this process belongs. More...
 
CommSharedPtr GetColumnComm ()
 Retrieve the column communicator to which this process belongs. More...
 
CommSharedPtr GetTimeComm ()
 Retrieve the time communicator to which this process belongs. More...
 
CommSharedPtr GetSpaceComm ()
 Retrieve the space communicator to which this process belongs. More...
 
bool TreatAsRankZero ()
 
bool IsSerial ()
 
std::tuple< int, int, int > GetVersion ()
 
bool RemoveExistingFiles ()
 
std::pair< CommSharedPtr, CommSharedPtrSplitCommNode ()
 

Static Public Member Functions

static CommSharedPtr create (int narg, char *arg[])
 Creates an instance of this class. More...
 

Static Public Attributes

static std::string className
 Name of class. More...
 

Protected Member Functions

 CommMpi (MPI_Comm pComm)
 
virtual void v_Finalise () override
 
virtual int v_GetRank () override final
 
virtual void v_Block () override final
 
virtual double v_Wtime () override final
 
virtual bool v_TreatAsRankZero () override final
 
virtual bool v_IsSerial () override final
 
virtual std::tuple< int, int, int > v_GetVersion () override final
 
virtual void v_Send (void *buf, int count, CommDataType dt, int dest) override final
 
virtual void v_Recv (void *buf, int count, CommDataType dt, int source) override final
 
virtual void v_SendRecv (void *sendbuf, int sendcount, CommDataType sendtype, int dest, void *recvbuf, int recvcount, CommDataType recvtype, int source) override final
 
virtual void v_SendRecvReplace (void *buf, int count, CommDataType dt, int pSendProc, int pRecvProc) override final
 
virtual void v_AllReduce (void *buf, int count, CommDataType dt, enum ReduceOperator pOp) override final
 
virtual void v_AlltoAll (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype) override final
 
virtual void v_AlltoAllv (void *sendbuf, int sendcounts[], int sensdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype) override final
 
virtual void v_AllGather (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype) override final
 
virtual void v_AllGatherv (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype) override final
 
virtual void v_AllGatherv (void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype) override final
 
virtual void v_Bcast (void *buffer, int count, CommDataType dt, int root) override final
 
virtual void v_Exscan (Array< OneD, unsigned long long > &pData, enum ReduceOperator pOp, Array< OneD, unsigned long long > &ans) override final
 
virtual void v_Gather (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root) override final
 
virtual void v_Scatter (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root) override final
 
virtual void v_DistGraphCreateAdjacent (int indegree, const int sources[], const int sourceweights[], int reorder) override final
 
virtual void v_NeighborAlltoAllv (void *sendbuf, int sendcounts[], int sensdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype) override final
 
virtual void v_Irsend (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc) override final
 
virtual void v_Isend (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc) override final
 
virtual void v_SendInit (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc) override final
 
virtual void v_Irecv (void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc) override final
 
virtual void v_RecvInit (void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc) override final
 
virtual void v_StartAll (CommRequestSharedPtr request) override final
 
virtual void v_WaitAll (CommRequestSharedPtr request) override final
 
virtual CommRequestSharedPtr v_CreateRequest (int num) override final
 
virtual void v_SplitComm (int pRows, int pColumns, int pTime) override
 
virtual CommSharedPtr v_CommCreateIf (int flag) override final
 
virtual std::pair< CommSharedPtr, CommSharedPtrv_SplitCommNode () override final
 
- Protected Member Functions inherited from Nektar::LibUtilities::Comm
 Comm ()
 
virtual bool v_RemoveExistingFiles ()
 

Protected Attributes

MPI_Comm m_comm
 
int m_rank {}
 
bool m_controls_mpi
 
- Protected Attributes inherited from Nektar::LibUtilities::Comm
int m_size
 Number of processes. More...
 
std::string m_type
 Type of communication. More...
 
CommSharedPtr m_commRow
 Row communicator. More...
 
CommSharedPtr m_commColumn
 Column communicator. More...
 
CommSharedPtr m_commTime
 
CommSharedPtr m_commSpace
 

Detailed Description

A global linear system.

Definition at line 91 of file CommMpi.h.

Constructor & Destructor Documentation

◆ CommMpi() [1/2]

Nektar::LibUtilities::CommMpi::CommMpi ( int  narg,
char *  arg[] 
)

Definition at line 53 of file CommMpi.cpp.

53  : Comm(narg, arg)
54 {
55  int init = 0;
56  MPI_Initialized(&init);
57 
58  if (!init)
59  {
60  ASSERTL0(MPI_Init(&narg, &arg) == MPI_SUCCESS,
61  "Failed to initialise MPI");
62  // store bool to indicate that Nektar++ is in charge of finalizing MPI.
63  m_controls_mpi = true;
64  }
65  else
66  {
67  // Another code is in charge of finalizing MPI and this is not the
68  // responsiblity of Nektar++
69  m_controls_mpi = false;
70  }
71 
72  m_comm = MPI_COMM_WORLD;
73  MPI_Comm_size(m_comm, &m_size);
74  MPI_Comm_rank(m_comm, &m_rank);
75 
76 #ifdef NEKTAR_USING_PETSC
77  PetscInitializeNoArguments();
78 #endif
79 
80  m_type = "Parallel MPI";
81 }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
int m_size
Number of processes.
Definition: Comm.h:181
std::string m_type
Type of communication.
Definition: Comm.h:182

References ASSERTL0, m_comm, m_controls_mpi, m_rank, Nektar::LibUtilities::Comm::m_size, and Nektar::LibUtilities::Comm::m_type.

Referenced by v_CommCreateIf(), v_SplitComm(), and v_SplitCommNode().

◆ ~CommMpi()

Nektar::LibUtilities::CommMpi::~CommMpi ( )
overridevirtual

Definition at line 98 of file CommMpi.cpp.

99 {
100  int flag;
101  MPI_Finalized(&flag);
102  if (!flag && m_comm != MPI_COMM_WORLD)
103  {
104  MPI_Comm_free(&m_comm);
105  }
106 }

References m_comm.

◆ CommMpi() [2/2]

Nektar::LibUtilities::CommMpi::CommMpi ( MPI_Comm  pComm)
explicitprotected

Definition at line 86 of file CommMpi.cpp.

86  : Comm()
87 {
88  m_comm = pComm;
89  MPI_Comm_size(m_comm, &m_size);
90  MPI_Comm_rank(m_comm, &m_rank);
91 
92  m_type = "Parallel MPI";
93 }

References m_comm, m_rank, Nektar::LibUtilities::Comm::m_size, and Nektar::LibUtilities::Comm::m_type.

Member Function Documentation

◆ create()

static CommSharedPtr Nektar::LibUtilities::CommMpi::create ( int  narg,
char *  arg[] 
)
inlinestatic

Creates an instance of this class.

Definition at line 95 of file CommMpi.h.

96  {
98  }
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

◆ GetComm()

MPI_Comm Nektar::LibUtilities::CommMpi::GetComm ( )

Definition at line 111 of file CommMpi.cpp.

112 {
113  return m_comm;
114 }

References m_comm.

◆ v_AllGather()

void Nektar::LibUtilities::CommMpi::v_AllGather ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 295 of file CommMpi.cpp.

297 {
298  int retval = MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount,
299  recvtype, m_comm);
300 
301  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Allgather.");
302 }

References ASSERTL0, and m_comm.

◆ v_AllGatherv() [1/2]

void Nektar::LibUtilities::CommMpi::v_AllGatherv ( void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 314 of file CommMpi.cpp.

316 {
317  int retval = MPI_Allgatherv(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, recvbuf,
318  recvcounts, rdispls, recvtype, m_comm);
319 
320  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Allgatherv.");
321 }

References ASSERTL0, and m_comm.

◆ v_AllGatherv() [2/2]

void Nektar::LibUtilities::CommMpi::v_AllGatherv ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 304 of file CommMpi.cpp.

307 {
308  int retval = MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf,
309  recvcounts, rdispls, recvtype, m_comm);
310 
311  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Allgather.");
312 }

References ASSERTL0, and m_comm.

◆ v_AllReduce()

void Nektar::LibUtilities::CommMpi::v_AllReduce ( void buf,
int  count,
CommDataType  dt,
enum ReduceOperator  pOp 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 239 of file CommMpi.cpp.

241 {
242  if (GetSize() == 1)
243  {
244  return;
245  }
246 
247  MPI_Op vOp;
248  switch (pOp)
249  {
250  case ReduceMax:
251  vOp = MPI_MAX;
252  break;
253  case ReduceMin:
254  vOp = MPI_MIN;
255  break;
256  case ReduceSum:
257  default:
258  vOp = MPI_SUM;
259  break;
260  }
261  int retval = MPI_Allreduce(MPI_IN_PLACE, buf, count, dt, vOp, m_comm);
262 
263  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing All-reduce.");
264 }
int GetSize() const
Returns number of processes.
Definition: Comm.h:279

References ASSERTL0, Nektar::LibUtilities::Comm::GetSize(), m_comm, Nektar::LibUtilities::ReduceMax, Nektar::LibUtilities::ReduceMin, and Nektar::LibUtilities::ReduceSum.

◆ v_AlltoAll()

void Nektar::LibUtilities::CommMpi::v_AlltoAll ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 269 of file CommMpi.cpp.

271 {
272  int retval = MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount,
273  recvtype, m_comm);
274 
275  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing All-to-All.");
276 }

References ASSERTL0, and m_comm.

◆ v_AlltoAllv()

void Nektar::LibUtilities::CommMpi::v_AlltoAllv ( void sendbuf,
int  sendcounts[],
int  sensdispls[],
CommDataType  sendtype,
void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 281 of file CommMpi.cpp.

285 {
286  int retval = MPI_Alltoallv(sendbuf, sendcounts, sdispls, sendtype, recvbuf,
287  recvcounts, rdispls, recvtype, m_comm);
288 
289  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing All-to-All-v.");
290 }

References ASSERTL0, and m_comm.

◆ v_Bcast()

void Nektar::LibUtilities::CommMpi::v_Bcast ( void buffer,
int  count,
CommDataType  dt,
int  root 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 323 of file CommMpi.cpp.

324 {
325  int retval = MPI_Bcast(buffer, count, dt, root, m_comm);
326  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Bcast-v.");
327 }
array buffer
Definition: GsLib.hpp:83

References ASSERTL0, and m_comm.

◆ v_Block()

void Nektar::LibUtilities::CommMpi::v_Block ( )
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 169 of file CommMpi.cpp.

170 {
171  MPI_Barrier(m_comm);
172 }

References m_comm.

◆ v_CommCreateIf()

CommSharedPtr Nektar::LibUtilities::CommMpi::v_CommCreateIf ( int  flag)
finaloverrideprotectedvirtual

Create a new communicator if the flag is non-zero.

Implements Nektar::LibUtilities::Comm.

Definition at line 546 of file CommMpi.cpp.

547 {
548  MPI_Comm newComm;
549  // color == MPI_UNDEF => not in the new communicator
550  // key == 0 on all => use rank to order them. OpenMPI, at least,
551  // implies this is faster than ordering them ourselves.
552  MPI_Comm_split(m_comm, flag ? flag : MPI_UNDEFINED, 0, &newComm);
553 
554  if (flag == 0)
555  {
556  // flag == 0 => get back MPI_COMM_NULL, return a null ptr instead.
557  return std::shared_ptr<Comm>();
558  }
559  else
560  {
561  // Return a real communicator
562  return std::shared_ptr<Comm>(new CommMpi(newComm));
563  }
564 }
CommMpi(int narg, char *arg[])
Definition: CommMpi.cpp:53

References CommMpi(), and m_comm.

Referenced by v_SplitCommNode().

◆ v_CreateRequest()

CommRequestSharedPtr Nektar::LibUtilities::CommMpi::v_CreateRequest ( int  num)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 472 of file CommMpi.cpp.

473 {
474  return std::shared_ptr<CommRequest>(new CommRequestMpi(num));
475 }

◆ v_DistGraphCreateAdjacent()

void Nektar::LibUtilities::CommMpi::v_DistGraphCreateAdjacent ( int  indegree,
const int  sources[],
const int  sourceweights[],
int  reorder 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 375 of file CommMpi.cpp.

377 {
378 #if MPI_VERSION < 3
379  boost::ignore_unused(indegree, sources, sourceweights, reorder);
380  ASSERTL0(false, "MPI_Dist_graph_create_adjacent is not supported in your "
381  "installed MPI version.");
382 #else
383  int retval = MPI_Dist_graph_create_adjacent(
384  m_comm, indegree, sources, sourceweights, indegree, sources,
385  sourceweights, MPI_INFO_NULL, reorder, &m_comm);
386 
387  ASSERTL0(retval == MPI_SUCCESS,
388  "MPI error performing Dist_graph_create_adjacent.")
389 #endif
390 }

References ASSERTL0, and m_comm.

◆ v_Exscan()

void Nektar::LibUtilities::CommMpi::v_Exscan ( Array< OneD, unsigned long long > &  pData,
enum ReduceOperator  pOp,
Array< OneD, unsigned long long > &  ans 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 329 of file CommMpi.cpp.

332 {
333  int n = pData.size();
334  ASSERTL0(n == ans.size(), "Array sizes differ in Exscan");
335 
336  MPI_Op vOp;
337  switch (pOp)
338  {
339  case ReduceMax:
340  vOp = MPI_MAX;
341  break;
342  case ReduceMin:
343  vOp = MPI_MIN;
344  break;
345  case ReduceSum:
346  default:
347  vOp = MPI_SUM;
348  break;
349  }
350 
351  int retval = MPI_Exscan(pData.get(), ans.get(), n, MPI_UNSIGNED_LONG_LONG,
352  vOp, m_comm);
353  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Exscan-v.");
354 }
#define MPI_UNSIGNED_LONG_LONG
Definition: CommDataType.h:97

References ASSERTL0, m_comm, MPI_UNSIGNED_LONG_LONG, Nektar::LibUtilities::ReduceMax, Nektar::LibUtilities::ReduceMin, and Nektar::LibUtilities::ReduceSum.

◆ v_Finalise()

void Nektar::LibUtilities::CommMpi::v_Finalise ( )
overrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Reimplemented in Nektar::LibUtilities::CommCwipi.

Definition at line 119 of file CommMpi.cpp.

120 {
121 #ifdef NEKTAR_USING_PETSC
122  PetscFinalize();
123 #endif
124  int flag;
125  MPI_Finalized(&flag);
126  if ((!flag) && m_controls_mpi)
127  {
128  MPI_Finalize();
129  }
130 }

References m_controls_mpi.

Referenced by Nektar::LibUtilities::CommCwipi::v_Finalise().

◆ v_Gather()

void Nektar::LibUtilities::CommMpi::v_Gather ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype,
int  root 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 356 of file CommMpi.cpp.

359 {
360  int retval = MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount,
361  recvtype, root, m_comm);
362 
363  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Gather.");
364 }

References ASSERTL0, and m_comm.

◆ v_GetRank()

int Nektar::LibUtilities::CommMpi::v_GetRank ( void  )
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 135 of file CommMpi.cpp.

136 {
137  return m_rank;
138 }

References m_rank.

◆ v_GetVersion()

std::tuple< int, int, int > Nektar::LibUtilities::CommMpi::v_GetVersion ( )
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 156 of file CommMpi.cpp.

157 {
158  int version, subversion;
159  int retval = MPI_Get_version(&version, &subversion);
160 
161  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing GetVersion.");
162 
163  return std::make_tuple(version, subversion, 0);
164 }

References ASSERTL0.

◆ v_Irecv()

void Nektar::LibUtilities::CommMpi::v_Irecv ( void buf,
int  count,
CommDataType  dt,
int  source,
CommRequestSharedPtr  request,
int  loc 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 435 of file CommMpi.cpp.

437 {
439  std::static_pointer_cast<CommRequestMpi>(request);
440  MPI_Irecv(buf, count, dt, source, 0, m_comm, req->GetRequest(loc));
441 }
std::shared_ptr< CommRequestMpi > CommRequestMpiSharedPtr
Definition: CommMpi.h:88

References CG_Iterations::loc, and m_comm.

◆ v_Irsend()

void Nektar::LibUtilities::CommMpi::v_Irsend ( void buf,
int  count,
CommDataType  dt,
int  dest,
CommRequestSharedPtr  request,
int  loc 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 411 of file CommMpi.cpp.

413 {
415  std::static_pointer_cast<CommRequestMpi>(request);
416  MPI_Irsend(buf, count, dt, dest, 0, m_comm, req->GetRequest(loc));
417 }

References CG_Iterations::loc, and m_comm.

◆ v_Isend()

void Nektar::LibUtilities::CommMpi::v_Isend ( void buf,
int  count,
CommDataType  dt,
int  dest,
CommRequestSharedPtr  request,
int  loc 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 419 of file CommMpi.cpp.

421 {
423  std::static_pointer_cast<CommRequestMpi>(request);
424  MPI_Isend(buf, count, dt, dest, 0, m_comm, req->GetRequest(loc));
425 }

References CG_Iterations::loc, and m_comm.

◆ v_IsSerial()

bool Nektar::LibUtilities::CommMpi::v_IsSerial ( void  )
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 151 of file CommMpi.cpp.

152 {
153  return m_size == 1;
154 }

References Nektar::LibUtilities::Comm::m_size.

◆ v_NeighborAlltoAllv()

void Nektar::LibUtilities::CommMpi::v_NeighborAlltoAllv ( void sendbuf,
int  sendcounts[],
int  sensdispls[],
CommDataType  sendtype,
void recvbuf,
int  recvcounts[],
int  rdispls[],
CommDataType  recvtype 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 392 of file CommMpi.cpp.

396 {
397 #if MPI_VERSION < 3
398  boost::ignore_unused(sendbuf, sendcounts, sdispls, sendtype, recvbuf,
399  recvcounts, rdispls, recvtype);
400  ASSERTL0(false, "MPI_Neighbor_alltoallv is not supported in your "
401  "installed MPI version.");
402 #else
403  int retval =
404  MPI_Neighbor_alltoallv(sendbuf, sendcounts, sdispls, sendtype, recvbuf,
405  recvcounts, rdispls, recvtype, m_comm);
406 
407  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing NeighborAllToAllV.");
408 #endif
409 }

References ASSERTL0, and m_comm.

◆ v_Recv()

void Nektar::LibUtilities::CommMpi::v_Recv ( void buf,
int  count,
CommDataType  dt,
int  source 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 200 of file CommMpi.cpp.

201 {
202  MPI_Recv(buf, count, dt, source, 0, m_comm, MPI_STATUS_IGNORE);
203  // ASSERTL0(status.MPI_ERROR == MPI_SUCCESS,
204  // "MPI error receiving data.");
205 }

References m_comm.

◆ v_RecvInit()

void Nektar::LibUtilities::CommMpi::v_RecvInit ( void buf,
int  count,
CommDataType  dt,
int  source,
CommRequestSharedPtr  request,
int  loc 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 443 of file CommMpi.cpp.

445 {
447  std::static_pointer_cast<CommRequestMpi>(request);
448  MPI_Recv_init(buf, count, dt, source, 0, m_comm, req->GetRequest(loc));
449 }

References CG_Iterations::loc, and m_comm.

◆ v_Scatter()

void Nektar::LibUtilities::CommMpi::v_Scatter ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
void recvbuf,
int  recvcount,
CommDataType  recvtype,
int  root 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 366 of file CommMpi.cpp.

369 {
370  int retval = MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount,
371  recvtype, root, m_comm);
372  ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Scatter.");
373 }

References ASSERTL0, and m_comm.

◆ v_Send()

void Nektar::LibUtilities::CommMpi::v_Send ( void buf,
int  count,
CommDataType  dt,
int  dest 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 185 of file CommMpi.cpp.

186 {
187  if (MPISYNC)
188  {
189  MPI_Ssend(buf, count, dt, dest, 0, m_comm);
190  }
191  else
192  {
193  MPI_Send(buf, count, dt, dest, 0, m_comm);
194  }
195 }
#define MPISYNC
Definition: CommMpi.h:45

References m_comm, and MPISYNC.

◆ v_SendInit()

void Nektar::LibUtilities::CommMpi::v_SendInit ( void buf,
int  count,
CommDataType  dt,
int  dest,
CommRequestSharedPtr  request,
int  loc 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 427 of file CommMpi.cpp.

429 {
431  std::static_pointer_cast<CommRequestMpi>(request);
432  MPI_Send_init(buf, count, dt, dest, 0, m_comm, req->GetRequest(loc));
433 }

References CG_Iterations::loc, and m_comm.

◆ v_SendRecv()

void Nektar::LibUtilities::CommMpi::v_SendRecv ( void sendbuf,
int  sendcount,
CommDataType  sendtype,
int  dest,
void recvbuf,
int  recvcount,
CommDataType  recvtype,
int  source 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 210 of file CommMpi.cpp.

213 {
214  MPI_Status status;
215  int retval = MPI_Sendrecv(sendbuf, sendcount, sendtype, dest, 0, recvbuf,
216  recvcount, recvtype, source, 0, m_comm, &status);
217 
218  ASSERTL0(retval == MPI_SUCCESS,
219  "MPI error performing send-receive of data.");
220 }

References ASSERTL0, and m_comm.

◆ v_SendRecvReplace()

void Nektar::LibUtilities::CommMpi::v_SendRecvReplace ( void buf,
int  count,
CommDataType  dt,
int  pSendProc,
int  pRecvProc 
)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 225 of file CommMpi.cpp.

227 {
228  MPI_Status status;
229  int retval = MPI_Sendrecv_replace(buf, count, dt, pRecvProc, 0, pSendProc,
230  0, m_comm, &status);
231 
232  ASSERTL0(retval == MPI_SUCCESS,
233  "MPI error performing Send-Receive-Replace of data.");
234 }

References ASSERTL0, and m_comm.

◆ v_SplitComm()

void Nektar::LibUtilities::CommMpi::v_SplitComm ( int  pRows,
int  pColumns,
int  pTime 
)
overrideprotectedvirtual

Processes are considered as a grid of size pRows*pColumns. Comm objects are created corresponding to the rows and columns of this grid. The row and column to which this process belongs is stored in m_commRow and m_commColumn.

Implements Nektar::LibUtilities::Comm.

Definition at line 483 of file CommMpi.cpp.

484 {
485  ASSERTL0(pRows * pColumns * pTime == m_size,
486  "Rows/Columns do not match comm size.");
487 
488  MPI_Comm newComm;
489  MPI_Comm gridComm;
490  if (pTime == 1)
491  {
492  // There is a bug in OpenMPI 3.1.3. This bug cause some cases to fail in
493  // buster-full-build-and-test. Failed cases are:
494  //
495  // IncNavierStokesSolver_ChanFlow_3DH1D_FlowrateExplicit_MVM_par
496  // IncNavierStokesSolver_ChanFlow_3DH1D_FlowrateExplicit_MVM_par_hybrid
497 
498  // See: https://github.com/open-mpi/ompi/issues/6522
499 
500  // Compute row and column in grid.
501  int myCol = m_rank % pColumns;
502  int myRow = (m_rank - myCol) / pColumns;
503 
504  // Split Comm into rows - all processes with same myRow are put in
505  // the same communicator. The rank within this communicator is the
506  // column index.
507  MPI_Comm_split(m_comm, myRow, myCol, &newComm);
508  m_commRow = std::shared_ptr<Comm>(new CommMpi(newComm));
509 
510  // Split Comm into columns - all processes with same myCol are put
511  // in the same communicator. The rank within this communicator is
512  // the row index.
513  MPI_Comm_split(m_comm, myCol, myRow, &newComm);
514  m_commColumn = std::shared_ptr<Comm>(new CommMpi(newComm));
515  }
516  else
517  {
518  constexpr int dims = 3;
519  const int sizes[dims] = {pRows, pColumns, pTime};
520  const int periods[dims] = {0, 0, 0};
521  constexpr int reorder = 1;
522 
523  MPI_Cart_create(m_comm, dims, sizes, periods, reorder, &gridComm);
524 
525  constexpr int keepRow[dims] = {0, 1, 0};
526  MPI_Cart_sub(gridComm, keepRow, &newComm);
527  m_commRow = std::shared_ptr<Comm>(new CommMpi(newComm));
528 
529  constexpr int keepCol[dims] = {1, 0, 0};
530  MPI_Cart_sub(gridComm, keepCol, &newComm);
531  m_commColumn = std::shared_ptr<Comm>(new CommMpi(newComm));
532 
533  constexpr int keepTime[dims] = {0, 0, 1};
534  MPI_Cart_sub(gridComm, keepTime, &newComm);
535  m_commTime = std::shared_ptr<Comm>(new CommMpi(newComm));
536 
537  constexpr int keepSpace[dims] = {1, 1, 0};
538  MPI_Cart_sub(gridComm, keepSpace, &newComm);
539  m_commSpace = std::shared_ptr<Comm>(new CommMpi(newComm));
540  }
541 }
CommSharedPtr m_commColumn
Column communicator.
Definition: Comm.h:184
CommSharedPtr m_commRow
Row communicator.
Definition: Comm.h:183
CommSharedPtr m_commTime
Definition: Comm.h:185
CommSharedPtr m_commSpace
Definition: Comm.h:186

References ASSERTL0, CommMpi(), m_comm, Nektar::LibUtilities::Comm::m_commColumn, Nektar::LibUtilities::Comm::m_commRow, Nektar::LibUtilities::Comm::m_commSpace, Nektar::LibUtilities::Comm::m_commTime, m_rank, and Nektar::LibUtilities::Comm::m_size.

◆ v_SplitCommNode()

std::pair< CommSharedPtr, CommSharedPtr > Nektar::LibUtilities::CommMpi::v_SplitCommNode ( )
finaloverrideprotectedvirtual

Reimplemented from Nektar::LibUtilities::Comm.

Definition at line 566 of file CommMpi.cpp.

567 {
568  std::pair<CommSharedPtr, CommSharedPtr> ret;
569 
570 #if MPI_VERSION < 3
571  ASSERTL0(false, "Not implemented for non-MPI-3 versions.");
572 #else
573  // Create an intra-node communicator.
574  MPI_Comm nodeComm;
575  MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, m_rank,
576  MPI_INFO_NULL, &nodeComm);
577 
578  // For rank 0 of the intra-node communicator, split the main
579  // communicator. Everyone else will get a null communicator.
580  ret.first = std::shared_ptr<Comm>(new CommMpi(nodeComm));
581  ret.second = CommMpi::v_CommCreateIf(ret.first->GetRank() == 0);
582  if (ret.first->GetRank() == 0)
583  {
584  ret.second->SplitComm(1, ret.second->GetSize());
585  }
586 #endif
587 
588  return ret;
589 }
virtual CommSharedPtr v_CommCreateIf(int flag) override final
Definition: CommMpi.cpp:546

References ASSERTL0, CommMpi(), m_rank, and v_CommCreateIf().

◆ v_StartAll()

void Nektar::LibUtilities::CommMpi::v_StartAll ( CommRequestSharedPtr  request)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 451 of file CommMpi.cpp.

452 {
454  std::static_pointer_cast<CommRequestMpi>(request);
455  if (req->GetNumRequest() != 0)
456  {
457  MPI_Startall(req->GetNumRequest(), req->GetRequest(0));
458  }
459 }

◆ v_TreatAsRankZero()

bool Nektar::LibUtilities::CommMpi::v_TreatAsRankZero ( void  )
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 143 of file CommMpi.cpp.

144 {
145  return m_rank == 0;
146 }

References m_rank.

◆ v_WaitAll()

void Nektar::LibUtilities::CommMpi::v_WaitAll ( CommRequestSharedPtr  request)
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 461 of file CommMpi.cpp.

462 {
464  std::static_pointer_cast<CommRequestMpi>(request);
465  if (req->GetNumRequest() != 0)
466  {
467  MPI_Waitall(req->GetNumRequest(), req->GetRequest(0),
468  MPI_STATUSES_IGNORE);
469  }
470 }

◆ v_Wtime()

double Nektar::LibUtilities::CommMpi::v_Wtime ( )
finaloverrideprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 177 of file CommMpi.cpp.

178 {
179  return MPI_Wtime();
180 }

Member Data Documentation

◆ className

std::string Nektar::LibUtilities::CommMpi::className
static
Initial value:
"ParallelMPI", CommMpi::create, "Parallel communication using MPI.")
static CommSharedPtr create(int narg, char *arg[])
Creates an instance of this class.
Definition: CommMpi.h:95
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:198
CommFactory & GetCommFactory()

Name of class.

Definition at line 101 of file CommMpi.h.

◆ m_comm

MPI_Comm Nektar::LibUtilities::CommMpi::m_comm
protected

◆ m_controls_mpi

bool Nektar::LibUtilities::CommMpi::m_controls_mpi
protected

Definition at line 111 of file CommMpi.h.

Referenced by CommMpi(), and v_Finalise().

◆ m_rank

int Nektar::LibUtilities::CommMpi::m_rank {}
protected