IPCC  1.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
KNMPIManager.h
Go to the documentation of this file.
1 
7 #pragma once
8 
9 #include "KNMatrixOperation.h"
10 #include "KNLanczosMethod.h"
11 #include "KNTimeMeasurement.h"
12 #include "KNCommandFileParser.h"
13 #include <mpi.h>
14 
22 {
27  typedef struct{
28  double fReal;
29  double fImginary;
31 public:
32  CKNMPIManager();
33  ~CKNMPIManager();
34 
35  static bool InitLevel(int nMPILevel, int nFindingDegeneratedEVCount);
36  static bool CheckDeflationNodeCount(int nNeedNodeCount);
37  static void SetMPIEnviroment(int nRank, int nTotalNode);
38  static void LoadBlancingForLanczos(int nRowCount);
39  static void LoadBlancing(int nElementCount);
40  static int GetCurrentLoadBalanceCount();
41  static int GetLoadBalanceCount(int nRank);
42  static int GetCurrentRank() { return m_nCurrentRank;};
43  static int GetCurrentRank(MPI_Comm comm);
44  static int GetTotalNodeCount() { return m_nTotalNode; };
45  static bool IsRootRank();
46  static bool IsRootRank(MPI_Comm comm);
47  static bool IsInMPIRoutine(){ return m_bStartMPI; };
48  static void BroadcastVector(CKNMatrixOperation::CKNVector *pVector);
49  static void BroadcastBool(bool *boolValue, int nRootRank = 0);
50  static void BroadcastDouble(double *pValue, unsigned int nSize, int nRootRank = 0, MPI_Comm comm = MPI_COMM_NULL);
51  static void BroadcastInt(int *pValue, unsigned int nSize, int nRootRank = 0, MPI_Comm comm = MPI_COMM_NULL);
52  static void BroadcastLanczosResult(CKNLanczosMethod::LPEIGENVALUE_RESULT lpResult, int nIterationCount);
53  static void SplitVector(CKNMatrixOperation::CKNVector *pVector, int nRootRank);
54  static void MergeVector(CKNMatrixOperation::CKNVector *pVector, CKNMatrixOperation::CKNVector *pResultVector, unsigned int nMergeSize);
55  static void MergeVectorOptimal(CKNMatrixOperation::CKNVector *pSrcVector, CKNMatrixOperation::CKNVector *pResultVector, unsigned int nMergeSize, double fFirstIndex);
56  static void MergeVectorEx_Optimal(CKNMatrixOperation::CKNVector *pVector, CKNMatrixOperation::CKNVector *pResultVector, unsigned int nMergeSize, double fFirstIndex, unsigned int nSizeFromPrevRank, unsigned int nSizeFromNextRank, unsigned int nSizetoPrevRank, unsigned int nSizetoNextRank, unsigned int*);
59  static double AllReduceDouble(double fNumber);
60  static int GetRootRank(){ return 0;};
61  static void FinalizeManager();
62  static void InitCommunicationBufferMetric();
63  static void SendDoubleBufferSync(int nTargetRank, double *pBuffer, int nSize, MPI_Request *req, MPI_Comm commWorld = MPI_COMM_NULL);
64  static void WaitSendDoubleBufferSync(MPI_Request *req);
65  static void ReceiveDoubleBufferSync(int nSourceRank, double *pBuffer, int nSize, MPI_Request *req, MPI_Comm commWorld = MPI_COMM_NULL);
66  static void WaitReceiveDoubleBufferAsync(MPI_Request *req);
67  static MPI_Comm GetMPIComm(){ return m_mpiCommIndex; };
68  static bool IsMultiLevelMPI(){ return m_bMultiLevel; };
69  static void BarrierAllComm();
70  static void Barrier(){ MPI_Barrier(m_mpiCommIndex); };
71  static bool IsLanczosComputeRoot(){ return IsRootRank(m_mpiCommIndex);};
72  static bool IsDeflationRoot(){ return IsRootRank(m_deflationComm); };
73  static int* GetEigenvalueCountFromDeflationGroup(int nDeflationGroupCount, int nLocalEVCount);
74  static void GatherVDouble(int nSourceCount, double *pReceiveBuffer, int *pSourceCount, double *pSendBuffer, int nSendCount, MPI_Comm comm = MPI_COMM_NULL);
75  static void GatherVInt(int nSourceCount, int *pReceiveBuffer, int *pSourceCount, int *pSendBuffer, int nSendCount, MPI_Comm comm = MPI_COMM_NULL);
76  static void GatherEVFromDeflationGroup(int nSourceCount, double *pReceiveBuffer, int *pSourceCount, double *pSendBuffer, int nSendCount){ GatherVDouble(nSourceCount, pReceiveBuffer, pSourceCount, pSendBuffer, nSendCount, m_deflationComm); };
77  static void GatherEVIterationFromDeflationGroup(int nSourceCount, int *pReceiveBuffer, int *pSourceCount, int *pSendBuffer, int nSendCount){ GatherVInt(nSourceCount, pReceiveBuffer, pSourceCount, pSendBuffer, nSendCount, m_deflationComm); };
78  static void ExchangeCommand(double *pfCommand, MPI_Comm comm);
79  static MPI_Comm GetLanczosComputComm(){ return m_mpiCommIndex; };
80  static MPI_Comm GetDeflationComm(){ return m_deflationComm; };
81  static void SendVectorSync(int nTargetRank, CKNMatrixOperation::CKNVector *pVector, int nSize, MPI_Request *req, MPI_Comm commWorld = MPI_COMM_NULL);
82  static void ReceiveVectorSync(int nSourceRank, CKNMatrixOperation::CKNVector *pVector, int nSize, MPI_Request *req, MPI_Comm commWorld = MPI_COMM_NULL);
83  static unsigned int GetLanczosGroupIndex(){ return m_nLanczosGroupIndex; };
84 
85 private:
86  static int m_nCurrentRank;
87  static int m_nCommWorldRank;
88  static int m_nTotalNode;
89  static bool m_bStartMPI;
90  static int *m_pLoadBalance;
93  static int *m_pRecvCount;
94  static int *m_pSendCount;
95  static int *m_pBankInfo;
96  static int *m_pDispls;
97  static MPI_Request m_SendDoubleAsyncRequest;
98  static MPI_Request m_ReceiveDoubleAsyncRequest;
99  static unsigned int m_nMPILevel;
100  static bool m_bNeedPostOperation[10];
101  static MPI_Comm m_mpiCommIndex;
102  static MPI_Comm m_deflationComm;
103  static MPI_Group m_lanczosGroup;
104  static MPI_Group m_deflationGroup;
105  static unsigned int m_nLanczosGroupIndex;
106  static bool m_bMultiLevel;
107 };
static void BroadcastBool(bool *boolValue, int nRootRank=0)
Broadcst boolean value.
static int * m_pSendCount
Sending count variable for MPI comminication.
Definition: KNMPIManager.h:94
static void GatherEVFromDeflationGroup(int nSourceCount, double *pReceiveBuffer, int *pSourceCount, double *pSendBuffer, int nSendCount)
Definition: KNMPIManager.h:76
MPI Mangement class.
Definition: KNMPIManager.h:21
static void InitCommunicationBufferMetric()
Initializing MPI Communication buffer for MVMul.
static void BroadcastInt(int *pValue, unsigned int nSize, int nRootRank=0, MPI_Comm comm=MPI_COMM_NULL)
Broadcst boolean value.
static void FinalizeManager()
Get Root rank.
static void Barrier()
Definition: KNMPIManager.h:70
static void SetMPIEnviroment(int nRank, int nTotalNode)
Set MPI Enviroment.
static void WaitSendDoubleBufferSync(MPI_Request *req)
Waiting sending double buffer sync function.
static void AllReduceComlex(CKNComplex *pNumber, CKNTimeMeasurement::MEASUREMENT_INDEX INDEX=CKNTimeMeasurement::COMM)
Do all reduce function with CKNComplex.
static MPI_Comm GetMPIComm()
Definition: KNMPIManager.h:67
static int * GetEigenvalueCountFromDeflationGroup(int nDeflationGroupCount, int nLocalEVCount)
Checking is root rank of Deflation computation.
static void BroadcastLanczosResult(CKNLanczosMethod::LPEIGENVALUE_RESULT lpResult, int nIterationCount)
Broadcast Lanczos result.
static bool InitLevel(int nMPILevel, int nFindingDegeneratedEVCount)
Init MPI Level, most low level is for multi node cacluation for Lanczos.
static unsigned int m_nMPILevel
MPI Level.
Definition: KNMPIManager.h:99
static LPCOMPLEX_NUMBER m_pCommBuffer
Data buffer for MPI Communication.
Definition: KNMPIManager.h:91
Show message and debugging variable.
static void BroadcastDouble(double *pValue, unsigned int nSize, int nRootRank=0, MPI_Comm comm=MPI_COMM_NULL)
Broadcst boolean value.
static MPI_Comm GetLanczosComputComm()
Definition: KNMPIManager.h:79
static void SplitVector(CKNMatrixOperation::CKNVector *pVector, int nRootRank)
Split vector to sub rank.
static int GetCurrentLoadBalanceCount()
Get Current node's rank load balancing number.
This class for parsing input command file.
static unsigned int GetLanczosGroupIndex()
Definition: KNMPIManager.h:83
static void GatherEVIterationFromDeflationGroup(int nSourceCount, int *pReceiveBuffer, int *pSourceCount, int *pSendBuffer, int nSendCount)
Gather eigenvalue from deflation group.
Definition: KNMPIManager.h:77
static void MergeVector(CKNMatrixOperation::CKNVector *pVector, CKNMatrixOperation::CKNVector *pResultVector, unsigned int nMergeSize)
Merge vector to sub rank.
static int GetTotalNodeCount()
Definition: KNMPIManager.h:44
static bool CheckDeflationNodeCount(int nNeedNodeCount)
Checking node counts fix to deflation group.
static void ReceiveVectorSync(int nSourceRank, CKNMatrixOperation::CKNVector *pVector, int nSize, MPI_Request *req, MPI_Comm commWorld=MPI_COMM_NULL)
Receiving Vector with sync.
static int GetLoadBalanceCount(int nRank)
static LPCOMPLEX_NUMBER ConvertVectorToMPIComplexBuffer(CKNMatrixOperation::CKNVector *pVector)
Convert vector class to MPI_COMPLEX array.
static double AllReduceDouble(double fNumber)
Do all reduce function with CKNComplex.
static int GetRootRank()
Definition: KNMPIManager.h:60
static MPI_Comm m_deflationComm
Deflation computing MPI_Comm.
Definition: KNMPIManager.h:102
static int * m_pRecvCount
Reciving count variable for MPI comminication.
Definition: KNMPIManager.h:93
static int m_nCommWorldRank
MPI Rank before split.
Definition: KNMPIManager.h:87
static MPI_Request m_ReceiveDoubleAsyncRequest
Request for receving double.
Definition: KNMPIManager.h:98
static bool IsInMPIRoutine()
Definition: KNMPIManager.h:47
static int m_nTotalNode
Total node count.
Definition: KNMPIManager.h:88
static void LoadBlancing(int nElementCount)
Load blancing for MPI, This function for lanczos solving with geometric constrcution.
static void GatherVInt(int nSourceCount, int *pReceiveBuffer, int *pSourceCount, int *pSendBuffer, int nSendCount, MPI_Comm comm=MPI_COMM_NULL)
GahterV for int wrapping function.
static MPI_Request m_SendDoubleAsyncRequest
Request for sending double.
Definition: KNMPIManager.h:97
CKNMPIManager()
Constructor.
static void SendVectorSync(int nTargetRank, CKNMatrixOperation::CKNVector *pVector, int nSize, MPI_Request *req, MPI_Comm commWorld=MPI_COMM_NULL)
Getting Deflation computing group MPI_Comm.
static int * m_pBankInfo
After MPI Split bank infomation.
Definition: KNMPIManager.h:95
Collection of vector and matrix operation.
static void MergeVectorEx_Optimal(CKNMatrixOperation::CKNVector *pVector, CKNMatrixOperation::CKNVector *pResultVector, unsigned int nMergeSize, double fFirstIndex, unsigned int nSizeFromPrevRank, unsigned int nSizeFromNextRank, unsigned int nSizetoPrevRank, unsigned int nSizetoNextRank, unsigned int *)
Merge vector for 1 layer exchanging.
static bool IsLanczosComputeRoot()
Barrier current deflation group.
Definition: KNMPIManager.h:71
Structure for engienvalue computing.
Time measurement class.
static bool m_bMultiLevel
Flag for Multilevel MPI group.
Definition: KNMPIManager.h:106
~CKNMPIManager()
Destructor.
static LPCOMPLEX_NUMBER m_pConvertingBuffer
Data buffer for Vector converting.
Definition: KNMPIManager.h:92
static int * m_pDispls
Displ for MPI comminication.
Definition: KNMPIManager.h:96
static void ExchangeCommand(double *pfCommand, MPI_Comm comm)
Gather eigenvalue finding iteration number from deflation group.
static int GetCurrentRank()
Definition: KNMPIManager.h:42
static MPI_Comm GetDeflationComm()
Getting Lanczos computing group MPI_Comm.
Definition: KNMPIManager.h:80
static void GatherVDouble(int nSourceCount, double *pReceiveBuffer, int *pSourceCount, double *pSendBuffer, int nSendCount, MPI_Comm comm=MPI_COMM_NULL)
GatherV for double wrapping function.
static void MergeVectorOptimal(CKNMatrixOperation::CKNVector *pSrcVector, CKNMatrixOperation::CKNVector *pResultVector, unsigned int nMergeSize, double fFirstIndex)
Merge vector to sub rank, operated without vector class member function call.
static MPI_Group m_deflationGroup
MPI Group for Deflation computation.
Definition: KNMPIManager.h:104
static int * m_pLoadBalance
Load blancing for MPI Communication.
Definition: KNMPIManager.h:90
This class for complex operation and saving value.
Definition: KNComplex.h:18
static void BarrierAllComm()
Is Multilevel MPI Setting.
static MPI_Comm m_mpiCommIndex
Lanczos Method MPI_Comm.
Definition: KNMPIManager.h:101
static void WaitReceiveDoubleBufferAsync(MPI_Request *req)
Waiting recevinging double buffer sync function.
static void LoadBlancingForLanczos(int nRowCount)
Load blancing for MPI, this function only for lanczos solving without geometric constrcution.
static bool m_bNeedPostOperation[10]
MPI Level.
Definition: KNMPIManager.h:100
static MPI_Group m_lanczosGroup
MPI Group for Lanczos computation.
Definition: KNMPIManager.h:103
static int m_nCurrentRank
Getting Lanczos group index.
Definition: KNMPIManager.h:83
static bool IsRootRank()
Get Total node count.
static bool m_bStartMPI
MPI_Init call or not.
Definition: KNMPIManager.h:89
static void SendDoubleBufferSync(int nTargetRank, double *pBuffer, int nSize, MPI_Request *req, MPI_Comm commWorld=MPI_COMM_NULL)
Sending buffer for double data array with sync.
struct CKNMPIManager::COMPLEX_NUMBER * LPCOMPLEX_NUMBER
static bool IsMultiLevelMPI()
Get MPI_Comm.
Definition: KNMPIManager.h:68
static unsigned int m_nLanczosGroupIndex
MPI Group index for Lanczos group.
Definition: KNMPIManager.h:105
This class for describing vector for Lanczos method.
static void BroadcastVector(CKNMatrixOperation::CKNVector *pVector)
Check this processing running on MPI Enviorment.
static bool IsDeflationRoot()
Checking is root rank of Lanczos computation.
Definition: KNMPIManager.h:72
static void ReceiveDoubleBufferSync(int nSourceRank, double *pBuffer, int nSize, MPI_Request *req, MPI_Comm commWorld=MPI_COMM_NULL)
Receivinging buffer for double data array with sync.