54 int nNeedNodeCount = 1;
57 int nLanczosGroupIndex;
58 int *pNewGroupRank = NULL;
60 MPI_Group commWorldGroup;
69 if( nFindingDegeneratedEVCount > 1 )
72 nNeedNodeCount *= nFindingDegeneratedEVCount;
87 pNewGroupRank = (
int*)malloc(
sizeof(
int)*nPerGroupNode);
90 for( i = 0; i < nPerGroupNode ; ++i)
91 pNewGroupRank [i] = nLanczosGroupIndex * nPerGroupNode + i;
93 MPI_Comm_group(MPI_COMM_WORLD,&commWorldGroup);
94 MPI_Group_incl(commWorldGroup,nPerGroupNode,pNewGroupRank ,&
m_lanczosGroup);
102 pNewGroupRank = (
int*)realloc(pNewGroupRank ,
sizeof(
int)*nFindingDegeneratedEVCount);
103 for( i = 0; i < nFindingDegeneratedEVCount ; ++i)
106 MPI_Comm_group(MPI_COMM_WORLD,&commWorldGroup);
107 MPI_Group_incl(commWorldGroup,nFindingDegeneratedEVCount,pNewGroupRank ,&
m_deflationGroup);
156 #ifdef DISABLE_MPI_ROUTINE
174 if ((temp / 10) % i == 0){
175 for (j = 0; j < i; j++){
193 #ifdef DISABLE_MPI_ROUTINE
205 #ifdef DISABLE_MPI_ROUTINE
221 #ifdef DISABLE_MPI_ROUTINE
238 if (MPI_COMM_NULL == comm)
255 MPI_Comm_rank(comm, &rank);
265 #ifdef DISABLE_MPI_ROUTINE
281 #ifdef DISABLE_MPI_ROUTINE
286 double *pBuffer = (
double*)malloc(
sizeof(
double)*nMergeSize);
291 for (i = 0; i < nMergeSize; i++)
297 for (i = 0; i < nMergeSize; i++)
325 mPos[0] = -1; mPos[1] = -1; mPos[2] = -1;
329 long long fCurrentRankPos = fFirstIndex;
332 long long fPrevRankPos = -1, fNextRankPos = -1;
333 double *pSendBuffer = NULL, *pRecvBuffer = NULL;
335 MPI_Status status[2];
338 fPrevRankPos = nMergeSize - nSizeFromPrevRank;
340 fPrevRankPos = fFirstIndex - nSizeFromPrevRank;
347 mPos[0] = (
unsigned int)fPrevRankPos; mPos[1] = (
unsigned int)fCurrentRankPos; mPos[2] = (
unsigned int)fNextRankPos;
357 MPI_Waitall(2, req, status);
360 MPI_Isend(pSendBuffer, nSizetoPrevRank, MPI_DOUBLE, nPrevRank, nPrevRank,
m_mpiCommIndex, &req[1]);
361 MPI_Waitall(2, req, status);
370 MPI_Waitall(2, req, status);
373 MPI_Isend(pSendBuffer, nSizetoPrevRank, MPI_DOUBLE, nPrevRank, nPrevRank,
m_mpiCommIndex, &req[1]);
374 MPI_Waitall(2, req, status);
402 double fCurrentRankPos = fFirstIndex;
403 long long fPrevRankPos = -1, fNextRankPos = -1;
407 double *pSendBuffer = NULL, *pRecvBuffer = NULL;
409 MPI_Status status[2];
428 pRecvBuffer = (
double*)malloc(
sizeof(
double)*nMax*2);
439 MPI_Waitall(2, req, status);
448 MPI_Waitall(2, req, status);
472 int *pSendCounts = NULL, *pDispls = NULL;
474 #ifdef DISABLE_MPI_ROUTINE
501 if (NULL == lpRecvBuffer)
505 MPI_Scatterv(lpSendBuffer, pSendCounts, pDispls, MPI_DOUBLE,
526 #ifdef DISABLE_MPI_ROUTINE
542 #ifdef DISABLE_MPI_ROUTINE
547 if( MPI_COMM_NULL == comm )
550 MPI_Bcast(pValue, nSize, MPI_DOUBLE, nRootRank, comm);
562 #ifdef DISABLE_MPI_ROUTINE
567 if( MPI_COMM_NULL == comm )
570 MPI_Bcast(pValue, nSize, MPI_INT, nRootRank, comm);
580 unsigned int nCastData[4];
583 #ifdef DISABLE_MPI_ROUTINE
627 #ifdef DISABLE_MPI_ROUTINE
631 double fSend[2], fRecv[2];
637 MPI_Allreduce(fSend, fRecv, 2, MPI_DOUBLE, MPI_SUM,
m_mpiCommIndex);
649 #ifdef DISABLE_MPI_ROUTINE
656 MPI_Allreduce(&fNumber, &fRecv, 1, MPI_DOUBLE, MPI_SUM,
m_mpiCommIndex);
670 unsigned int i, nCount;
675 for (i = 0; i < nCount; i++)
686 #ifdef DISABLE_MPI_ROUTINE
745 if( MPI_COMM_NULL == commWorld)
747 MPI_Send(pBuffer, nSize, MPI_DOUBLE, nTargetRank, nTargetRank,
m_mpiCommIndex);
749 if( MPI_SUCCESS != MPI_Send(pBuffer, nSize, MPI_DOUBLE, nTargetRank, nTargetRank, commWorld) )
751 printf(
"Oh my god!\n");
773 if( MPI_COMM_NULL == commWorld)
794 MPI_Barrier(MPI_COMM_WORLD);
804 int *pEVCount = NULL;
807 pEVCount = (
int*)malloc(
sizeof(
int)*nDeflationGroupCount);
809 MPI_Gather(&nLocalEVCount, 1, MPI_INT, pEVCount, 1, MPI_INT, 0,
m_deflationComm);
824 int *pReceiveCount = NULL;
830 pDisp = (
int*)malloc(
sizeof(
int)*nSourceCount);
832 for( i = 1; i < nSourceCount ; ++i)
833 pDisp[i] = pDisp[i-1] + pSourceCount[i-1];
836 if( MPI_COMM_NULL == comm )
837 MPI_Gatherv(pSendBuffer, nSendCount, MPI_DOUBLE, pReceiveBuffer, pSourceCount, pDisp, MPI_DOUBLE, 0,
m_mpiCommIndex);
839 MPI_Gatherv(pSendBuffer, nSendCount, MPI_DOUBLE, pReceiveBuffer, pSourceCount, pDisp, MPI_DOUBLE, 0, comm);
852 void CKNMPIManager::GatherVInt(
int nSourceCount,
int *pReceiveBuffer,
int *pSourceCount,
int *pSendBuffer,
int nSendCount, MPI_Comm comm)
854 int *pReceiveCount = NULL;
860 pDisp = (
int*)malloc(
sizeof(
int)*nSourceCount);
862 for( i = 1; i < nSourceCount ; ++i)
863 pDisp[i] = pDisp[i-1] + pSourceCount[i-1];
866 if( MPI_COMM_NULL == comm )
867 MPI_Gatherv(pSendBuffer, nSendCount, MPI_INT, pReceiveBuffer, pSourceCount, pDisp, MPI_INT, 0,
m_mpiCommIndex);
869 MPI_Gatherv(pSendBuffer, nSendCount, MPI_INT, pReceiveBuffer, pSourceCount, pDisp, MPI_INT, 0, comm);
892 double *pBuffer = NULL;
894 pBuffer = (
double*)malloc(
sizeof(
double)*nSize*2);
912 double *pBuffer = NULL;
914 pBuffer = (
double*)malloc(
sizeof(
double)*nSize*2);
static void BroadcastBool(bool *boolValue, int nRootRank=0)
Broadcst boolean value.
static int * m_pSendCount
Sending count variable for MPI comminication.
void SetSize(unsigned int nSize)
Set Vector elements size.
static void InitCommunicationBufferMetric()
Initializing MPI Communication buffer for MVMul.
double GetImaginaryNumber() const
Get imaginary part.
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 ShowMsg(char *pszBuffer)
Show message.
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 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.
static LPCOMPLEX_NUMBER m_pCommBuffer
Data buffer for MPI Communication.
static void BroadcastDouble(double *pValue, unsigned int nSize, int nRootRank=0, MPI_Comm comm=MPI_COMM_NULL)
Broadcst boolean value.
double GetRealNumber() const
Get real part.
static void SplitVector(CKNMatrixOperation::CKNVector *pVector, int nRootRank)
Split vector to sub rank.
static int GetCurrentLoadBalanceCount()
Get Current node's rank load balancing number.
static void MeasurementEnd(MEASUREMENT_INDEX index)
Measurement end for part.
unsigned int nEigenVectorSize
static void MergeVector(CKNMatrixOperation::CKNVector *pVector, CKNMatrixOperation::CKNVector *pResultVector, unsigned int nMergeSize)
Merge vector to sub rank.
static int GetTotalNodeCount()
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 MPI_Comm m_deflationComm
Deflation computing MPI_Comm.
static int * m_pRecvCount
Reciving count variable for MPI comminication.
static int m_nCommWorldRank
MPI Rank before split.
static MPI_Request m_ReceiveDoubleAsyncRequest
Request for receving double.
static bool IsInMPIRoutine()
static int m_nTotalNode
Total node count.
static void LoadBlancing(int nElementCount)
Load blancing for MPI, This function for lanczos solving with geometric constrcution.
static void SetShow(bool bShow)
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.
CKNMPIManager()
Constructor.
Common definition for Solver.
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.
CKNComplex GetAt(unsigned int nIndex)
Get element value from specific index.
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.
bool Serialize(double *pBuffer, bool bStore)
Serialize vector.
static bool IsLanczosComputeRoot()
Barrier current deflation group.
Structure for engienvalue computing.
unsigned int * pEigenValueFoundIteration
double_vector_t m_vectValueImaginaryBuffer
A member variable for saving none zero elements.
unsigned int nMaxEigenValueFoundIteration
static bool m_bMultiLevel
Flag for Multilevel MPI group.
~CKNMPIManager()
Destructor.
void Finalize()
Free allocated memory for vector elements.
This class includes functions for matrix debugging.
static LPCOMPLEX_NUMBER m_pConvertingBuffer
Data buffer for Vector converting.
static int * m_pDispls
Displ for MPI comminication.
static void ExchangeCommand(double *pfCommand, MPI_Comm comm)
Gather eigenvalue finding iteration number from deflation group.
static int GetCurrentRank()
double_vector_t m_vectValueRealBuffer
A member variable for saving none zero elements.
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.
void SetAt(unsigned int nIndex, CKNComplex value)
Set element value in specific index, Call by value.
static MPI_Group m_deflationGroup
MPI Group for Deflation computation.
unsigned int nEigenValueCount
#define FREE_MEM(pointer)
Macro for memory allocation and assign null value.
unsigned int GetSize()
Return Vector elements size.
unsigned int nEigenValueCountForMemeory
static int * m_pLoadBalance
Load blancing for MPI Communication.
const unsigned long ERROR_MALLOC
Error code that means error occur during memory allocation.
This class for complex operation and saving value.
static void BarrierAllComm()
Is Multilevel MPI Setting.
static MPI_Comm m_mpiCommIndex
Lanczos Method MPI_Comm.
static void MeasurementStart(MEASUREMENT_INDEX index)
Measurement start for part.
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.
static MPI_Group m_lanczosGroup
MPI Group for Lanczos computation.
static int m_nCurrentRank
Getting Lanczos group index.
static bool IsRootRank()
Get Total node count.
static bool m_bStartMPI
MPI_Init call or not.
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.
void SetComplexNumber(double fReal, double fImaginaray)
Set Complex number using real part and imaginary part.
struct CKNMPIManager::COMPLEX_NUMBER * LPCOMPLEX_NUMBER
static unsigned int m_nLanczosGroupIndex
MPI Group index for Lanczos group.
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.
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.