moved
This commit is contained in:
135
Sapfor/_src/Predictor/Lib/BGroup.cpp
Normal file
135
Sapfor/_src/Predictor/Lib/BGroup.cpp
Normal file
@@ -0,0 +1,135 @@
|
||||
// BGroup.cpp: implementation of the BoundGroup class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
#include <iostream>
|
||||
#include "BGroup.h"
|
||||
|
||||
#include "../../Utils/utils.h"
|
||||
#include "../../Utils/errors.h"
|
||||
|
||||
using namespace std;
|
||||
extern ofstream prot;
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
BoundGroup::BoundGroup()
|
||||
{
|
||||
amPtr = 0;
|
||||
}
|
||||
|
||||
BoundGroup::~BoundGroup()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void BoundGroup::AddBound(DArray *ADArray, const vector<long>& BLeftBSizeArray,
|
||||
const vector<long>& BRightBSizeArray, long ACornerSign)
|
||||
{
|
||||
long i,
|
||||
proc,
|
||||
vmDim,
|
||||
arrDim;
|
||||
int dir,
|
||||
count = 0;
|
||||
bool IsCorner = false;
|
||||
Block b;
|
||||
|
||||
// vector<DimBound> dimInfo;
|
||||
long daRank = ADArray->Rank();
|
||||
vector<long> ALeftBSizeArray(BLeftBSizeArray);
|
||||
vector<long> ARightBSizeArray(BRightBSizeArray);
|
||||
|
||||
|
||||
for (i = 0; i < daRank; i++) {
|
||||
if (ALeftBSizeArray[i] == -1)
|
||||
ALeftBSizeArray[i] = ADArray->LowShdWidthArray[i];
|
||||
if (ARightBSizeArray[i] == -1)
|
||||
ARightBSizeArray[i] = ADArray->HiShdWidthArray[i];
|
||||
}
|
||||
|
||||
if (!amPtr)
|
||||
amPtr = ADArray->AM_Dis;
|
||||
else if (amPtr != ADArray->AM_Dis) {
|
||||
// arrays is align on different AMView
|
||||
prot << "Wrong call AddBound: arrays is align on different AMView" << endl;
|
||||
__spf_print(1, "Wrong call AddBound: arrays is align on different AMView\n");
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
}
|
||||
|
||||
#ifdef P_DEBUG
|
||||
for (i = 0; i < daRank; i++) {
|
||||
vmDim = ADArray->GetMapDim(i+1, dir);
|
||||
prot << "arDim=" << i+1
|
||||
<< ", vmDim=" << vmDim
|
||||
<< ", Left=" << ALeftBSizeArray[i]
|
||||
<< ", Right=" << ARightBSizeArray[i]
|
||||
<<", dir =" << dir << endl;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
if (boundCost.transfer.size() == 0)
|
||||
boundCost = CommCost(ADArray->AM_Dis->VM_Dis);
|
||||
|
||||
if (ADArray->Repl)
|
||||
return;
|
||||
|
||||
if (!ADArray->IsAlign()) {
|
||||
// Array is'n align on any AMView
|
||||
prot << "Wrong call AddBound: Array is'n align on any AMView" << endl;
|
||||
__spf_print(1, "Wrong call AddBound: Array is'n align on any AMView\n");
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
}
|
||||
|
||||
for (i = 0; i < daRank; i++) {
|
||||
if (ALeftBSizeArray[i] < 0 || ARightBSizeArray[i] < 0) {
|
||||
prot << "Wrong call AddBound" << endl;
|
||||
__spf_print(1, "Wrong call AddBound ALeftBSizeArray[i]=%d ARightBSizeArray[i]=%d\n", ALeftBSizeArray[i], ARightBSizeArray[i]);
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
for (proc = 0; proc < amPtr->VM_Dis->GetLSize(); proc++) {
|
||||
//grig b = Block(ADArray, proc);
|
||||
b = Block(ADArray, proc,1);
|
||||
|
||||
// prot << "proc=" << proc << ", empty=" << b.empty() << ", IsBoundIn=" << b.IsBoundIn(ALeftBSizeArray, ARightBSizeArray) << endl;
|
||||
if (!b.empty() && !b.IsBoundIn(ALeftBSizeArray, ARightBSizeArray)) {
|
||||
prot << "Fatal error: Local array size is less then shadow width." << endl;
|
||||
__spf_print(1, "Fatal error: Local array size is less then shadow width.");
|
||||
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
for (arrDim = 1; arrDim <= daRank; arrDim++)
|
||||
{
|
||||
vmDim = ADArray->GetMapDim(arrDim, dir);
|
||||
if (vmDim >= 0 && //====// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ">" <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
(ALeftBSizeArray[arrDim-1] >= 0 || ARightBSizeArray[arrDim-1] >= 0)) { //====// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ">" <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
dimInfo.push_back(
|
||||
DimBound(arrDim, vmDim, dir, ALeftBSizeArray[arrDim-1], ARightBSizeArray[arrDim-1])
|
||||
);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (ACornerSign == 1 && count > 1)
|
||||
IsCorner = true;
|
||||
|
||||
boundCost.BoundUpdate(ADArray, dimInfo, IsCorner);
|
||||
}
|
||||
|
||||
double BoundGroup::StartB()
|
||||
{
|
||||
return boundCost.GetCost();
|
||||
}
|
||||
|
||||
//====
|
||||
CommCost* BoundGroup::GetBoundCost()
|
||||
{ return &boundCost;
|
||||
}
|
||||
//=***
|
||||
Reference in New Issue
Block a user