34#ifndef NEKTAR_LIB_UTILITIES_COMM_H
35#define NEKTAR_LIB_UTILITIES_COMM_H
87class Comm :
public std::enable_shared_from_this<Comm>
111 template <
class T>
void Send(
int pProc, T &pData);
112 template <
class T>
void Recv(
int pProc, T &pData);
114 void SendRecv(
int pSendProc, T &pSendData,
int pRecvProc, T &pRecvData);
118 template <
class T>
void AlltoAll(T &pSendData, T &pRecvData);
119 template <
class T1,
class T2>
120 void AlltoAllv(T1 &pSendData, T2 &pSendDataSizeMap, T2 &pSendDataOffsetMap,
121 T1 &pRecvData, T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap);
123 template <
class T>
void AllGather(T &pSendData, T &pRecvData);
132 template <
class T>
void Bcast(T &pData,
int pRoot);
133 template <
class T> T
Gather(
int rootProc, T &val);
134 template <
class T> T
Scatter(
int rootProc, T &pData);
138 template <
class T1,
class T2>
140 T2 &pSendDataOffsetMap, T1 &pRecvData,
141 T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap);
144 void Irsend(
int pProc, T &pData,
int count,
147 void Isend(
int pProc, T &pData,
int count,
150 void SendInit(
int pProc, T &pData,
int count,
153 void Irecv(
int pProc, T &pData,
int count,
156 void RecvInit(
int pProc, T &pData,
int count,
203 virtual void v_AlltoAllv(
const void *sendbuf,
const int *sendcounts,
205 void *recvbuf,
const int *recvcounts,
212 const int *recvcounts,
const int *recvdispls,
218 virtual void v_Gather(
const void *sendbuf,
int sendcount,
221 virtual void v_Scatter(
const void *sendbuf,
int sendcount,
226 const int *sourceweights,
230 const int *senddispls,
232 const int *recvcounts,
233 const int *recvdispls,
388 "AlltoAll only valid with Array or vector arguments.");
392 "Send and Recv arrays have incompatible sizes in AlltoAll");
394 int count = sendSize /
GetSize();
396 "Array size incompatible with size of communicator");
407template <
class T1,
class T2>
409 T2 &pSendDataOffsetMap, T1 &pRecvData,
410 T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
413 "AlltoAllv only valid with Array or vector arguments.");
414 static_assert(std::is_same_v<T2, std::vector<int>> ||
415 std::is_same_v<T2, Array<OneD, int>>,
416 "Alltoallv size and offset maps should be integer vectors.");
432 BOOST_STATIC_ASSERT_MSG(
434 "AllGather only valid with Array or vector arguments.");
437 int recvSize = sendSize;
439 pRecvData = T(recvSize *
GetSize());
455 BOOST_STATIC_ASSERT_MSG(
457 "AllGatherv only valid with Array or vector arguments.");
464 pRecvDataSizeMap.data(), pRecvDataOffsetMap.data(),
475 BOOST_STATIC_ASSERT_MSG(
477 "AllGatherv only valid with Array or vector arguments.");
480 pRecvDataSizeMap.data(), pRecvDataOffsetMap.data(),
501 "Gather only valid with Array or vector arguments.");
502 bool amRoot = (
GetRank() == rootProc);
505 unsigned nOut = amRoot ?
GetSize() * nEl : 0;
521 "Scatter only valid with Array or vector arguments.");
523 bool amRoot = (
GetRank() == rootProc);
526 const void *sendbuf =
554 "DistGraphCreateAdjacent only valid with Array or vector arguments.");
558 "Sources and weights array sizes don't match");
585template <
class T1,
class T2>
587 T2 &pSendDataOffsetMap, T1 &pRecvData,
588 T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
592 "NeighbourAlltoAllv only valid with Array or vector arguments.");
594 std::is_same_v<T2, std::vector<int>> ||
595 std::is_same_v<T2, Array<OneD, int>>,
596 "NeighborAllToAllv size and offset maps should be integer vectors.");
750 return shared_from_this();
766 return shared_from_this();
782 return shared_from_this();
798 return shared_from_this();
#define ASSERTL0(condition, msg)
#define LIB_UTILITIES_EXPORT
static void * GetPointer(T &val)
static int GetCount(const T &val)
Base communications class.
void SendRecv(int pSendProc, T &pSendData, int pRecvProc, T &pRecvData)
virtual void v_NeighborAlltoAllv(const void *sendbuf, const int *sendcounts, const int *senddispls, CommDataType sendtype, void *recvbuf, const int *recvcounts, const int *recvdispls, CommDataType recvtype)=0
void AllGather(T &pSendData, T &pRecvData)
virtual CommSharedPtr v_CommCreateIf(int flag)=0
void AlltoAll(T &pSendData, T &pRecvData)
CommSharedPtr GetSpaceComm()
Retrieve the space communicator to which this process belongs.
void Isend(int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
virtual std::pair< CommSharedPtr, CommSharedPtr > v_SplitCommNode()
CommSharedPtr m_commColumn
Column communicator.
virtual std::tuple< int, int, int > v_GetVersion()=0
virtual void v_DistGraphCreateAdjacent(int indegree, const int *sources, const int *sourceweights, int reorder)=0
virtual void v_AlltoAll(const void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0
CommSharedPtr CommCreateIf(int flag)
If the flag is non-zero create a new communicator.
CommSharedPtr GetColumnComm()
Retrieve the column communicator to which this process belongs.
bool RemoveExistingFiles()
T Gather(int rootProc, T &val)
void Block()
Block execution until all processes reach this point.
CommSharedPtr GetRowComm()
Retrieve the row communicator to which this process belongs.
CommRequestSharedPtr CreateRequest(int num)
NekDouble Wtime()
Return the time in seconds.
void StartAll(const CommRequestSharedPtr &request)
CommSharedPtr m_commRow
Row communicator.
virtual void v_Irsend(const void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
void SplitComm(int pRows, int pColumns, int pTime=0)
Splits this communicator into a grid of size pRows*pColumns and creates row and column communicators....
const std::string & GetType() const
virtual void v_WaitAll(CommRequestSharedPtr request)=0
void Bcast(T &pData, int pRoot)
int GetSize() const
Returns number of processes.
void SendInit(int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
virtual void v_SendRecv(const void *sendbuf, int sendcount, CommDataType sendtype, int dest, void *recvbuf, int recvcount, CommDataType recvtype, int source)=0
virtual void v_Gather(const void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0
virtual void v_AllGatherv(const void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, const int *recvcounts, const int *recvdispls, CommDataType recvtype)=0
virtual void v_SendInit(const void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
virtual void v_Scatter(const void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype, int root)=0
virtual void v_Recv(void *buf, int count, CommDataType dt, int source)=0
virtual int v_GetRank()=0
void AllGatherv(T &pSendData, T &pRecvData, Array< OneD, int > &pRecvDataSizeMap, Array< OneD, int > &pRecvDataOffsetMap)
virtual void v_AlltoAllv(const void *sendbuf, const int *sendcounts, const int *senddispls, CommDataType sendtype, void *recvbuf, const int *recvcounts, const int *recvdispls, CommDataType recvtype)=0
void Send(int pProc, T &pData)
int m_size
Number of processes.
std::string m_type
Type of communication.
void Recv(int pProc, T &pData)
void WaitAll(const CommRequestSharedPtr &request)
virtual void v_AllReduce(void *buf, int count, CommDataType dt, enum ReduceOperator pOp)=0
virtual NekDouble v_Wtime()=0
virtual CommRequestSharedPtr v_CreateRequest(int num)=0
virtual void v_AllGather(const void *sendbuf, int sendcount, CommDataType sendtype, void *recvbuf, int recvcount, CommDataType recvtype)=0
void AllReduce(T &pData, enum ReduceOperator pOp)
std::pair< CommSharedPtr, CommSharedPtr > SplitCommNode()
virtual void v_RecvInit(void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0
void RecvInit(int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
std::tuple< int, int, int > GetVersion()
void Irecv(int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
virtual void v_Isend(const void *buf, int count, CommDataType dt, int dest, CommRequestSharedPtr request, int loc)=0
virtual void v_Finalise()=0
CommSharedPtr GetTimeComm()
Retrieve the time communicator to which this process belongs.
void AlltoAllv(T1 &pSendData, T2 &pSendDataSizeMap, T2 &pSendDataOffsetMap, T1 &pRecvData, T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
virtual void v_AllGatherv(void *recvbuf, const int *recvcounts, const int *recvdispls, CommDataType recvtype)=0
virtual void v_Bcast(void *buffer, int count, CommDataType dt, int root)=0
void DistGraphCreateAdjacent(T &sources, T &sourceweights, int reorder)
virtual void v_StartAll(CommRequestSharedPtr request)=0
void Irsend(int pProc, T &pData, int count, const CommRequestSharedPtr &request, int loc)
T Scatter(int rootProc, T &pData)
virtual bool v_TreatAsRankZero()=0
virtual void v_Irecv(void *buf, int count, CommDataType dt, int source, CommRequestSharedPtr request, int loc)=0
virtual void v_Send(const void *buf, int count, CommDataType dt, int dest)=0
virtual bool v_IsSerial()=0
CommSharedPtr m_commSpace
void NeighborAlltoAllv(T1 &pSendData, T2 &pSendDataSizeMap, T2 &pSendDataOffsetMap, T1 &pRecvData, T2 &pRecvDataSizeMap, T2 &pRecvDataOffsetMap)
virtual void v_SplitComm(int pRows, int pColumns, int pTime)=0
Class for communicator request type.
virtual ~CommRequest()=default
Default destructor.
CommRequest()=default
Default constructor.
Provides a generic Factory class.
LibUtilities::NekFactory< std::string, Comm, int, char ** > CommFactory
Datatype of the NekFactory used to instantiate classes derived from the EquationSystem class.
const char *const ReduceOperatorMap[]
unsigned int CommDataType
std::shared_ptr< CommRequest > CommRequestSharedPtr
CommFactory & GetCommFactory()
ReduceOperator
Type of operation to perform in AllReduce.
std::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.