Merge branch 'master' into o.nikitin_private_arrays
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -74,6 +74,7 @@ Sapfor/Sapc++/Sapc++/x64/
|
|||||||
Sapfor/Sapc++/x64/
|
Sapfor/Sapc++/x64/
|
||||||
|
|
||||||
/build
|
/build
|
||||||
|
/cmake-build-debug
|
||||||
|
|
||||||
Sapfor/out/
|
Sapfor/out/
|
||||||
Sapfor/_bin/*
|
Sapfor/_bin/*
|
||||||
|
|||||||
@@ -1635,9 +1635,9 @@ void loopAnalyzer(SgFile *file, vector<ParallelRegion*> ®ions, map<tuple<int,
|
|||||||
string fName = file->functions(i)->symbol()->identifier();
|
string fName = file->functions(i)->symbol()->identifier();
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
if (file->functions(i)->variant() != MODULE_STMT)
|
if (file->functions(i)->variant() != MODULE_STMT)
|
||||||
sendMessage_2lvl(wstring(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '") + wstring(fName.begin(), fName.end()) + L"'");
|
sendMessage_2lvl(wstring(L"обработка функции '") + wstring(fName.begin(), fName.end()) + L"'");
|
||||||
else
|
else
|
||||||
sendMessage_2lvl(wstring(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '") + wstring(fName.begin(), fName.end()) + L"'");
|
sendMessage_2lvl(wstring(L"обработка модуля '") + wstring(fName.begin(), fName.end()) + L"'");
|
||||||
#else
|
#else
|
||||||
if (file->functions(i)->variant() != MODULE_STMT)
|
if (file->functions(i)->variant() != MODULE_STMT)
|
||||||
sendMessage_2lvl(wstring(L"processing function '") + wstring(fName.begin(), fName.end()) + L"'");
|
sendMessage_2lvl(wstring(L"processing function '") + wstring(fName.begin(), fName.end()) + L"'");
|
||||||
@@ -1710,7 +1710,10 @@ void loopAnalyzer(SgFile *file, vector<ParallelRegion*> ®ions, map<tuple<int,
|
|||||||
map<string, pair<SgSymbol*, SgStatement*>> notMappedDistributedArrays;
|
map<string, pair<SgSymbol*, SgStatement*>> notMappedDistributedArrays;
|
||||||
set<string> mappedDistrbutedArrays;
|
set<string> mappedDistrbutedArrays;
|
||||||
|
|
||||||
|
const ParallelRegionLines* prevParLines = NULL;
|
||||||
|
double prevLinesWeight = 1.0;
|
||||||
double currentWeight = 1.0;
|
double currentWeight = 1.0;
|
||||||
|
|
||||||
while (st != lastNode)
|
while (st != lastNode)
|
||||||
{
|
{
|
||||||
createNeededException();
|
createNeededException();
|
||||||
@@ -1733,13 +1736,31 @@ void loopAnalyzer(SgFile *file, vector<ParallelRegion*> ®ions, map<tuple<int,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int currentLine = st->lineNumber() < -1 ? st->localLineNumber() : st->lineNumber();
|
const int currentLine = st->lineNumber() < -1 ? st->localLineNumber() : st->lineNumber();
|
||||||
ParallelRegion *currReg = getRegionByLine(regions, st->fileName(), currentLine);
|
auto regAndLines = getRegionAndLinesByLine(regions, st->fileName(), currentLine);
|
||||||
|
|
||||||
|
auto *currReg = regAndLines.first;
|
||||||
|
auto *parLines = regAndLines.second;
|
||||||
if (currReg == NULL)
|
if (currReg == NULL)
|
||||||
{
|
{
|
||||||
st = st->lexNext();
|
st = st->lexNext();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parLines != prevParLines)
|
||||||
|
{
|
||||||
|
prevParLines = parLines;
|
||||||
|
auto newParLinesWeight = parLines ? parLines->weight : 1.0;
|
||||||
|
|
||||||
|
if (prevParLines)
|
||||||
|
currentWeight /= prevLinesWeight;
|
||||||
|
|
||||||
|
if (parLines)
|
||||||
|
currentWeight *= newParLinesWeight;
|
||||||
|
|
||||||
|
prevLinesWeight = newParLinesWeight;
|
||||||
|
prevParLines = parLines;
|
||||||
|
}
|
||||||
|
|
||||||
if (isSgExecutableStatement(st) == NULL)
|
if (isSgExecutableStatement(st) == NULL)
|
||||||
delcsStatViewed.insert(st);
|
delcsStatViewed.insert(st);
|
||||||
else if (!sharedMemoryParallelization &&
|
else if (!sharedMemoryParallelization &&
|
||||||
@@ -2168,7 +2189,7 @@ void loopAnalyzer(SgFile *file, vector<ParallelRegion*> ®ions, map<tuple<int,
|
|||||||
{
|
{
|
||||||
string fName = file->functions(i)->symbol()->identifier();
|
string fName = file->functions(i)->symbol()->identifier();
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
sendMessage_2lvl(wstring(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ") + std::to_wstring(idx) + L"/" + std::to_wstring(convertedLoopInfo.size()));
|
sendMessage_2lvl(wstring(L"обработка цикла ") + std::to_wstring(idx) + L"/" + std::to_wstring(convertedLoopInfo.size()));
|
||||||
#else
|
#else
|
||||||
sendMessage_2lvl(wstring(L"processing loop ") + std::to_wstring(idx) + L"/" + std::to_wstring(convertedLoopInfo.size()));
|
sendMessage_2lvl(wstring(L"processing loop ") + std::to_wstring(idx) + L"/" + std::to_wstring(convertedLoopInfo.size()));
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -93,8 +93,10 @@ static inline SgStatement* getParentStat(SgStatement *st)
|
|||||||
return iterator;
|
return iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void updateRegionInfo(SgStatement *st, map<string, pair<Statement*, Statement*>> &startEnd, map<string, pair<int, int>> &lines_,
|
static void updateRegionInfo(SgStatement *st, map<string, pair<Statement*, Statement*>> &startEnd,
|
||||||
set<string> &funcCallFromReg, const map<string, FuncInfo*> &mapFuncs)
|
map<string, pair<int, int>> &lines_,
|
||||||
|
map<string, map<string, set<int>>> &funcCallFromReg,
|
||||||
|
const map<string, FuncInfo*> &mapFuncs)
|
||||||
{
|
{
|
||||||
string containsPrefix = "";
|
string containsPrefix = "";
|
||||||
SgStatement *st_ps = getParentStat(st);
|
SgStatement *st_ps = getParentStat(st);
|
||||||
@@ -103,17 +105,26 @@ static void updateRegionInfo(SgStatement *st, map<string, pair<Statement*, State
|
|||||||
containsPrefix = st_ps->symbol()->identifier() + string(".");
|
containsPrefix = st_ps->symbol()->identifier() + string(".");
|
||||||
|
|
||||||
extendRegionInfo(st, startEnd, lines_);
|
extendRegionInfo(st, startEnd, lines_);
|
||||||
|
|
||||||
|
set<string> callsFromStatement;
|
||||||
|
|
||||||
if (st->variant() == PROC_STAT)
|
if (st->variant() == PROC_STAT)
|
||||||
{
|
{
|
||||||
string fullName = st->symbol()->identifier();
|
string fullName = st->symbol()->identifier();
|
||||||
//check contains
|
//check contains
|
||||||
if (mapFuncs.find(containsPrefix + fullName) != mapFuncs.end())
|
if (mapFuncs.find(containsPrefix + fullName) != mapFuncs.end())
|
||||||
fullName = containsPrefix + fullName;
|
fullName = containsPrefix + fullName;
|
||||||
funcCallFromReg.insert(fullName);
|
callsFromStatement.insert(fullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int z = 0; z < 3; ++z)
|
for (int z = 0; z < 3; ++z)
|
||||||
findFuncCalls(st->expr(z), funcCallFromReg, containsPrefix, mapFuncs);
|
findFuncCalls(st->expr(z), callsFromStatement, containsPrefix, mapFuncs);
|
||||||
|
|
||||||
|
string filename = st->fileName();
|
||||||
|
int line = st->lineNumber();
|
||||||
|
|
||||||
|
for (const auto &func_name : callsFromStatement)
|
||||||
|
funcCallFromReg[func_name][filename].insert(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fillArrayNamesInReg(set<string> &usedArrayInRegion, SgExpression *exp)
|
static void fillArrayNamesInReg(set<string> &usedArrayInRegion, SgExpression *exp)
|
||||||
@@ -318,8 +329,9 @@ void fillRegionLines(SgFile *file, vector<ParallelRegion*> ®ions, vector<Mess
|
|||||||
string regionName = "";
|
string regionName = "";
|
||||||
map<string, pair<Statement*, Statement*>> startEnd;
|
map<string, pair<Statement*, Statement*>> startEnd;
|
||||||
map<string, pair<int, int>> lines_;
|
map<string, pair<int, int>> lines_;
|
||||||
set<string> funcCallFromReg;
|
map<string, map<string, set<int>>> funcCallFromReg;
|
||||||
bool regionStarted = false;
|
bool regionStarted = false;
|
||||||
|
double fragmentWeight = 1.0;
|
||||||
|
|
||||||
vector<SgStatement*> toDel;
|
vector<SgStatement*> toDel;
|
||||||
for (int i = 0; i < funcNum; ++i)
|
for (int i = 0; i < funcNum; ++i)
|
||||||
@@ -368,6 +380,33 @@ void fillRegionLines(SgFile *file, vector<ParallelRegion*> ®ions, vector<Mess
|
|||||||
itFunc->second->callRegions.insert(0);
|
itFunc->second->callRegions.insert(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parse SPF_APPLY_FRAGMENT clause
|
||||||
|
auto *apply_fragment = data->expr(1);
|
||||||
|
fragmentWeight = 1.0;
|
||||||
|
|
||||||
|
while (apply_fragment)
|
||||||
|
{
|
||||||
|
auto *curr = apply_fragment->lhs();
|
||||||
|
if (curr)
|
||||||
|
{
|
||||||
|
__spf_print(1, "%s %d\n", curr->unparse(), curr->variant());
|
||||||
|
|
||||||
|
if (curr->variant() == SPF_WEIGHT_OP)
|
||||||
|
{
|
||||||
|
if (curr->lhs() &&
|
||||||
|
isSgValueExp(curr->lhs()) &&
|
||||||
|
isSgValueExp(curr->lhs())->doubleValue())
|
||||||
|
{
|
||||||
|
fragmentWeight = strtod(isSgValueExp(curr->lhs())->doubleValue(), NULL);
|
||||||
|
__spf_print(1, "->> %lf\n", fragmentWeight);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
__spf_print(1, "WEIGHT clause without double argument\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apply_fragment = apply_fragment->rhs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (next && next->variant() == SPF_END_PARALLEL_REG_DIR)
|
if (next && next->variant() == SPF_END_PARALLEL_REG_DIR)
|
||||||
@@ -400,10 +439,12 @@ void fillRegionLines(SgFile *file, vector<ParallelRegion*> ®ions, vector<Mess
|
|||||||
|
|
||||||
extendRegionInfo(st, startEnd, lines_, true);
|
extendRegionInfo(st, startEnd, lines_, true);
|
||||||
for (auto itRegInfo = startEnd.begin(); itRegInfo != startEnd.end(); ++itRegInfo)
|
for (auto itRegInfo = startEnd.begin(); itRegInfo != startEnd.end(); ++itRegInfo)
|
||||||
currReg->AddLines(lines_[itRegInfo->first], itRegInfo->first, &itRegInfo->second);
|
currReg->AddLines(lines_[itRegInfo->first], itRegInfo->first, &itRegInfo->second, fragmentWeight);
|
||||||
|
|
||||||
for (auto &func : funcCallFromReg)
|
for (auto &by_func : funcCallFromReg)
|
||||||
currReg->AddFuncCalls(func);
|
for (auto &by_file : by_func.second)
|
||||||
|
for(auto &by_line : by_file.second)
|
||||||
|
currReg->AddFuncCalls(by_func.first, by_file.first, by_line);
|
||||||
|
|
||||||
filterUserDirectives(currReg, usedArrayInRegion, userDvmRedistrDirs, userDvmRealignDirs, userDvmShadowDirs);
|
filterUserDirectives(currReg, usedArrayInRegion, userDvmRedistrDirs, userDvmRealignDirs, userDvmShadowDirs);
|
||||||
currReg->AddUserDirectives(userDvmRealignDirs, DVM_REALIGN_DIR);
|
currReg->AddUserDirectives(userDvmRealignDirs, DVM_REALIGN_DIR);
|
||||||
@@ -496,34 +537,48 @@ void fillRegionLinesStep2(vector<ParallelRegion*> ®ions, const map<string, ve
|
|||||||
{
|
{
|
||||||
if (regions[i]->GetName() != "DEFAULT")
|
if (regions[i]->GetName() != "DEFAULT")
|
||||||
for (auto &func : regions[i]->GetFuncCalls())
|
for (auto &func : regions[i]->GetFuncCalls())
|
||||||
setExplicitFlag(func, funcMap);
|
setExplicitFlag(func.first, funcMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < regions.size(); ++i)
|
for (int i = 0; i < regions.size(); ++i)
|
||||||
{
|
{
|
||||||
if (regions[i]->GetName() != "DEFAULT")
|
if (regions[i]->GetName() != "DEFAULT")
|
||||||
{
|
{
|
||||||
set<string> uniqFuncCalls;
|
map<string, double> uniqFuncCalls;
|
||||||
for (auto &elem : regions[i]->GetFuncCalls())
|
map<string, map<string, set<int>>> callPlaces;
|
||||||
uniqFuncCalls.insert(elem);
|
|
||||||
|
for (auto &elem : regions[i]->GetFuncCalls())
|
||||||
|
{
|
||||||
|
double max_weight = 0;
|
||||||
|
for (auto* fragment : elem.second)
|
||||||
|
if (fragment->weight > max_weight)
|
||||||
|
max_weight = fragment->weight;
|
||||||
|
|
||||||
|
uniqFuncCalls[elem.first] = max_weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wasChanged = true;
|
||||||
|
auto funcsBefore = uniqFuncCalls;
|
||||||
|
|
||||||
bool wasChanged = 1;
|
|
||||||
while (wasChanged)
|
while (wasChanged)
|
||||||
{
|
{
|
||||||
wasChanged = 0;
|
wasChanged = false;
|
||||||
|
auto updated = uniqFuncCalls;
|
||||||
|
|
||||||
for (auto &uniqF : uniqFuncCalls)
|
for (auto &uniqF : uniqFuncCalls)
|
||||||
{
|
{
|
||||||
auto func = funcMap.find(uniqF);
|
auto func = funcMap.find(uniqF.first);
|
||||||
if (func != funcMap.end())
|
if (func != funcMap.end())
|
||||||
{
|
{
|
||||||
for (auto &calls : func->second->callsFrom)
|
for (auto &call : func->second->callsFromDetailed)
|
||||||
{
|
{
|
||||||
auto it = uniqFuncCalls.find(calls);
|
auto it = updated.find(call.detailCallsFrom.first);
|
||||||
if (it == uniqFuncCalls.end())
|
if (it == updated.end())
|
||||||
{
|
updated.insert({call.detailCallsFrom.first, uniqF.second});
|
||||||
uniqFuncCalls.insert(it, calls);
|
else
|
||||||
wasChanged = 1;
|
it->second = std::max(it->second, uniqF.second);
|
||||||
}
|
|
||||||
|
callPlaces[call.detailCallsFrom.first][func->second->fileName].insert(call.detailCallsFrom.second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -532,21 +587,27 @@ void fillRegionLinesStep2(vector<ParallelRegion*> ®ions, const map<string, ve
|
|||||||
string toPrint = "";
|
string toPrint = "";
|
||||||
for (auto &elem : uniqFuncCalls)
|
for (auto &elem : uniqFuncCalls)
|
||||||
{
|
{
|
||||||
auto it = funcMap.find(elem);
|
auto it = funcMap.find(elem.first);
|
||||||
if (it != funcMap.end())
|
if (it != funcMap.end())
|
||||||
{
|
{
|
||||||
regions[i]->AddLines(it->second->linesNum, it->second->fileName);
|
regions[i]->AddLines(it->second->linesNum, it->second->fileName, NULL, elem.second);
|
||||||
regions[i]->AddFuncCallsToAllCalls(it->second);
|
|
||||||
|
|
||||||
if (it->second->inRegion == 0)
|
if (it->second->inRegion == 0)
|
||||||
it->second->inRegion = 2;
|
it->second->inRegion = 2;
|
||||||
|
|
||||||
it->second->callRegions.insert(i);
|
it->second->callRegions.insert(i);
|
||||||
|
|
||||||
toPrint += elem + " ";
|
toPrint += elem.first + " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto &elem : callPlaces)
|
||||||
|
{
|
||||||
|
for (const auto &byFile : elem.second)
|
||||||
|
for (auto byLine : byFile.second)
|
||||||
|
regions[i]->AddFuncCalls(elem.first, byFile.first, byLine);
|
||||||
|
}
|
||||||
|
|
||||||
if (toPrint != "")
|
if (toPrint != "")
|
||||||
__spf_print(1, "[%s]: funcs: %s\n", regions[i]->GetName().c_str(), toPrint.c_str());
|
__spf_print(1, "[%s]: funcs: %s\n", regions[i]->GetName().c_str(), toPrint.c_str());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
struct ParallelRegionLines
|
struct ParallelRegionLines
|
||||||
{
|
{
|
||||||
ParallelRegionLines()
|
ParallelRegionLines(double weight = 1.0) : weight(weight)
|
||||||
{
|
{
|
||||||
lines = std::make_pair(-1, -1);
|
lines = std::make_pair(-1, -1);
|
||||||
stats = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
stats = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
||||||
@@ -27,14 +27,15 @@ struct ParallelRegionLines
|
|||||||
intervalAfter = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
intervalAfter = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ParallelRegionLines(const std::pair<int, int> &lines) : lines(lines)
|
ParallelRegionLines(const std::pair<int, int> &lines, double weight = 1.0) : lines(lines), weight(weight)
|
||||||
{
|
{
|
||||||
stats = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
stats = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
||||||
intervalBefore = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
intervalBefore = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
||||||
intervalAfter = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
intervalAfter = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ParallelRegionLines(const std::pair<int, int> &lines, const std::pair<Statement*, Statement*> stats) : lines(lines), stats(stats)
|
ParallelRegionLines(const std::pair<int, int> &lines, const std::pair<Statement*, Statement*> stats, double weight = 1.0)
|
||||||
|
: lines(lines), stats(stats), weight(weight)
|
||||||
{
|
{
|
||||||
intervalBefore = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
intervalBefore = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
||||||
intervalAfter = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
intervalAfter = std::make_pair<Statement*, Statement*>(NULL, NULL);
|
||||||
@@ -62,6 +63,8 @@ struct ParallelRegionLines
|
|||||||
// <start, end> interval
|
// <start, end> interval
|
||||||
std::pair<Statement*, Statement*> intervalBefore;
|
std::pair<Statement*, Statement*> intervalBefore;
|
||||||
std::pair<Statement*, Statement*> intervalAfter;
|
std::pair<Statement*, Statement*> intervalAfter;
|
||||||
|
|
||||||
|
double weight; // weight of the fragment among all fragments of this region
|
||||||
};
|
};
|
||||||
|
|
||||||
#if __SPF
|
#if __SPF
|
||||||
@@ -116,7 +119,7 @@ public:
|
|||||||
currentVariant = copy.currentVariant;
|
currentVariant = copy.currentVariant;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AddLines(const std::pair<int, int> &linesToAdd, const std::string &file, const std::pair<Statement*, Statement*> *startEnd = NULL)
|
int AddLines(const std::pair<int, int> &linesToAdd, const std::string &file, const std::pair<Statement*, Statement*> *startEnd = NULL, double weight = 1.0)
|
||||||
{
|
{
|
||||||
if (linesToAdd.first > linesToAdd.second)
|
if (linesToAdd.first > linesToAdd.second)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -126,17 +129,29 @@ public:
|
|||||||
it = lines.insert(it, make_pair(file, std::vector<ParallelRegionLines>()));
|
it = lines.insert(it, make_pair(file, std::vector<ParallelRegionLines>()));
|
||||||
|
|
||||||
if (startEnd)
|
if (startEnd)
|
||||||
it->second.push_back(ParallelRegionLines(linesToAdd, *startEnd));
|
it->second.push_back(ParallelRegionLines(linesToAdd, *startEnd, weight));
|
||||||
else
|
else
|
||||||
it->second.push_back(ParallelRegionLines(linesToAdd));
|
it->second.push_back(ParallelRegionLines(linesToAdd, weight));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddFuncCalls(const std::string &func) { functionsCall.insert(func); }
|
void AddFuncCalls(const std::string &func, const std::string &file, const int line)
|
||||||
|
{
|
||||||
|
auto *found_lines = GetLinesByLine(file, line);
|
||||||
|
|
||||||
|
if (found_lines)
|
||||||
|
functionsCall[func].insert(found_lines);
|
||||||
|
}
|
||||||
|
|
||||||
#if __SPF
|
#if __SPF
|
||||||
void AddFuncCallsToAllCalls(FuncInfo *func) { allFunctionsCall.insert(func); }
|
void AddFuncCallsToAllCalls(FuncInfo *func, const std::string &file, const int line)
|
||||||
|
{
|
||||||
|
auto *found_lines = GetLinesByLine(file, line);
|
||||||
|
|
||||||
|
if (found_lines)
|
||||||
|
allFunctionsCall[func].insert(found_lines);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint64_t GetId() const { return regionId; }
|
uint64_t GetId() const { return regionId; }
|
||||||
@@ -176,10 +191,10 @@ public:
|
|||||||
const DataDirective& GetDataDir() const { return dataDirectives; }
|
const DataDirective& GetDataDir() const { return dataDirectives; }
|
||||||
DataDirective& GetDataDirToModify() { return dataDirectives; }
|
DataDirective& GetDataDirToModify() { return dataDirectives; }
|
||||||
|
|
||||||
const std::set<std::string>& GetFuncCalls() const { return functionsCall; }
|
const std::map<std::string, std::set<const ParallelRegionLines*>>& GetFuncCalls() const { return functionsCall; }
|
||||||
|
|
||||||
#if __SPF
|
#if __SPF
|
||||||
const std::set<FuncInfo*>& GetAllFuncCalls() const { return allFunctionsCall; }
|
const std::map<FuncInfo*, std::set<const ParallelRegionLines*>>& GetAllFuncCalls() const { return allFunctionsCall; }
|
||||||
const std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>>& GetUsedLocalArrays() const { return usedLocalArrays; }
|
const std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>>& GetUsedLocalArrays() const { return usedLocalArrays; }
|
||||||
const std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>>& GetUsedCommonArrays() const { return usedCommonArrays; }
|
const std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>>& GetUsedCommonArrays() const { return usedCommonArrays; }
|
||||||
|
|
||||||
@@ -218,7 +233,7 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool HasThisLine(const int line, const std::string &file) const
|
bool HasThisLine(const int line, const std::string &file, const ParallelRegionLines** found = nullptr) const
|
||||||
{
|
{
|
||||||
bool retVal = false;
|
bool retVal = false;
|
||||||
auto it = lines.find(file);
|
auto it = lines.find(file);
|
||||||
@@ -229,6 +244,9 @@ public:
|
|||||||
if (it->second[i].lines.first <= line && it->second[i].lines.second >= line)
|
if (it->second[i].lines.first <= line && it->second[i].lines.second >= line)
|
||||||
{
|
{
|
||||||
retVal = true;
|
retVal = true;
|
||||||
|
if (found)
|
||||||
|
*found = &(it->second[i]);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -292,7 +310,7 @@ public:
|
|||||||
fprintf(fileOut, " originalName '%s'\n", originalName.c_str());
|
fprintf(fileOut, " originalName '%s'\n", originalName.c_str());
|
||||||
fprintf(fileOut, " functions call from %d:\n", (int)functionsCall.size());
|
fprintf(fileOut, " functions call from %d:\n", (int)functionsCall.size());
|
||||||
for (auto &func : functionsCall)
|
for (auto &func : functionsCall)
|
||||||
fprintf(fileOut, " '%s'\n", func.c_str());
|
fprintf(fileOut, " '%s'\n", func.first.c_str());
|
||||||
fprintf(fileOut, " total lines %d:\n", (int)lines.size());
|
fprintf(fileOut, " total lines %d:\n", (int)lines.size());
|
||||||
for (auto &line : lines)
|
for (auto &line : lines)
|
||||||
{
|
{
|
||||||
@@ -362,11 +380,11 @@ private:
|
|||||||
std::string originalName;
|
std::string originalName;
|
||||||
// file -> lines info
|
// file -> lines info
|
||||||
std::map<std::string, std::vector<ParallelRegionLines>> lines;
|
std::map<std::string, std::vector<ParallelRegionLines>> lines;
|
||||||
std::set<std::string> functionsCall;
|
std::map<std::string, std::set<const ParallelRegionLines*>> functionsCall; // func name -> fragments with calls
|
||||||
|
|
||||||
#if __SPF
|
#if __SPF
|
||||||
// for RESOLVE_PAR_REGIONS
|
// for RESOLVE_PAR_REGIONS
|
||||||
std::set<FuncInfo*> allFunctionsCall;
|
std::map<FuncInfo*, std::set<const ParallelRegionLines*>> allFunctionsCall; // function -> fragments with calls
|
||||||
std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>> usedLocalArrays; // func -> array -> lines
|
std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>> usedLocalArrays; // func -> array -> lines
|
||||||
std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>> usedCommonArrays; // func -> array -> lines
|
std::map<FuncInfo*, std::map<DIST::Array*, std::vector<ParallelRegionLines>>> usedCommonArrays; // func -> array -> lines
|
||||||
//
|
//
|
||||||
@@ -408,4 +426,5 @@ private:
|
|||||||
ParallelRegion* getRegionById(const std::vector<ParallelRegion*>& regions, const uint64_t regionId);
|
ParallelRegion* getRegionById(const std::vector<ParallelRegion*>& regions, const uint64_t regionId);
|
||||||
ParallelRegion* getRegionByName(const std::vector<ParallelRegion*>& regions, const std::string& regionName);
|
ParallelRegion* getRegionByName(const std::vector<ParallelRegion*>& regions, const std::string& regionName);
|
||||||
ParallelRegion* getRegionByLine(const std::vector<ParallelRegion*>& regions, const std::string& file, const int line);
|
ParallelRegion* getRegionByLine(const std::vector<ParallelRegion*>& regions, const std::string& file, const int line);
|
||||||
|
std::pair<ParallelRegion*, const ParallelRegionLines*> getRegionAndLinesByLine(const std::vector<ParallelRegion*>& regions, const std::string& file, const int line);
|
||||||
std::set<ParallelRegion*> getAllRegionsByLine(const std::vector<ParallelRegion*>& regions, const std::string& file, const int line);
|
std::set<ParallelRegion*> getAllRegionsByLine(const std::vector<ParallelRegion*>& regions, const std::string& file, const int line);
|
||||||
@@ -1415,6 +1415,35 @@ ParallelRegion* getRegionByLine(const vector<ParallelRegion*>& regions, const st
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<ParallelRegion*, const ParallelRegionLines*> getRegionAndLinesByLine(const vector<ParallelRegion*>& regions, const string& file, const int line)
|
||||||
|
{
|
||||||
|
if (regions.size() == 1 && regions[0]->GetName() == "DEFAULT") // only default
|
||||||
|
return { regions[0], NULL };
|
||||||
|
else if (regions.size() > 0)
|
||||||
|
{
|
||||||
|
map<ParallelRegion*, const ParallelRegionLines*> regFound;
|
||||||
|
const ParallelRegionLines* foundLines = NULL;
|
||||||
|
|
||||||
|
for (int i = 0; i < regions.size(); ++i)
|
||||||
|
if (regions[i]->HasThisLine(line, file, &foundLines))
|
||||||
|
regFound[regions[i]] = foundLines;
|
||||||
|
|
||||||
|
if (regFound.size() == 0)
|
||||||
|
return { NULL, NULL };
|
||||||
|
else if (regFound.size() == 1)
|
||||||
|
return *regFound.begin();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__spf_print(1, "WARN: this lines included in more than one region!!\n");
|
||||||
|
return { NULL, NULL };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return { NULL, NULL };
|
||||||
|
|
||||||
|
return { NULL, NULL };
|
||||||
|
}
|
||||||
|
|
||||||
set<ParallelRegion*> getAllRegionsByLine(const vector<ParallelRegion*>& regions, const string& file, const int line)
|
set<ParallelRegion*> getAllRegionsByLine(const vector<ParallelRegion*>& regions, const string& file, const int line)
|
||||||
{
|
{
|
||||||
set<ParallelRegion*> regFound;
|
set<ParallelRegion*> regFound;
|
||||||
|
|||||||
Reference in New Issue
Block a user