fixed dowhile

This commit is contained in:
ALEXks
2024-02-16 14:06:30 +03:00
parent 05bd8379db
commit 220cd86bf7
8 changed files with 38 additions and 49 deletions

View File

@@ -1095,9 +1095,16 @@ static bool tryToResolveUnmatchedDims(const map<DIST::Array*, vector<bool>> &dim
tmpL = loop->parent;
while (tmpL)
{
if (!tmpL->isFor) // TODO: need to add all inductive variables!
;// return false;
{
SgWhileStmt* dow = isSgWhileStmt(tmpL->loop->GetOriginal());
if (dow->conditional())
{
SgExpression* cond = dow->conditional();
if (cond->lhs() && cond->lhs()->variant() == VAR_REF)
deprecateToMatch.insert(cond->lhs()->symbol()->identifier());
}
}
else
deprecateToMatch.insert(tmpL->loopSymbol);
tmpL = tmpL->parent;
@@ -1802,14 +1809,6 @@ static bool addRedistributionDirs(File* file, const vector<pair<DIST::Array*, co
return needToSkip;
}
uint64_t getTrueRegId(const uint64_t regId, const uint64_t loopRegId)
{
if (mpiProgram)
return loopRegId;
else
return regId;
}
void selectParallelDirectiveForVariant(File* file, ParallelRegion* currParReg,
DIST::GraphCSR<int, double, attrType>& reducedG,
DIST::Arrays<int>& allArrays,
@@ -1826,13 +1825,12 @@ void selectParallelDirectiveForVariant(File* file, ParallelRegion* currParReg,
for (int i = 0; i < loopGraph.size(); ++i)
{
LoopGraph* loop = loopGraph[i];
const uint64_t loopRegId = (uint64_t)loop;
const bool hasDirective = loop->directive;
const bool noLimits = loop->hasLimitsToParallel() == false;
const bool isMyRegion = loop->region == currParReg;
const bool noUserDir = loop->userDvmDirective == NULL;
DIST::Array* sameAlignTemplate = NULL;
const bool sameAligns = loop->isArrayTemplatesTheSame(sameAlignTemplate, getTrueRegId(regionId, loopRegId), arrayLinksByFuncCalls);
const bool sameAligns = loop->isArrayTemplatesTheSame(sameAlignTemplate, regionId, arrayLinksByFuncCalls);
bool freeLoopDistr = true;
if (hasDirective && loop->directive->arrayRef2->IsLoopArray())
@@ -1871,18 +1869,18 @@ void selectParallelDirectiveForVariant(File* file, ParallelRegion* currParReg,
bool topCheck = isOnlyTopPerfect(loop, distribution);
bool needToContinue = false;
if (topCheck && mpiProgram == 0)
if (topCheck)
{
//<Array, linksWithTempl> -> dims not mached
map<DIST::Array*, vector<bool>> dimsNotMatch;
if (!checkCorrectness(*parDirective, distribution, reducedG, allArrays, arrayLinksByFuncCalls, loop->getAllArraysInLoop(), messages, loop->lineNum, dimsNotMatch, getTrueRegId(regionId, loopRegId)))
if (!checkCorrectness(*parDirective, distribution, reducedG, allArrays, arrayLinksByFuncCalls, loop->getAllArraysInLoop(), messages, loop->lineNum, dimsNotMatch, regionId))
{
if (!tryToResolveUnmatchedDims(dimsNotMatch, loop, getTrueRegId(regionId, loopRegId), parDirective, reducedG, allArrays, arrayLinksByFuncCalls, distribution, mapFuncInfo))
needToContinue = addRedistributionDirs(file, distribution, toInsert, loop, mapLoopsInFile, parDirective, getTrueRegId(regionId, loopRegId), messages, arrayLinksByFuncCalls, sameAlignTemplate);
if (!tryToResolveUnmatchedDims(dimsNotMatch, loop, regionId, parDirective, reducedG, allArrays, arrayLinksByFuncCalls, distribution, mapFuncInfo))
needToContinue = addRedistributionDirs(file, distribution, toInsert, loop, mapLoopsInFile, parDirective, regionId, messages, arrayLinksByFuncCalls, sameAlignTemplate);
}
}
else if (mpiProgram == 0)
needToContinue = addRedistributionDirs(file, distribution, toInsert, loop, mapLoopsInFile, parDirective, getTrueRegId(regionId, loopRegId), messages, arrayLinksByFuncCalls, sameAlignTemplate);
else
needToContinue = addRedistributionDirs(file, distribution, toInsert, loop, mapLoopsInFile, parDirective, regionId, messages, arrayLinksByFuncCalls, sameAlignTemplate);
if (needToContinue)
continue;
@@ -1890,7 +1888,7 @@ void selectParallelDirectiveForVariant(File* file, ParallelRegion* currParReg,
vector<pair<DIST::Array*, const DistrVariant*>> newRules;
constructRules(newRules, distribution, loop);
Directive* dirImpl = parDirective->genDirective(file, newRules, loop, reducedG, allArrays, getTrueRegId(regionId, loopRegId), arrayLinksByFuncCalls);
Directive* dirImpl = parDirective->genDirective(file, newRules, loop, reducedG, allArrays, regionId, arrayLinksByFuncCalls);
#if __SPF
//move label before loop

View File

@@ -102,20 +102,18 @@ void createParallelDirectivesNoDist(const map<LoopGraph*, map<DIST::Array*, Arra
void selectParallelDirectiveForVariantNoDist(File* file, ParallelRegion* currParReg,
DIST::Arrays<int>& allArrays,
const vector<LoopGraph*>& loopGraph,
const map<int, LoopGraph*>& mapLoopsInFile,
const map<string, FuncInfo*>& mapFuncInfo,
vector<Directive*>& toInsert,
const uint64_t regionId,
const map<DIST::Array*, set<DIST::Array*>>& arrayLinksByFuncCalls,
const map<LoopGraph*, void*>& depInfoForLoopGraph,
vector<Messages>& messages)
DIST::Arrays<int>& allArrays,
const vector<LoopGraph*>& loopGraph,
const map<int, LoopGraph*>& mapLoopsInFile,
const map<string, FuncInfo*>& mapFuncInfo,
vector<Directive*>& toInsert,
const map<DIST::Array*, set<DIST::Array*>>& arrayLinksByFuncCalls,
const map<LoopGraph*, void*>& depInfoForLoopGraph,
vector<Messages>& messages)
{
for (int i = 0; i < loopGraph.size(); ++i)
{
LoopGraph* loop = loopGraph[i];
const uint64_t loopRegId = (uint64_t)loop;
const bool hasDirective = loop->directive;
const bool noLimits = loop->hasLimitsToParallel() == false;
const bool isMyRegion = loop->region == currParReg;
@@ -133,7 +131,7 @@ void selectParallelDirectiveForVariantNoDist(File* file, ParallelRegion* currPar
parDirective = loop->recalculateParallelDirective();
// rewrite bool topCheck = isOnlyTopPerfect(loop, distribution);
Directive* dirImpl = parDirective->genDirectiveNoDist(file, loop, allArrays, getTrueRegId(regionId, loopRegId), arrayLinksByFuncCalls);
Directive* dirImpl = parDirective->genDirectiveNoDist(file, loop, allArrays, arrayLinksByFuncCalls);
#if __SPF
//move label before loop
@@ -167,7 +165,7 @@ void selectParallelDirectiveForVariantNoDist(File* file, ParallelRegion* currPar
{
if (loopGraph[i]->children.size() != 0)
selectParallelDirectiveForVariantNoDist(file, currParReg, allArrays, loopGraph[i]->children, mapLoopsInFile, mapFuncInfo,
toInsert, regionId, arrayLinksByFuncCalls,depInfoForLoopGraph, messages);
toInsert, arrayLinksByFuncCalls,depInfoForLoopGraph, messages);
}
}
}

View File

@@ -17,10 +17,7 @@
void addShadowFromAnalysis(ParallelDirective* dir, const std::map<DIST::Array*, ArrayInfo*>& currAccesses);
bool checkForConflict(const std::map<DIST::Array*, ArrayInfo*>& currAccesses,
const LoopGraph* currentLoop,
std::map<DIST::Array*, std::pair<int, std::pair<int, int>>, DIST::ArrayComparator>& arrayWriteAcc,
const std::vector<std::pair<std::pair<std::string, std::string>, std::vector<std::pair<int, int>>>>& acrossInfo,
std::set<DIST::Array*>& acrossOutArrays);
uint64_t getTrueRegId(const uint64_t regId, const uint64_t loopRegId);
const LoopGraph* currentLoop,
std::map<DIST::Array*, std::pair<int, std::pair<int, int>>, DIST::ArrayComparator>& arrayWriteAcc,
const std::vector<std::pair<std::pair<std::string, std::string>, std::vector<std::pair<int, int>>>>& acrossInfo,
std::set<DIST::Array*>& acrossOutArrays);

View File

@@ -21,7 +21,6 @@ void selectParallelDirectiveForVariantNoDist(File* file, ParallelRegion* currPar
const std::map<int, LoopGraph*>& mapLoopsInFile,
const std::map<std::string, FuncInfo*>& mapFuncInfo,
std::vector<Directive*>& toInsert,
const uint64_t regionId,
const std::map<DIST::Array*, std::set<DIST::Array*>>& arrayLinksByFuncCalls,
const std::map<LoopGraph*, void*>& depInfoForLoopGraph,
std::vector<Messages>& messages);

View File

@@ -144,9 +144,8 @@ public:
const std::map<DIST::Array*, std::set<DIST::Array*>> &arrayLinksByFuncCalls);
Directive*
genDirectiveNoDist(File* file, LoopGraph* currLoop,
DIST::Arrays<int>& allArrays, const uint64_t regionId,
const std::map<DIST::Array*, std::set<DIST::Array*>>& arrayLinksByFuncCalls);
genDirectiveNoDist(File* file, LoopGraph* currLoop, DIST::Arrays<int>& allArrays,
const std::map<DIST::Array*, std::set<DIST::Array*>>& arrayLinksByFuncCalls);
friend ParallelDirective* operator+(const ParallelDirective &first, const ParallelDirective &second);

View File

@@ -91,9 +91,8 @@ compliteTieListNoDist(const LoopGraph* currLoop, const vector<LoopGraph*>& loops
}
Directive*
ParallelDirective::genDirectiveNoDist(File* file, LoopGraph* currLoop,
DIST::Arrays<int>& allArrays, const uint64_t regionId,
const map<DIST::Array*, set<DIST::Array*>>& arrayLinksByFuncCalls)
ParallelDirective::genDirectiveNoDist(File* file, LoopGraph* currLoop, DIST::Arrays<int>& allArrays,
const map<DIST::Array*, set<DIST::Array*>>& arrayLinksByFuncCalls)
{
const set<DIST::Array*>& acrossOutAttribute = currLoop->acrossOutAttribute;
const map<DIST::Array*, pair<vector<ArrayOp>, vector<bool>>>& readOps = currLoop->readOps;

View File

@@ -729,8 +729,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
depInfoForLoopGraphV[elem.first] = elem.second;
selectParallelDirectiveForVariantNoDist(new File(file), parallelRegions[z], allArrays, loopsInFile, mapLoopsInFile, mapFuncInfo,
toInsert, parallelRegions[z]->GetId(), arrayLinksByFuncCalls,
depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages));
toInsert, arrayLinksByFuncCalls, depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages));
if (toInsert.size() > 0)
{

View File

@@ -1,3 +1,3 @@
#pragma once
#define VERSION_SPF "2273"
#define VERSION_SPF "2274"