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
 
bool TreatAsRankZero ()
 
bool IsSerial ()
 
std::tuple< int, int, int > GetVersion ()
 
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 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 >
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 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 bool v_TreatAsRankZero () override final
 
virtual bool v_IsSerial () override final
 
virtual std::tuple< int, int, int > v_GetVersion () override final
 
virtual void v_Block () override final
 
virtual double v_Wtime () 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_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_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 void v_Finalise ()=0
 
virtual int v_GetRank ()=0
 
virtual bool v_TreatAsRankZero ()=0
 
virtual bool v_IsSerial ()=0
 
virtual std::tuple< int, int, int > v_GetVersion ()=0
 
virtual void v_Block ()=0
 
virtual NekDouble v_Wtime ()=0
 
virtual void v_Send (void *buf, int count, CommDataType dt, int dest)=0
 
virtual void v_Recv (void *buf, int count, CommDataType dt, int source)=0
 
virtual void v_SendRecv (void *sendbuf, int sendcount, CommDataType sendtype, int dest, void *recvbuf, int recvcount, CommDataType recvtype, int source)=0
 
virtual void v_AllReduce (void *buf, int count, CommDataType dt, enum ReduceOperator pOp)=0
 
virtual void v_AlltoAll (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0
 
virtual void v_AlltoAllv (void *sendbuf, int sendcounts[], int sensdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_AllGather (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0
 
virtual void v_AllGatherv (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_AllGatherv (void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_Bcast (void *buffer, int count, CommDataType dt, int root)=0
 
virtual void v_Gather (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0
 
virtual void v_Scatter (void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0
 
virtual void v_DistGraphCreateAdjacent (int indegree, const int sources[], const int sourceweights[], int reorder)=0
 
virtual void v_NeighborAlltoAllv (void *sendbuf, int sendcounts[], int sdispls[], CommDataType sendtype, void *recvbuf, int recvcounts[], int rdispls[], CommDataType recvtype)=0
 
virtual void v_Irsend (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
 
virtual void v_Isend (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
 
virtual void v_SendInit (void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
 
virtual void v_Irecv (void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0
 
virtual void v_RecvInit (void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0
 
virtual void v_StartAll (CommRequestSharedPtr request)=0
 
virtual void v_WaitAll (CommRequestSharedPtr request)=0
 
virtual CommRequestSharedPtr v_CreateRequest (int num)=0
 
virtual void v_SplitComm (int pRows, int pColumns, int pTime)=0
 
virtual CommSharedPtr v_CommCreateIf (int flag)=0
 
virtual std::pair< CommSharedPtr, CommSharedPtrv_SplitCommNode ()
 

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 52 of file CommMpi.cpp.

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

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 97 of file CommMpi.cpp.

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

References m_comm.

◆ CommMpi() [2/2]

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

Definition at line 85 of file CommMpi.cpp.

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

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 110 of file CommMpi.cpp.

111{
112 return m_comm;
113}

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 281 of file CommMpi.cpp.

283{
284 int retval = MPI_Allgather(sendbuf, sendcount, sendtype, recvbuf, recvcount,
285 recvtype, m_comm);
286
287 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Allgather.");
288}

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 306 of file CommMpi.cpp.

308{
309 int retval = MPI_Allgatherv(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, recvbuf,
310 recvcounts, rdispls, recvtype, m_comm);
311
312 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Allgatherv.");
313}

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 293 of file CommMpi.cpp.

296{
297 int retval = MPI_Allgatherv(sendbuf, sendcount, sendtype, recvbuf,
298 recvcounts, rdispls, recvtype, m_comm);
299
300 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Allgatherv.");
301}

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 225 of file CommMpi.cpp.

227{
228 if (GetSize() == 1)
229 {
230 return;
231 }
232
233 MPI_Op vOp;
234 switch (pOp)
235 {
236 case ReduceMax:
237 vOp = MPI_MAX;
238 break;
239 case ReduceMin:
240 vOp = MPI_MIN;
241 break;
242 case ReduceSum:
243 default:
244 vOp = MPI_SUM;
245 break;
246 }
247 int retval = MPI_Allreduce(MPI_IN_PLACE, buf, count, dt, vOp, m_comm);
248
249 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing All-reduce.");
250}
int GetSize() const
Returns number of processes.
Definition: Comm.h:265

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 255 of file CommMpi.cpp.

257{
258 int retval = MPI_Alltoall(sendbuf, sendcount, sendtype, recvbuf, recvcount,
259 recvtype, m_comm);
260
261 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing All-to-All.");
262}

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 267 of file CommMpi.cpp.

271{
272 int retval = MPI_Alltoallv(sendbuf, sendcounts, sdispls, sendtype, recvbuf,
273 recvcounts, rdispls, recvtype, m_comm);
274
275 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing All-to-All-v.");
276}

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 318 of file CommMpi.cpp.

319{
320 int retval = MPI_Bcast(buffer, count, dt, root, m_comm);
321
322 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Bcast-v.");
323}
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 171 of file CommMpi.cpp.

172{
173 MPI_Barrier(m_comm);
174}

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 553 of file CommMpi.cpp.

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

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 479 of file CommMpi.cpp.

480{
481 return std::shared_ptr<CommRequest>(new CommRequestMpi(num));
482}

◆ 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 354 of file CommMpi.cpp.

356{
357#if MPI_VERSION < 3
358 boost::ignore_unused(indegree, sources, sourceweights, reorder);
359
360 ASSERTL0(false, "MPI_Dist_graph_create_adjacent is not supported in your "
361 "installed MPI version.");
362#else
363 int retval = MPI_Dist_graph_create_adjacent(
364 m_comm, indegree, sources, sourceweights, indegree, sources,
365 sourceweights, MPI_INFO_NULL, reorder, &m_comm);
366
367 ASSERTL0(retval == MPI_SUCCESS,
368 "MPI error performing Dist_graph_create_adjacent.")
369#endif
370}

References ASSERTL0, and m_comm.

◆ v_Finalise()

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

Implements Nektar::LibUtilities::Comm.

Reimplemented in Nektar::LibUtilities::CommCwipi.

Definition at line 118 of file CommMpi.cpp.

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

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 328 of file CommMpi.cpp.

331{
332 int retval = MPI_Gather(sendbuf, sendcount, sendtype, recvbuf, recvcount,
333 recvtype, root, m_comm);
334
335 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Gather.");
336}

References ASSERTL0, and m_comm.

◆ v_GetRank()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 134 of file CommMpi.cpp.

135{
136 return m_rank;
137}

References m_rank.

◆ v_GetVersion()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 158 of file CommMpi.cpp.

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

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 430 of file CommMpi.cpp.

432{
434 std::static_pointer_cast<CommRequestMpi>(request);
435 MPI_Irecv(buf, count, dt, source, 0, m_comm, req->GetRequest(loc));
436}
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 397 of file CommMpi.cpp.

399{
401 std::static_pointer_cast<CommRequestMpi>(request);
402 MPI_Irsend(buf, count, dt, dest, 0, m_comm, req->GetRequest(loc));
403}

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 408 of file CommMpi.cpp.

410{
412 std::static_pointer_cast<CommRequestMpi>(request);
413 MPI_Isend(buf, count, dt, dest, 0, m_comm, req->GetRequest(loc));
414}

References CG_Iterations::loc, and m_comm.

◆ v_IsSerial()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 150 of file CommMpi.cpp.

151{
152 return m_size == 1;
153}

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 375 of file CommMpi.cpp.

379{
380#if MPI_VERSION < 3
381 boost::ignore_unused(sendbuf, sendcounts, sdispls, sendtype, recvbuf,
382 recvcounts, rdispls, recvtype);
383 ASSERTL0(false, "MPI_Neighbor_alltoallv is not supported in your "
384 "installed MPI version.");
385#else
386 int retval =
387 MPI_Neighbor_alltoallv(sendbuf, sendcounts, sdispls, sendtype, recvbuf,
388 recvcounts, rdispls, recvtype, m_comm);
389
390 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing NeighborAllToAllV.");
391#endif
392}

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 202 of file CommMpi.cpp.

203{
204 MPI_Recv(buf, count, dt, source, 0, m_comm, MPI_STATUS_IGNORE);
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 441 of file CommMpi.cpp.

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

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 341 of file CommMpi.cpp.

344{
345 int retval = MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount,
346 recvtype, root, m_comm);
347
348 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Scatter.");
349}

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 187 of file CommMpi.cpp.

188{
189 if (MPISYNC)
190 {
191 MPI_Ssend(buf, count, dt, dest, 0, m_comm);
192 }
193 else
194 {
195 MPI_Send(buf, count, dt, dest, 0, m_comm);
196 }
197}
#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 419 of file CommMpi.cpp.

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

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_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 490 of file CommMpi.cpp.

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

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 576 of file CommMpi.cpp.

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

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 452 of file CommMpi.cpp.

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

◆ v_TreatAsRankZero()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 142 of file CommMpi.cpp.

143{
144 return m_rank == 0;
145}

References m_rank.

◆ v_WaitAll()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 465 of file CommMpi.cpp.

466{
468 std::static_pointer_cast<CommRequestMpi>(request);
469 if (req->GetNumRequest() != 0)
470 {
471 MPI_Waitall(req->GetNumRequest(), req->GetRequest(0),
472 MPI_STATUSES_IGNORE);
473 }
474}

◆ v_Wtime()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 179 of file CommMpi.cpp.

180{
181 return MPI_Wtime();
182}

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