136 lines
3.9 KiB
C++
136 lines
3.9 KiB
C++
|
|
// 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;
|
|||
|
|
}
|
|||
|
|
//=***
|