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

Constructor & Destructor Documentation

◆ CommMpi() [1/2]

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

Definition at line 50 of file CommMpi.cpp.

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

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 ( )
override

Definition at line 95 of file CommMpi.cpp.

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

References m_comm.

◆ CommMpi() [2/2]

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

Definition at line 83 of file CommMpi.cpp.

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

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 93 of file CommMpi.h.

94 {
96 }
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 108 of file CommMpi.cpp.

109{
110 return m_comm;
111}

References m_comm.

◆ v_AllGather()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 279 of file CommMpi.cpp.

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

References ASSERTL0, and m_comm.

◆ v_AllGatherv() [1/2]

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

Implements Nektar::LibUtilities::Comm.

Definition at line 304 of file CommMpi.cpp.

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 291 of file CommMpi.cpp.

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

References ASSERTL0, and m_comm.

◆ v_AllReduce()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 223 of file CommMpi.cpp.

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 253 of file CommMpi.cpp.

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 265 of file CommMpi.cpp.

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

References ASSERTL0, and m_comm.

◆ v_Bcast()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 316 of file CommMpi.cpp.

317{
318 int retval = MPI_Bcast(buffer, count, dt, root, m_comm);
319
320 ASSERTL0(retval == MPI_SUCCESS, "MPI error performing Bcast-v.");
321}
array buffer
Definition: GsLib.hpp:81

References ASSERTL0, and m_comm.

◆ v_Block()

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

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)
finalprotectedvirtual

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

Implements Nektar::LibUtilities::Comm.

Definition at line 549 of file CommMpi.cpp.

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

References CommMpi(), and m_comm.

Referenced by v_SplitCommNode().

◆ v_CreateRequest()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 475 of file CommMpi.cpp.

476{
477 return std::shared_ptr<CommRequest>(new CommRequestMpi(num));
478}

◆ v_DistGraphCreateAdjacent()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 352 of file CommMpi.cpp.

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

References ASSERTL0, and m_comm.

◆ v_Finalise()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 116 of file CommMpi.cpp.

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 326 of file CommMpi.cpp.

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

References ASSERTL0, and m_comm.

◆ v_GetRank()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 132 of file CommMpi.cpp.

133{
134 return m_rank;
135}

References m_rank.

◆ v_GetVersion()

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 426 of file CommMpi.cpp.

428{
430 std::static_pointer_cast<CommRequestMpi>(request);
431 MPI_Irecv(buf, count, dt, source, 0, m_comm, req->GetRequest(loc));
432}
std::shared_ptr< CommRequestMpi > CommRequestMpiSharedPtr
Definition: CommMpi.h:86

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 393 of file CommMpi.cpp.

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 404 of file CommMpi.cpp.

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

References CG_Iterations::loc, and m_comm.

◆ v_IsSerial()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 148 of file CommMpi.cpp.

149{
150 return m_size == 1;
151}

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 372 of file CommMpi.cpp.

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

References ASSERTL0, and m_comm.

◆ v_Recv()

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

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}

References m_comm.

◆ v_RecvInit()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 437 of file CommMpi.cpp.

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 339 of file CommMpi.cpp.

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

References ASSERTL0, and m_comm.

◆ v_Send()

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 415 of file CommMpi.cpp.

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

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 
)
finalprotectedvirtual

Implements Nektar::LibUtilities::Comm.

Definition at line 208 of file CommMpi.cpp.

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

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

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

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 ( )
finalprotectedvirtual

Reimplemented from Nektar::LibUtilities::Comm.

Definition at line 572 of file CommMpi.cpp.

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

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

◆ v_StartAll()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 448 of file CommMpi.cpp.

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

◆ v_TreatAsRankZero()

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

Implements Nektar::LibUtilities::Comm.

Definition at line 140 of file CommMpi.cpp.

141{
142 return m_rank == 0;
143}

References m_rank.

◆ v_WaitAll()

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

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 ( )
finalprotectedvirtual

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:93
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Definition: NekFactory.hpp:197
CommFactory & GetCommFactory()

Name of class.

Definition at line 99 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 109 of file CommMpi.h.

Referenced by CommMpi(), and v_Finalise().

◆ m_rank

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