This commit is contained in:
2025-03-12 12:37:19 +03:00
parent 1c851baa7e
commit 6a4040be3e
426 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,248 @@
// 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");
*/
};