Files
SAPFOR/Sapfor/_src/Predictor/Lib/BGroup.cpp
2025-03-12 12:37:19 +03:00

136 lines
3.9 KiB
C++
Raw Blame History

// 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;
}
//=***