249 lines
7.5 KiB
C++
249 lines
7.5 KiB
C++
|
|
// ParLoop.cpp: implementation of the LoopLS class.
|
|||
|
|
//
|
|||
|
|
//////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
#include "ParLoop.h"
|
|||
|
|
extern int mode;
|
|||
|
|
using namespace std;
|
|||
|
|
|
|||
|
|
extern ofstream prot;
|
|||
|
|
|
|||
|
|
ParLoop::ParLoop(long ARank)
|
|||
|
|
{
|
|||
|
|
Rank = ARank;
|
|||
|
|
AlignRule = vector<AlignAxis>(0);
|
|||
|
|
LowerIndex = vector<long>(Rank);
|
|||
|
|
HigherIndex = vector<long>(Rank);
|
|||
|
|
LoopStep = vector<long>(Rank);
|
|||
|
|
Invers = vector<long>(Rank);
|
|||
|
|
AM_Dis = 0;
|
|||
|
|
//====
|
|||
|
|
AcrossFlag=0;
|
|||
|
|
AcrossCost=0;
|
|||
|
|
//=***
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ParLoop::~ParLoop()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//====
|
|||
|
|
void ParLoop::Across(CommCost *BoundCost,int type_size)
|
|||
|
|
{ AcrossFlag=type_size;
|
|||
|
|
AcrossCost=BoundCost;
|
|||
|
|
}
|
|||
|
|
//=***
|
|||
|
|
|
|||
|
|
|
|||
|
|
long ParLoop::GetLoopSize()
|
|||
|
|
{ int i;
|
|||
|
|
long size=1;
|
|||
|
|
for(i=0;i<Rank;i++)
|
|||
|
|
size=size*GetSize(i);
|
|||
|
|
return size;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
long ParLoop::GetSize(long plDim)
|
|||
|
|
{ if(plDim<Rank)
|
|||
|
|
return (HigherIndex[plDim] - LowerIndex[plDim] + LoopStep[plDim])/LoopStep[plDim];
|
|||
|
|
return 0;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
void ParLoop::SaveLoopParams(const vector<long>& AInInitIndex,
|
|||
|
|
const vector<long>& AInLastIndex, const vector<long>& AInLoopStep)
|
|||
|
|
{
|
|||
|
|
int i; long lv;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
LowerIndex.clear();
|
|||
|
|
HigherIndex.clear();
|
|||
|
|
LoopStep.clear();
|
|||
|
|
Invers.clear();
|
|||
|
|
for (i = 0; i < Rank; i++)
|
|||
|
|
{
|
|||
|
|
if(AInLoopStep[i]>=0) {
|
|||
|
|
LowerIndex.push_back(AInInitIndex[i]);
|
|||
|
|
HigherIndex.push_back(AInLastIndex[i]);
|
|||
|
|
LoopStep.push_back(AInLoopStep[i]);
|
|||
|
|
Invers.push_back(0);
|
|||
|
|
} else {
|
|||
|
|
lv=(AInInitIndex[i]-AInLastIndex[i]) % AInLoopStep[i];
|
|||
|
|
if(lv)
|
|||
|
|
LowerIndex.push_back((AInLastIndex[i]+AInLoopStep[i]-lv));
|
|||
|
|
else
|
|||
|
|
LowerIndex.push_back(AInLastIndex[i]);
|
|||
|
|
HigherIndex.push_back(AInInitIndex[i]);
|
|||
|
|
LoopStep.push_back(-AInLoopStep[i]);
|
|||
|
|
Invers.push_back(1);
|
|||
|
|
}
|
|||
|
|
if (mode) printf("Save %d %d %d\n",LowerIndex[i],HigherIndex[i],LoopStep[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ParLoop::PrepareAlign(long& TempRank, const vector<long>& AAxisArray,
|
|||
|
|
const vector<long>& ACoeffArray, const vector<long>& AConstArray,
|
|||
|
|
vector<AlignAxis>& IniRule)
|
|||
|
|
{
|
|||
|
|
int i;
|
|||
|
|
long IRSize = Rank + TempRank;
|
|||
|
|
|
|||
|
|
IniRule.reserve(IRSize);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (i = 0; i < Rank; i++)
|
|||
|
|
IniRule.push_back(AlignAxis(align_COLLAPSE, i+1, 0));
|
|||
|
|
for (i = Rank; i < IRSize; i++)
|
|||
|
|
IniRule.push_back(AlignAxis(align_NORMTAXIS, 0, i-Rank+1));
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DistRule <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (i = 0; i < TempRank; i++)
|
|||
|
|
{
|
|||
|
|
// prot << "i=" << i << ", AAxisArray[i]=" << AAxisArray[i] << endl;
|
|||
|
|
|
|||
|
|
if (mode)
|
|||
|
|
printf("Rank=%d IRSize=%d i= %d AAxisArray[i]=%d \n",Rank, IRSize, i, AAxisArray[i]);
|
|||
|
|
|
|||
|
|
if (AAxisArray[i] == -1)
|
|||
|
|
IniRule[i+Rank] = AlignAxis(align_REPLICATE, 0, i+1);
|
|||
|
|
else if (ACoeffArray[i] == 0)
|
|||
|
|
IniRule[i+Rank] = AlignAxis(align_CONSTANT, 0, i+1, 0, AConstArray[i]);
|
|||
|
|
else {
|
|||
|
|
IniRule[i+Rank] = AlignAxis(align_NORMTAXIS, AAxisArray[i], i+1, ACoeffArray[i],
|
|||
|
|
AConstArray[i]+ACoeffArray[i]*LowerIndex[AAxisArray[i]-1]);
|
|||
|
|
IniRule[AAxisArray[i]-1] = AlignAxis(align_NORMAL, AAxisArray[i], i+1, ACoeffArray[i],
|
|||
|
|
AConstArray[i]+ACoeffArray[i]*LowerIndex[AAxisArray[i]-1]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ParLoop::MapPL(AMView *APattern, const vector<long>& AAxisArray,
|
|||
|
|
const vector<long>& ACoeffArray, const vector<long>& AConstArray,
|
|||
|
|
const vector<long>& AInInitIndex, const vector<long>& AInLastIndex,
|
|||
|
|
const vector<long>& AInLoopStep)
|
|||
|
|
{
|
|||
|
|
if (!APattern->IsDistribute()) {
|
|||
|
|
prot << "Wrong call MapPL" << endl;
|
|||
|
|
abort();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
long TempRank = APattern->Rank();
|
|||
|
|
vector<AlignAxis> IniRule;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>/<2F>, <20><> <20>-<2D><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
AM_Dis = APattern;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SaveLoopParams(AInInitIndex, AInLastIndex, AInLoopStep);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AlignRule
|
|||
|
|
PrepareAlign(TempRank, AAxisArray, ACoeffArray, AConstArray, IniRule);
|
|||
|
|
AlignRule = IniRule;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ParLoop::MapPL(DArray *APattern, const vector<long>& AAxisArray,
|
|||
|
|
const vector<long>& ACoeffArray, const vector<long>& AConstArray,
|
|||
|
|
const vector<long>& AInInitIndex, const vector<long>& AInLastIndex,
|
|||
|
|
const vector<long>& AInLoopStep)
|
|||
|
|
{
|
|||
|
|
if (!APattern->IsAlign()) {
|
|||
|
|
prot << "Wrong call MapPL" << endl;
|
|||
|
|
abort();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
long TempRank = APattern->Rank();
|
|||
|
|
long ALSize;
|
|||
|
|
int i;
|
|||
|
|
vector<AlignAxis> TAlign,
|
|||
|
|
IniRule;
|
|||
|
|
AlignAxis aAl, tAl;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>/<2F>, <20><> <20>-<2D><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
AM_Dis = APattern->AM_Dis;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SaveLoopParams(AInInitIndex,AInLastIndex,AInLoopStep);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AlignRule
|
|||
|
|
PrepareAlign(TempRank, AAxisArray, ACoeffArray, AConstArray, IniRule);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ALSize = Rank + AM_Dis->Rank();
|
|||
|
|
TAlign = APattern->AlignRule;
|
|||
|
|
AlignRule = vector<AlignAxis>(ALSize);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. 2-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
for (i = 0; i < AM_Dis->Rank(); i++)
|
|||
|
|
AlignRule[i+Rank]=TAlign[i+TempRank];
|
|||
|
|
|
|||
|
|
/* LU deb
|
|||
|
|
printf("rank=%d tempRank=%d\n",Rank,TempRank);
|
|||
|
|
|
|||
|
|
for(i=0;i<AlignRule.size();i++)
|
|||
|
|
printf("map %d %d %d %d ",AlignRule[i].A, AlignRule[i].B, AlignRule[i].Axis, AlignRule[i].TAxis);
|
|||
|
|
|
|||
|
|
printf("\n");
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
for (i = 0; i < Rank; i++)
|
|||
|
|
{ aAl = IniRule[i];
|
|||
|
|
if (aAl.Attr == align_NORMAL)
|
|||
|
|
{ tAl = TAlign[aAl.TAxis - 1];
|
|||
|
|
switch (tAl.Attr)
|
|||
|
|
{ case align_NORMAL : aAl.TAxis = tAl.TAxis;
|
|||
|
|
aAl.A *= tAl.A;
|
|||
|
|
aAl.B = aAl.B * tAl.A + tAl.B;
|
|||
|
|
AlignRule[i] = aAl;
|
|||
|
|
AlignRule[Rank+aAl.TAxis-1].Axis = i+1;
|
|||
|
|
AlignRule[Rank+aAl.TAxis-1].A = aAl.A;
|
|||
|
|
AlignRule[Rank+aAl.TAxis-1].B = aAl.B;
|
|||
|
|
break;
|
|||
|
|
case align_COLLAPSE : aAl.TAxis = 0;
|
|||
|
|
aAl.Attr = align_COLLAPSE;
|
|||
|
|
AlignRule[i] = aAl;
|
|||
|
|
break;
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/* LU deb
|
|||
|
|
for(i=0;i<AlignRule.size();i++)
|
|||
|
|
printf("map %d %d %d %d ",AlignRule[i].A, AlignRule[i].B, AlignRule[i].Axis, AlignRule[i].TAxis);
|
|||
|
|
|
|||
|
|
printf("\n");
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
for (i = 0; i < TempRank; i++)
|
|||
|
|
{ aAl = IniRule[i+Rank];
|
|||
|
|
switch (aAl.Attr)
|
|||
|
|
{ case align_CONSTANT : tAl = TAlign[aAl.TAxis-1];
|
|||
|
|
if (tAl.Attr == align_NORMAL)
|
|||
|
|
{ aAl.TAxis = tAl.TAxis;
|
|||
|
|
aAl.B = tAl.A * aAl.B + tAl.B;
|
|||
|
|
AlignRule[Rank+tAl.TAxis-1] = aAl;
|
|||
|
|
};
|
|||
|
|
break;
|
|||
|
|
case align_REPLICATE : tAl = TAlign[aAl.TAxis-1];
|
|||
|
|
if (tAl.Attr == align_NORMAL)
|
|||
|
|
{ aAl.Attr = align_BOUNDREPL;
|
|||
|
|
aAl.TAxis = tAl.TAxis;
|
|||
|
|
aAl.A = tAl.A;
|
|||
|
|
aAl.B = tAl.B;
|
|||
|
|
aAl.Bound = APattern->GetSize(tAl.TAxis);
|
|||
|
|
AlignRule[Rank+tAl.TAxis-1] = aAl;
|
|||
|
|
};
|
|||
|
|
break;
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/* LU deb
|
|||
|
|
for(i=0;i<AlignRule.size();i++)
|
|||
|
|
printf("map %d %d %d %d ",AlignRule[i].A, AlignRule[i].B, AlignRule[i].Axis, AlignRule[i].TAxis);
|
|||
|
|
|
|||
|
|
printf("\n");
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|