13 Commits

Author SHA1 Message Date
Egor Mayorov
e9d5a2ee70 Make pass correct 2025-10-23 14:54:43 +03:00
Egor Mayorov
2746d072d4 attempt to build new ast 2025-10-22 17:00:27 +03:00
f7005a2735 moved to transformations 2025-10-22 17:00:27 +03:00
Egor Mayorov
a86a76705e swap operators in AST 2025-10-22 17:00:27 +03:00
Egor Mayorov
7fed8f13c3 Use more complex algorythm for building new order of statements 2025-10-22 17:00:27 +03:00
Egor Mayorov
2aba5e07bf update in new order 2025-10-22 17:00:27 +03:00
Egor Mayorov
601c6b6e88 biulding new order 2025-10-22 17:00:27 +03:00
Egor Mayorov
97689d999b some loop analysis done 2025-10-22 17:00:27 +03:00
Egor Mayorov
a85cf28965 Add _bin to gitignore 2025-10-22 17:00:27 +03:00
Egor Mayorov
3c6f5a7a56 Some actions simplify analyzing IR 2025-10-22 17:00:27 +03:00
Egor Mayorov
e7661998fe Pass with output file added 2025-10-22 17:00:27 +03:00
Egor Mayorov
01d769f38b change pass deps 2025-10-22 17:00:27 +03:00
Egor Mayorov
63e6d22d49 New pass 2025-10-22 17:00:27 +03:00
18 changed files with 431 additions and 480 deletions

1
.gitignore vendored
View File

@@ -78,3 +78,4 @@ Sapfor/Sapc++/x64/
Sapfor/out/ Sapfor/out/
Sapfor/_bin/* Sapfor/_bin/*
_bin/*

View File

@@ -204,6 +204,8 @@ set(TR_INLINER src/Transformations/FunctionInlining/inliner.cpp
src/Transformations/FunctionInlining/inliner.h) src/Transformations/FunctionInlining/inliner.h)
set(TR_RENAME_SYMBOLS src/Transformations/RenameSymbols/rename_symbols.cpp set(TR_RENAME_SYMBOLS src/Transformations/RenameSymbols/rename_symbols.cpp
src/Transformations/RenameSymbols/rename_symbols.h) src/Transformations/RenameSymbols/rename_symbols.h)
SET(TR_SWAP_OPERATORS src/Transformations/SwapOperators/swap_operators.cpp
src/Transformations/SwapOperators/swap_operators.h)
set(TRANSFORMS set(TRANSFORMS
${TR_DEAD_CODE} ${TR_DEAD_CODE}
@@ -226,7 +228,8 @@ set(TRANSFORMS
${TR_REPLACE_ARRAYS_IN_IO} ${TR_REPLACE_ARRAYS_IN_IO}
${TR_EXPR_TRANSFORM} ${TR_EXPR_TRANSFORM}
${TR_INLINER} ${TR_INLINER}
${TR_RENAME_SYMBOLS}) ${TR_RENAME_SYMBOLS}
${TR_SWAP_OPERATORS})
set(CFG src/CFGraph/IR.cpp set(CFG src/CFGraph/IR.cpp
src/CFGraph/IR.h src/CFGraph/IR.h
@@ -331,9 +334,7 @@ set(MAIN src/Sapfor.cpp
src/Utils/PassManager.h) src/Utils/PassManager.h)
set(PREDICTOR src/Predictor/PredictScheme.cpp set(PREDICTOR src/Predictor/PredictScheme.cpp
src/Predictor/PredictScheme.h src/Predictor/PredictScheme.h)
src/Predictor/PredictSchemeWithLibrary.cpp
src/Predictor/PredictSchemeWithLibrary.h)
set(LIBPREDICTOR ${libpred_sources}/cluster.cpp set(LIBPREDICTOR ${libpred_sources}/cluster.cpp
${libpred_sources}/predictor.cpp ${libpred_sources}/predictor.cpp
@@ -461,6 +462,7 @@ source_group (Transformations\\GlobalVariables FILES ${TR_GV})
source_group (Transformations\\ConvertToC FILES ${TR_CONV}) source_group (Transformations\\ConvertToC FILES ${TR_CONV})
source_group (Transformations\\SetImplicitNone FILES ${TR_IMPLICIT_NONE}) source_group (Transformations\\SetImplicitNone FILES ${TR_IMPLICIT_NONE})
source_group (Transformations\\ReplaceArraysInIO FILES ${TR_REPLACE_ARRAYS_IN_IO}) source_group (Transformations\\ReplaceArraysInIO FILES ${TR_REPLACE_ARRAYS_IN_IO})
source_group (Transformations\\SwapOperators FILES ${TR_SWAP_OPERATORS})
source_group (CreateIntervals FILES ${CREATE_INTER_T}) source_group (CreateIntervals FILES ${CREATE_INTER_T})

View File

@@ -122,7 +122,6 @@ static LoopGraph* createDirectiveForLoop(LoopGraph *currentLoop, MapToArray &mai
if (found == false) if (found == false)
{ {
directive->shadowRenew.push_back(make_pair(key, vector<pair<int, int>>())); directive->shadowRenew.push_back(make_pair(key, vector<pair<int, int>>()));
directive->shadowRenewCorner.push_back(false);
const DIST::Array *arrayRef = read; const DIST::Array *arrayRef = read;
for (int i = 0; i < arrayRef->GetDimSize(); ++i) for (int i = 0; i < arrayRef->GetDimSize(); ++i)

View File

@@ -857,11 +857,6 @@ ParallelDirective::genDirective(File* file, const vector<pair<DIST::Array*, cons
shadowRenewShifts[i].resize(shadowRenew[i].second.size()); shadowRenewShifts[i].resize(shadowRenew[i].second.size());
} }
if (shadowRenewCorner.size() == 0)
{
shadowRenewCorner.resize(shadowRenew.size(), false);
}
string shadowAdd = ", SHADOW_RENEW("; string shadowAdd = ", SHADOW_RENEW(";
int inserted = 0; int inserted = 0;
@@ -904,10 +899,7 @@ ParallelDirective::genDirective(File* file, const vector<pair<DIST::Array*, cons
for (auto& elem : genSubscripts(shadowRenew[i1].second, shadowRenewShifts[i1])) for (auto& elem : genSubscripts(shadowRenew[i1].second, shadowRenewShifts[i1]))
newArrayRef->addSubscript(*elem); newArrayRef->addSubscript(*elem);
bool needCornerFlag = shadowRenew[i1].second.size() > 1 && needCorner(shadowArray, shiftsByAccess, loop); if (shadowRenew[i1].second.size() > 1 && needCorner(shadowArray, shiftsByAccess, loop))
shadowRenewCorner[i1] = needCornerFlag;
if (needCornerFlag)
{ {
SgExpression* tmp = new SgExpression(ARRAY_OP, newArrayRef, NULL, NULL); SgExpression* tmp = new SgExpression(ARRAY_OP, newArrayRef, NULL, NULL);
p->setLhs(*tmp); p->setLhs(*tmp);

View File

@@ -102,7 +102,6 @@ public:
// origin_Name uniqName bounds // origin_Name uniqName bounds
std::vector<std::pair<std::pair<std::string, std::string>, std::vector<std::pair<int, int>>>> shadowRenew; std::vector<std::pair<std::pair<std::string, std::string>, std::vector<std::pair<int, int>>>> shadowRenew;
std::vector<std::vector<std::pair<int, int>>> shadowRenewShifts; std::vector<std::vector<std::pair<int, int>>> shadowRenewShifts;
std::vector<bool> shadowRenewCorner;
// origin_Name uniqName bounds // origin_Name uniqName bounds
std::vector<std::pair<std::pair<std::string, std::string>, std::vector<std::pair<int, int>>>> across; std::vector<std::pair<std::pair<std::string, std::string>, std::vector<std::pair<int, int>>>> across;
@@ -126,7 +125,6 @@ public:
privates = copyFrom.privates; privates = copyFrom.privates;
shadowRenew = copyFrom.shadowRenew; shadowRenew = copyFrom.shadowRenew;
shadowRenewShifts = copyFrom.shadowRenewShifts; shadowRenewShifts = copyFrom.shadowRenewShifts;
shadowRenewCorner = copyFrom.shadowRenewCorner;
across = copyFrom.across; across = copyFrom.across;
acrossShifts = copyFrom.acrossShifts; acrossShifts = copyFrom.acrossShifts;
remoteAccess = copyFrom.remoteAccess; remoteAccess = copyFrom.remoteAccess;
@@ -153,7 +151,6 @@ public:
on.clear(); on.clear();
privates.clear(); privates.clear();
shadowRenew.clear(); shadowRenew.clear();
shadowRenewCorner.clear();
across.clear(); across.clear();
acrossShifts.clear(); acrossShifts.clear();
reduction.clear(); reduction.clear();

View File

@@ -23,7 +23,6 @@
#include "expr_transform.h" #include "expr_transform.h"
#include "../LoopAnalyzer/loop_analyzer.h" #include "../LoopAnalyzer/loop_analyzer.h"
#include "CFGraph/CFGraph.h" #include "CFGraph/CFGraph.h"
#include "../Utils/utils.h"
#include "json.hpp" #include "json.hpp"
@@ -37,109 +36,6 @@ using std::tuple;
using json = nlohmann::json; using json = nlohmann::json;
void runPredictSchemeOld(SgProject &project,
vector<vector<size_t>> &topologies,
vector<ParallelRegion*> &parallelRegions,
map<string, vector<LoopGraph*>> &loopGraph,
map<string, vector<SpfInterval*>> &intervals,
map<string, vector<Messages>> &SPF_messages)
{
int maxSizeDist = 0;
for (int z = 0; z < parallelRegions.size(); ++z)
{
const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir();
const vector<int> &currentVariant = parallelRegions[z]->GetCurrentVariant();
auto &tmp = dataDirectives.distrRules;
vector<pair<DIST::Array*, const DistrVariant*>> currentVar;
for (int z1 = 0; z1 < currentVariant.size(); ++z1)
currentVar.push_back(std::make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]]));
for (auto &elem : currentVar)
{
DIST::Array *array = elem.first;
const DistrVariant *var = elem.second;
int countBlock = 0;
for (int z = 0; z < var->distRule.size(); ++z)
if (var->distRule[z] == dist::BLOCK)
++countBlock;
maxSizeDist = std::max(maxSizeDist, countBlock);
}
}
SpfInterval *mainIterval = getMainInterval(&project, intervals, SPF_messages);
topologies.clear();
if (maxSizeDist)
{
const int procNum = 8;
//TODO:
//topologies = getTopologies(procNum, maxSizeDist);
throw -10;
const int countOfTop = topologies.size();
if (countOfTop < 0)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
for (auto &inter : intervals)
initTimeForIntervalTree(countOfTop, inter.second);
for (int z = 0; z < parallelRegions.size(); ++z)
{
const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir();
const vector<int> &currentVariant = parallelRegions[z]->GetCurrentVariant();
DIST::Arrays<int> &allArrays = parallelRegions[z]->GetAllArraysToModify();
auto &tmp = dataDirectives.distrRules;
vector<pair<DIST::Array*, const DistrVariant*>> currentVar;
for (int z1 = 0; z1 < currentVariant.size(); ++z1)
currentVar.push_back(std::make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]]));
map<LoopGraph*, ParallelDirective*> parallelDirs;
vector<std::tuple<DIST::Array*, vector<long>, pair<string, int>>> allSingleRemotes;
for (int i = project.numberOfFiles() - 1; i >= 0; --i)
{
SgFile *file = &(project.file(i));
auto fountInfo = findAllDirectives(file, getObjectForFileFromMap(file->filename(), loopGraph), parallelRegions[z]->GetId());
parallelDirs.insert(fountInfo.begin(), fountInfo.end());
auto fountRem = findAllSingleRemotes(file, parallelRegions[z]->GetId(), parallelRegions);
allSingleRemotes.insert(allSingleRemotes.end(), fountRem.begin(), fountRem.end());
}
//TODO!
//int err = predictScheme(parallelRegions[z], currentVar, allArrays.GetArrays(), parallelDirs, intervals, SPF_messages, allSingleRemotes, maxSizeDist, procNum);
/*if (err != 0)
internalExit = err;*/
}
vector<SpfInterval*> tmp = { mainIterval };
aggregatePredictedTimes(tmp);
int idx = 0;
int best = -1;
double bestSpeedUp = 0;
for (auto &top : topologies)
{
string outStr = "";
for (auto &elem : top)
outStr += std::to_string(elem) + " ";
double currS = mainIterval->exec_time / mainIterval->predictedTimes[idx];
__spf_print(1, "%d: speed up %f for top. %s\n", idx, currS, outStr.c_str());
if (best == -1 || bestSpeedUp < currS)
{
bestSpeedUp = currS;
best = idx;
}
++idx;
}
__spf_print(1, "best topology %d with speed up %f\n", best, bestSpeedUp);
}
else
for (auto &inter : intervals)
initTimeForIntervalTree(0, inter.second);
}
static void fillParallel(SgExpression *exp, ParallelStats &parStats, int &totalScoreComm) static void fillParallel(SgExpression *exp, ParallelStats &parStats, int &totalScoreComm)
{ {
if (exp) if (exp)

View File

@@ -61,5 +61,3 @@ void processFileToPredict(SgFile *file, PredictorStats &predictorCounts);
void calculateStatsForPredictor(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo, const std::map<std::string, std::map<int, Gcov_info>>& gCovInfo); void calculateStatsForPredictor(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo, const std::map<std::string, std::map<int, Gcov_info>>& gCovInfo);
void parseDvmDirForPredictor(const std::map<std::tuple<int, std::string, std::string>, std::pair<DIST::Array*, DIST::ArrayAccessInfo*>>& declaredArrays, const std::map<std::string, CommonBlock*>& commonBlocks, const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo, const std::map<std::string, std::map<int, Gcov_info>>& gCovInfo); void parseDvmDirForPredictor(const std::map<std::tuple<int, std::string, std::string>, std::pair<DIST::Array*, DIST::ArrayAccessInfo*>>& declaredArrays, const std::map<std::string, CommonBlock*>& commonBlocks, const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo, const std::map<std::string, std::map<int, Gcov_info>>& gCovInfo);
void runPredictSchemeOld(SgProject &project, std::vector<std::vector<size_t>> &topologies, std::vector<ParallelRegion*> &parallelRegions, std::map<std::string, std::vector<LoopGraph*>> &loopGraph, std::map<std::string, std::vector<SpfInterval*>> &intervals, std::map<std::string, std::vector<Messages>> &SPF_messages);

View File

@@ -1,306 +0,0 @@
#include "leak_detector.h"
#include <limits>
#include <map>
#include <vector>
#include <string>
#include <tuple>
#include "dvm.h"
#include "PredictSchemeWithLibrary.h"
#include "../../projects/libpredictor/include/libpredict/predictor.h"
#include "../DirectiveProcessing/directive_parser.h"
#include "../Distribution/DvmhDirective.h"
#include "../ParallelizationRegions/ParRegions.h"
#include "../GraphLoop/graph_loops_func.h"
#include "../Utils/errors.h"
#include "../Utils/utils.h"
using std::map;
using std::string;
using std::vector;
using std::pair;
using std::tuple;
// МОЖЕТ КАК-ТО ВЫЧИСЛЯТЬ ДИРЕКТИВЫ, А ПОТОМ ДЕЛАТЬ ПРОГОНЫ?
double runLibpredictCalc(SgProject &project,
const vector<size_t> &topology,
const string &clusterConfStr,
const vector<ParallelRegion*> &parallelRegions,
map<string, vector<LoopGraph*>> &loopGraph,
map<string, vector<Messages>> &SPF_messages)
{
libpredict::RetInit retInit = libpredict::Init(clusterConfStr, topology[0], topology[1], topology[2], topology[3]);
if (retInit != libpredict::INIT_SUCCESS) {
__spf_print(1, "ERROR: Failed to initialize libpredict with cluster config: %s, return code: %d\n", clusterConfStr.c_str(), (int)retInit);
std::wstring messageR, messageE;
__spf_printToLongBuf(messageE, L"Failed to initialize libpredict library with cluster config: %s, return code: %d",
to_wstring(clusterConfStr).c_str(), (int)retInit);
__spf_printToLongBuf(messageR, R206);
getObjectForFileFromMap(clusterConfStr.c_str(), SPF_messages).push_back(Messages(ERROR, 1, messageR, messageE, 1063));
return -1;
}
// distribute и align из parallelRegions
for (int z = 0; z < parallelRegions.size(); ++z) {
const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir();
const vector<int> &currentVariant = parallelRegions[z]->GetCurrentVariant();
const DIST::Arrays<int> &allArrays = parallelRegions[z]->GetAllArrays();
auto &tmp = dataDirectives.distrRules;
vector<pair<DIST::Array*, const DistrVariant*>> currentVar;
for (int z1 = 0; z1 < currentVariant.size(); ++z1)
currentVar.push_back(std::make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]]));
// distribute
for (const auto& distrRule : currentVar) {
DIST::Array* array = distrRule.first;
const DistrVariant* variant = distrRule.second;
if (array && variant && !array->IsNotDistribute()) {
size_t arrayId = array->GetId();
size_t elemSize = array->GetTypeSize();
vector<libpredict::DistributeAxisRule> axisDistributions;
const auto& arraySizes = array->GetSizes();
for (int dim = 0; dim < array->GetDimSize(); ++dim) {
size_t dimSize = arraySizes[dim].second - arraySizes[dim].first + 1;
if (dim < variant->distRule.size() && variant->distRule[dim] == dist::BLOCK) {
axisDistributions.emplace_back(dimSize, libpredict::TypeDistribute::BLOCK);
} else {
axisDistributions.emplace_back(dimSize, libpredict::TypeDistribute::NONE);
}
}
vector<pair<size_t, size_t>> shadowEdges;
const auto& shadowSpec = array->GetShadowSpec();
for (int dim = 0; dim < shadowSpec.size() && dim < array->GetDimSize(); ++dim) {
if (dim < variant->distRule.size() && variant->distRule[dim] == dist::BLOCK) {
shadowEdges.emplace_back(shadowSpec[dim].first, shadowSpec[dim].second);
}
}
libpredict::RetDistribute retDistribute = libpredict::Distribute(arrayId, elemSize, axisDistributions, shadowEdges);
if (retDistribute != libpredict::DISTRIBUTE_SUCCESS) {
__spf_print(1, "ERROR: Failed to distribute array '%s' (id=%zu) with libpredict, return code: %d\n",
array->GetShortName().c_str(), arrayId, (int)retDistribute);
std::wstring messageR, messageE;
__spf_printToLongBuf(messageE, L"Failed to distribute array '%s' with libpredict, return code: %d",
to_wstring(array->GetShortName()).c_str(), (int)retDistribute);
__spf_printToLongBuf(messageR, R207);
getObjectForFileFromMap(array->GetDeclInfo().begin()->first.c_str(), SPF_messages).push_back(
Messages(ERROR, array->GetDeclInfo().begin()->second, messageR, messageE, 1064));
}
}
}
// align
for (const auto& alignRule : dataDirectives.alignRules) {
DIST::Array* alignArray = alignRule.alignArray;
DIST::Array* alignWithArray = alignRule.alignWith;
if (alignArray && alignWithArray && !alignArray->IsNotDistribute()) {
size_t arrayId = alignArray->GetId();
size_t distributedArrayId = alignWithArray->GetId();
size_t elemSize = alignArray->GetTypeSize();
const auto& arraySizes = alignArray->GetSizes();
vector<size_t> dimensions;
for (int dim = 0; dim < alignArray->GetDimSize(); ++dim)
dimensions.push_back(arraySizes[dim].second - arraySizes[dim].first + 1);
vector<libpredict::AlignDisplay> distributionExpressions;
for (int dim = 0; dim < alignWithArray->GetDimSize(); ++dim) {
bool found = false;
for (int i = 0; i < alignRule.alignRuleWith.size(); ++i) {
const auto& ruleWith = alignRule.alignRuleWith[i];
if (ruleWith.first == dim) {
const auto& rule = ruleWith.second;
if (rule.first == 0) {
// Константа
distributionExpressions.emplace_back(rule.second);
} else {
// Линейное выражение a * I + b
distributionExpressions.emplace_back(i, rule.first, rule.second);
}
found = true;
break;
}
}
if (!found) {
// Нет правила для этого измерения
distributionExpressions.emplace_back();
}
}
vector<pair<size_t, size_t>> shadowEdges;
const auto& shadowSpec = alignArray->GetShadowSpec();
for (int dim = 0; dim < shadowSpec.size() && dim < alignArray->GetDimSize(); ++dim) {
shadowEdges.emplace_back(shadowSpec[dim].first, shadowSpec[dim].second);
}
libpredict::RetAlign retAlign = libpredict::Align(arrayId, distributedArrayId, elemSize, dimensions, distributionExpressions, shadowEdges);
if (retAlign != libpredict::ALIGN_SUCCESS) {
__spf_print(1, "ERROR: Failed to align array '%s' (id=%zu) with array '%s' (id=%zu), return code: %d\n",
alignArray->GetShortName().c_str(), arrayId,
alignWithArray->GetShortName().c_str(), distributedArrayId, (int)retAlign);
std::wstring messageR, messageE;
__spf_printToLongBuf(messageE, L"Failed to align array '%s' with array '%s' using libpredict, return code: %d",
to_wstring(alignArray->GetShortName()).c_str(),
to_wstring(alignWithArray->GetShortName()).c_str(), (int)retAlign);
__spf_printToLongBuf(messageR, R208);
getObjectForFileFromMap(alignArray->GetDeclInfo().begin()->first.c_str(), SPF_messages).push_back(
Messages(ERROR, alignArray->GetDeclInfo().begin()->second, messageR, messageE, 1065));
}
}
}
// shadow_renew
map<LoopGraph*, ParallelDirective*> parallelDirs;
for (int i = project.numberOfFiles() - 1; i >= 0; --i) {
SgFile *file = &(project.file(i));
auto fountInfo = findAllDirectives(file, getObjectForFileFromMap(file->filename(), loopGraph), parallelRegions[z]->GetId());
parallelDirs.insert(fountInfo.begin(), fountInfo.end());
}
for (auto& dirPair : parallelDirs) {
LoopGraph* loopPtr = dirPair.first;
ParallelDirective* directive = dirPair.second;
if (directive && !directive->shadowRenew.empty()) {
for (size_t shadowIdx = 0; shadowIdx < directive->shadowRenew.size(); ++shadowIdx) {
const auto& shadowRenewItem = directive->shadowRenew[shadowIdx];
const string& arrayName = shadowRenewItem.first.second; // uniqName
const vector<pair<int, int>>& bounds = shadowRenewItem.second;
DIST::Array* shadowArray = allArrays.GetArrayByName(arrayName);
if (shadowArray == NULL)
continue;
if (shadowArray && !shadowArray->IsNotDistribute()) {
size_t arrayId = shadowArray->GetId();
vector<pair<size_t, size_t>> shadow_renew;
for (const auto& bound : bounds) {
shadow_renew.emplace_back(static_cast<size_t>(bound.first),
static_cast<size_t>(bound.second));
}
bool corner = directive->shadowRenewCorner[shadowIdx];
size_t number_loop_iterations = loopPtr ? static_cast<size_t>(loopPtr->countOfIters) : 1;
libpredict::RetShadowRenew retShadowRenew = libpredict::ShadowRenew(arrayId, shadow_renew, corner, number_loop_iterations);
if (retShadowRenew != libpredict::SHADOW_RENEW_SUCCESS) {
__spf_print(1, "ERROR: Failed to process shadow_renew for array '%s' (id=%zu), return code: %d\n",
shadowArray->GetShortName().c_str(), arrayId, (int)retShadowRenew);
std::wstring messageR, messageE;
__spf_printToLongBuf(messageE, L"Failed to process shadow_renew for array '%s' with libpredict, return code: %d",
to_wstring(shadowArray->GetShortName()).c_str(), (int)retShadowRenew);
__spf_printToLongBuf(messageR, R209);
getObjectForFileFromMap(shadowArray->GetDeclInfo().begin()->first.c_str(), SPF_messages).push_back(
Messages(ERROR, shadowArray->GetDeclInfo().begin()->second, messageR, messageE, 1066));
}
}
}
}
}
}
return libpredict::GetTime();
}
void runPredictScheme(SgProject &project,
vector<vector<size_t>> &topologies,
const vector<ParallelRegion*> &parallelRegions,
map<string, vector<LoopGraph*>> &loopGraph,
map<string, vector<Messages>> &SPF_messages)
{
// calculating maximum dimension of distribution
int maxSizeDist = 0;
for (int z = 0; z < parallelRegions.size(); ++z) {
const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir();
const vector<int> &currentVariant = parallelRegions[z]->GetCurrentVariant();
auto &tmp = dataDirectives.distrRules;
vector<const DistrVariant*> currentVar;
for (int z1 = 0; z1 < currentVariant.size(); ++z1)
currentVar.push_back(&tmp[z1].second[currentVariant[z1]]);
for (auto var : currentVar) {
int countBlock = 0;
for (int z = 0; z < var->distRule.size(); ++z)
if (var->distRule[z] == dist::BLOCK)
++countBlock;
maxSizeDist = std::max(maxSizeDist, countBlock);
}
}
// calculating name of a cluster configuration file
string clusterConfStr;
if (project.numberOfFiles() > 0) {
string firstFilePath = project.fileName(0);
size_t lastSlash = firstFilePath.find_last_of("/\\");
clusterConfStr = firstFilePath.substr(0, lastSlash + 1) + "cluster.conf";
}
// iterating through topologies to find most optimal one
topologies = vector<vector<size_t>>();
if (maxSizeDist) {
if (maxSizeDist > 4) maxSizeDist = 4;
// TODO: look at cluster configuration
size_t n1max = 10;
size_t n2max = (maxSizeDist >= 2) ? 10 : 1;
size_t n3max = (maxSizeDist >= 3) ? 10 : 1;
size_t n4max = (maxSizeDist >= 4) ? 10 : 1;
for (size_t n1 = 1; n1 <= n1max; ++n1) {
for (size_t n2 = 1; n2 <= n2max; ++n2) {
for (size_t n3 = 1; n3 <= n3max; ++n3) {
for (size_t n4 = 1; n4 <= n4max; ++n4) {
topologies.push_back(vector<size_t>{n1, n2, n3, n4});
}
}
}
}
vector<size_t> best;
double bestTime = std::numeric_limits<double>::max();
for (auto &topology : topologies) {
// if (DEBUG) {
// string outStr = "";
// for (const auto &elem : top)
// outStr += std::to_string(elem) + " ";
// __spf_print(1, "topology %s has time %f\n", outStr.c_str(), currTime);
// }
double currTime = runLibpredictCalc(project, topology, clusterConfStr, parallelRegions, loopGraph, SPF_messages);
if (currTime == -1)
return;
if (currTime < bestTime) {
bestTime = currTime;
best = topology;
}
}
string outStr;
for (const auto &elem : best)
outStr += std::to_string(elem) + " ";
__spf_print(1, "best topology %s with time %f\n", outStr.c_str(), bestTime);
} else {
__spf_print(1, "impossible to calculate best topology: project does not contain distribution directives\n");
}
}

View File

@@ -1,19 +0,0 @@
#pragma once
#include <vector>
#include <map>
#include <string>
#include "dvm.h"
#include "graph_calls.h"
void runPredictScheme(SgProject &project,
std::vector<std::vector<size_t>> &topologies,
const std::vector<ParallelRegion*> &parallelRegions,
std::map<std::string, std::vector<LoopGraph*>> &loopGraph,
std::map<std::string, std::vector<Messages>> &SPF_messages);
double runLibpredictCalc(SgProject &project,
const std::vector<size_t> &topology,
const std::string &clusterConfStr,
const std::vector<ParallelRegion*> &parallelRegions,
std::map<std::string, std::vector<LoopGraph*>> &loopGraph,
std::map<std::string, std::vector<Messages>> &SPF_messages);

View File

@@ -57,7 +57,6 @@
#include "expr_transform.h" #include "expr_transform.h"
#include "Predictor/PredictScheme.h" #include "Predictor/PredictScheme.h"
#include "Predictor/PredictSchemeWithLibrary.h"
#include "Predictor/PredictorModel.h" #include "Predictor/PredictorModel.h"
#include "SageAnalysisTool/depInterfaceExt.h" #include "SageAnalysisTool/depInterfaceExt.h"
#include "DvmhRegions/DvmhRegionInserter.h" #include "DvmhRegions/DvmhRegionInserter.h"
@@ -90,6 +89,7 @@
#include "Transformations/DeadCodeRemoving/dead_code.h" #include "Transformations/DeadCodeRemoving/dead_code.h"
#include "Transformations/RenameSymbols/rename_symbols.h" #include "Transformations/RenameSymbols/rename_symbols.h"
#include "Transformations/FunctionInlining/inliner.h" #include "Transformations/FunctionInlining/inliner.h"
#include "Transformations/SwapOperators/swap_operators.h"
#include "ProjectParameters/projectParameters.h" #include "ProjectParameters/projectParameters.h"
@@ -940,6 +940,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
internalExit = err; internalExit = err;
} }
} }
else if (curr_regime == SWAP_OPERATORS)
runSwapOperators(file, loopGraph, fullIR, countOfTransform);
else if (curr_regime == PRIVATE_REMOVING_ANALYSIS) else if (curr_regime == PRIVATE_REMOVING_ANALYSIS)
{ {
auto itFound = loopGraph.find(file->filename()); auto itFound = loopGraph.find(file->filename());
@@ -1038,7 +1040,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
PRIVATE_REMOVING, PRIVATE_REMOVING,
PRIVATE_ARRAYS_EXPANSION, PRIVATE_ARRAYS_EXPANSION,
PRIVATE_ARRAYS_SHRINKING, PRIVATE_ARRAYS_SHRINKING,
REMOVE_DEAD_CODE }; REMOVE_DEAD_CODE,
SWAP_OPERATORS };
if ((countOfTransform == 0 || internalExit > 0) && applyFor.find(curr_regime) != applyFor.end()) if ((countOfTransform == 0 || internalExit > 0) && applyFor.find(curr_regime) != applyFor.end())
{ {
@@ -1729,7 +1732,103 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
} }
} }
else if (curr_regime == PREDICT_SCHEME) else if (curr_regime == PREDICT_SCHEME)
runPredictScheme(project, topologies, parallelRegions, loopGraph, SPF_messages); {
int maxSizeDist = 0;
for (int z = 0; z < parallelRegions.size(); ++z)
{
const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir();
const vector<int> &currentVariant = parallelRegions[z]->GetCurrentVariant();
auto &tmp = dataDirectives.distrRules;
vector<pair<DIST::Array*, const DistrVariant*>> currentVar;
for (int z1 = 0; z1 < currentVariant.size(); ++z1)
currentVar.push_back(make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]]));
for (auto &elem : currentVar)
{
DIST::Array *array = elem.first;
const DistrVariant *var = elem.second;
int countBlock = 0;
for (int z = 0; z < var->distRule.size(); ++z)
if (var->distRule[z] == dist::BLOCK)
++countBlock;
maxSizeDist = std::max(maxSizeDist, countBlock);
}
}
SpfInterval *mainIterval = getMainInterval(&project, intervals, SPF_messages);
topologies.clear();
if (maxSizeDist)
{
const int procNum = 8;
//TODO:
//topologies = getTopologies(procNum, maxSizeDist);
throw -10;
const int countOfTop = topologies.size();
if (countOfTop < 0)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
for (auto &inter : intervals)
initTimeForIntervalTree(countOfTop, inter.second);
for (int z = 0; z < parallelRegions.size(); ++z)
{
const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir();
const vector<int> &currentVariant = parallelRegions[z]->GetCurrentVariant();
DIST::Arrays<int> &allArrays = parallelRegions[z]->GetAllArraysToModify();
auto &tmp = dataDirectives.distrRules;
vector<pair<DIST::Array*, const DistrVariant*>> currentVar;
for (int z1 = 0; z1 < currentVariant.size(); ++z1)
currentVar.push_back(make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]]));
map<LoopGraph*, ParallelDirective*> parallelDirs;
vector<std::tuple<DIST::Array*, vector<long>, pair<string, int>>> allSingleRemotes;
for (int i = n - 1; i >= 0; --i)
{
SgFile *file = &(project.file(i));
auto fountInfo = findAllDirectives(file, getObjectForFileFromMap(file->filename(), loopGraph), parallelRegions[z]->GetId());
parallelDirs.insert(fountInfo.begin(), fountInfo.end());
auto fountRem = findAllSingleRemotes(file, parallelRegions[z]->GetId(), parallelRegions);
allSingleRemotes.insert(allSingleRemotes.end(), fountRem.begin(), fountRem.end());
}
//TODO!
//int err = predictScheme(parallelRegions[z], currentVar, allArrays.GetArrays(), parallelDirs, intervals, SPF_messages, allSingleRemotes, maxSizeDist, procNum);
/*if (err != 0)
internalExit = err;*/
}
vector<SpfInterval*> tmp = { mainIterval };
aggregatePredictedTimes(tmp);
int idx = 0;
int best = -1;
double bestSpeedUp = 0;
for (auto &top : topologies)
{
string outStr = "";
for (auto &elem : top)
outStr += std::to_string(elem) + " ";
double currS = mainIterval->exec_time / mainIterval->predictedTimes[idx];
__spf_print(1, "%d: speed up %f for top. %s\n", idx, currS, outStr.c_str());
if (best == -1 || bestSpeedUp < currS)
{
bestSpeedUp = currS;
best = idx;
}
++idx;
}
__spf_print(1, "best topology %d with speed up %f\n", best, bestSpeedUp);
}
else
for (auto &inter : intervals)
initTimeForIntervalTree(0, inter.second);
}
else if (curr_regime == CREATE_INTER_TREE) else if (curr_regime == CREATE_INTER_TREE)
{ {
if (keepFiles) if (keepFiles)
@@ -2125,8 +2224,9 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam
runAnalysis(*project, CALCULATE_STATS_SCHEME, false); runAnalysis(*project, CALCULATE_STATS_SCHEME, false);
if (!folderName && !consoleMode || predictOn) //TODO: need to rewrite this to new algo
runAnalysis(*project, PREDICT_SCHEME, false); /*if (!folderName && !consoleMode || predictOn)
runAnalysis(*project, PREDICT_SCHEME, false); */
runAnalysis(*project, REMOVE_COPIES, false); runAnalysis(*project, REMOVE_COPIES, false);
runAnalysis(*project, SWAP_LOOPS, false); runAnalysis(*project, SWAP_LOOPS, false);
@@ -2238,6 +2338,7 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam
case INSERT_NO_DISTR_FLAGS_FROM_GUI: case INSERT_NO_DISTR_FLAGS_FROM_GUI:
case PRIVATE_REMOVING: case PRIVATE_REMOVING:
case RENAME_INLCUDES: case RENAME_INLCUDES:
case SWAP_OPERATORS:
runAnalysis(*project, curr_regime, true, "", folderName); runAnalysis(*project, curr_regime, true, "", folderName);
break; break;
case INLINE_PROCEDURES: case INLINE_PROCEDURES:

View File

@@ -122,6 +122,8 @@ enum passes {
CREATE_INTER_TREE, CREATE_INTER_TREE,
INSERT_INTER_TREE, INSERT_INTER_TREE,
SWAP_OPERATORS,
SHADOW_GROUPING, SHADOW_GROUPING,
INLINE_PROCEDURES, INLINE_PROCEDURES,
FILL_PARALLEL_REG_IR, FILL_PARALLEL_REG_IR,
@@ -319,6 +321,7 @@ static void setPassValues()
passNames[CHECK_PAR_REG_DIR] = "CHECK_PAR_REG_DIR"; passNames[CHECK_PAR_REG_DIR] = "CHECK_PAR_REG_DIR";
passNames[CREATE_INTER_TREE] = "CREATE_INTER_TREE"; passNames[CREATE_INTER_TREE] = "CREATE_INTER_TREE";
passNames[INSERT_INTER_TREE] = "INSERT_INTER_TREE"; passNames[INSERT_INTER_TREE] = "INSERT_INTER_TREE";
passNames[SWAP_OPERATORS] = "SWAP_OPERATORS";
passNames[CREATE_PARALLEL_REGIONS] = "CREATE_PARALLEL_REGIONS"; passNames[CREATE_PARALLEL_REGIONS] = "CREATE_PARALLEL_REGIONS";
passNames[PRIVATE_REMOVING_ANALYSIS] = "PRIVATE_REMOVING_ANALYSIS"; passNames[PRIVATE_REMOVING_ANALYSIS] = "PRIVATE_REMOVING_ANALYSIS";
passNames[PRIVATE_REMOVING] = "PRIVATE_REMOVING"; passNames[PRIVATE_REMOVING] = "PRIVATE_REMOVING";

View File

@@ -132,7 +132,7 @@ std::map<std::string, PredictorStats> allPredictorStats;
//for DVM INTERVALS //for DVM INTERVALS
std::map<std::string, std::vector<SpfInterval*>> intervals; // file -> intervals std::map<std::string, std::vector<SpfInterval*>> intervals; // file -> intervals
std::vector<std::vector<size_t>> topologies; // current topologies std::vector<std::vector<long>> topologies; // current topologies
// //
//for GCOV_PARSER //for GCOV_PARSER

View File

@@ -0,0 +1,299 @@
#include <map>
#include <unordered_set>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include "../../Utils/errors.h"
#include "../../Utils/SgUtils.h"
#include "../../GraphCall/graph_calls.h"
#include "../../GraphCall/graph_calls_func.h"
#include "../../CFGraph/CFGraph.h"
#include "../../CFGraph/IR.h"
#include "../../GraphLoop/graph_loops.h"
#include "swap_operators.h"
using namespace std;
string getNameByArg(SAPFOR::Argument* arg);
SgSymbol* getSybolByArg(SAPFOR::Argument* arg);
static vector<SAPFOR::IR_Block*> findInstructionsFromOperator(SgStatement* st, vector<SAPFOR::BasicBlock*> Blocks) {
vector<SAPFOR::IR_Block*> result;
string filename = st->fileName();
for (auto& block: Blocks) {
vector<SAPFOR::IR_Block*> instructionsInBlock = block->getInstructions();
for (auto& instruction: instructionsInBlock) {
SgStatement* curOperator = instruction->getInstruction()->getOperator();
// Match by line number to find corresponding IR instruction
if (curOperator->lineNumber() == st->lineNumber()) {
result.push_back(instruction);
}
}
}
return result;
}
unordered_set<int> loop_tags = {FOR_NODE};
unordered_set<int> control_tags = {IF_NODE, ELSEIF_NODE, DO_WHILE_NODE, WHILE_NODE};
unordered_set<int> control_end_tags = {CONTROL_END};
struct OperatorInfo {
SgStatement* stmt;
set<string> usedVars;
set<string> definedVars;
int lineNumber;
bool isMovable;
OperatorInfo(SgStatement* s) : stmt(s), lineNumber(s->lineNumber()), isMovable(true) {}
};
static vector<OperatorInfo> analyzeOperatorsInLoop(SgForStmt* loop, vector<SAPFOR::BasicBlock*> blocks, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR) {
vector<OperatorInfo> operators;
SgStatement* loopStart = loop->lexNext();
SgStatement* loopEnd = loop->lastNodeOfStmt();
SgStatement* current = loopStart;
while (current && current != loopEnd) {
if (isSgExecutableStatement(current)) {
OperatorInfo opInfo(current);
vector<SAPFOR::IR_Block*> irBlocks = findInstructionsFromOperator(current, blocks);
for (auto irBlock : irBlocks) {
SAPFOR::Instruction* instr = irBlock->getInstruction();
if (instr->getArg1()) {
string varName = getNameByArg(instr->getArg1());
if (!varName.empty()) {
opInfo.usedVars.insert(varName);
}
}
if (instr->getArg2()) {
string varName = getNameByArg(instr->getArg2());
if (!varName.empty()) {
opInfo.usedVars.insert(varName);
}
}
if (instr->getResult()) {
string varName = getNameByArg(instr->getResult());
if (!varName.empty()) {
opInfo.definedVars.insert(varName);
}
}
}
if (control_tags.find(current->variant()) != control_tags.end()) {
opInfo.isMovable = false;
}
operators.push_back(opInfo);
}
current = current->lexNext();
}
return operators;
}
static map<string, vector<SgStatement*>> findVariableDefinitions(SgForStmt* loop, vector<OperatorInfo>& operators) {
map<string, vector<SgStatement*>> varDefinitions;
for (auto& op : operators) {
for (const string& var : op.definedVars) {
varDefinitions[var].push_back(op.stmt);
}
}
return varDefinitions;
}
static int calculateDistance(SgStatement* from, SgStatement* to) {
if (!from || !to) return INT_MAX;
return abs(to->lineNumber() - from->lineNumber());
}
static SgStatement* findBestPosition(SgStatement* operatorStmt, vector<OperatorInfo>& operators, map<string, vector<SgStatement*>>& varDefinitions) {
OperatorInfo* opInfo = nullptr;
for (auto& op : operators) {
if (op.stmt == operatorStmt) {
opInfo = &op;
break;
}
}
if (!opInfo || !opInfo->isMovable) return nullptr;
SgStatement* bestPos = nullptr;
int minDistance = INT_MAX;
for (const string& usedVar : opInfo->usedVars) {
if (varDefinitions.find(usedVar) != varDefinitions.end()) {
for (SgStatement* defStmt : varDefinitions[usedVar]) {
int distance = calculateDistance(operatorStmt, defStmt);
if (distance < minDistance) {
minDistance = distance;
bestPos = defStmt;
}
}
}
}
return bestPos;
}
static bool canMoveTo(SgStatement* from, SgStatement* to, SgForStmt* loop) {
if (!from || !to || from == to) return false;
SgStatement* loopStart = loop->lexNext();
SgStatement* loopEnd = loop->lastNodeOfStmt();
if (to->lineNumber() < loopStart->lineNumber() || to->lineNumber() > loopEnd->lineNumber()) {
return false;
}
SgStatement* current = from;
while (current && current != loopEnd) {
if (control_tags.find(current->variant()) != control_tags.end()) {
return false;
}
if (current == to) break;
current = current->lexNext();
}
return true;
}
static vector<SgStatement*> optimizeOperatorOrder(SgForStmt* loop, vector<OperatorInfo>& operators, map<string, vector<SgStatement*>>& varDefinitions) {
vector<SgStatement*> newOrder;
vector<bool> moved(operators.size(), false);
for (size_t i = 0; i < operators.size(); i++) {
if (moved[i] || !operators[i].isMovable) {
newOrder.push_back(operators[i].stmt);
moved[i] = true;
continue;
}
SgStatement* bestPos = findBestPosition(operators[i].stmt, operators, varDefinitions);
if (bestPos && canMoveTo(operators[i].stmt, bestPos, loop)) {
bool inserted = false;
for (size_t j = 0; j < newOrder.size(); j++) {
if (newOrder[j] == bestPos) {
newOrder.insert(newOrder.begin() + j + 1, operators[i].stmt);
inserted = true;
break;
}
}
if (!inserted) {
newOrder.push_back(operators[i].stmt);
}
} else {
newOrder.push_back(operators[i].stmt);
}
moved[i] = true;
}
return newOrder;
}
static bool applyOperatorReordering(SgForStmt* loop, vector<SgStatement*>& newOrder) {
if (!loop || newOrder.empty()) return false;
SgStatement* loopStart = loop->lexNext();
SgStatement* loopEnd = loop->lastNodeOfStmt();
vector<SgStatement*> extractedStatements;
vector<char*> savedComments;
for (SgStatement* stmt : newOrder) {
if (stmt && stmt != loop && stmt != loopEnd) {
savedComments.push_back(stmt->comments() ? strdup(stmt->comments()) : nullptr);
SgStatement* extracted = stmt->extractStmt();
if (extracted) {
extractedStatements.push_back(extracted);
}
}
}
SgStatement* currentPos = loop;
int lineCounter = loop->lineNumber() + 1;
for (size_t i = 0; i < extractedStatements.size(); i++) {
SgStatement* stmt = extractedStatements[i];
if (stmt) {
if (i < savedComments.size() && savedComments[i]) {
stmt->setComments(savedComments[i]);
}
stmt->setlineNumber(lineCounter++);
currentPos->insertStmtAfter(*stmt, *loop);
currentPos = stmt;
}
}
for (char* comment : savedComments) {
if (comment) {
free(comment);
}
}
if (currentPos && currentPos->lexNext() != loopEnd) {
currentPos->setLexNext(*loopEnd);
}
return true;
}
vector<SAPFOR::BasicBlock*> findFuncBlocksByFuncStatement(SgStatement *st, map<FuncInfo*, vector<SAPFOR::BasicBlock*>>& FullIR) {
vector<SAPFOR::BasicBlock*> result;
Statement* forSt = (Statement*)st;
for (auto& func: FullIR) {
if (func.first -> funcPointer -> getCurrProcessFile() == forSt -> getCurrProcessFile()
&& func.first -> funcPointer -> lineNumber() == forSt -> lineNumber())
result = func.second;
}
return result;
}
map<SgForStmt*, vector<SAPFOR::BasicBlock*>> findAndAnalyzeLoops(SgStatement *st, vector<SAPFOR::BasicBlock*> blocks) {
map<SgForStmt*, vector<SAPFOR::BasicBlock*>> result;
SgStatement *lastNode = st->lastNodeOfStmt();
while (st && st != lastNode) {
if (loop_tags.find(st -> variant()) != loop_tags.end()) {
SgForStmt *forSt = (SgForStmt*)st;
SgStatement *loopBody = forSt -> body();
SgStatement *lastLoopNode = st->lastNodeOfStmt();
unordered_set<int> blocks_nums;
while (loopBody && loopBody != lastLoopNode) {
SAPFOR::IR_Block* IR = findInstructionsFromOperator(loopBody, blocks).front();
if (blocks_nums.find(IR -> getBasicBlock() -> getNumber()) == blocks_nums.end()) {
result[forSt].push_back(IR -> getBasicBlock());
blocks_nums.insert(IR -> getBasicBlock() -> getNumber());
}
loopBody = loopBody -> lexNext();
}
std::sort(result[forSt].begin(), result[forSt].end());
}
st = st -> lexNext();
}
return result;
}
void runSwapOperators(SgFile *file, std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR, int& countOfTransform) {
countOfTransform += 1;
const int funcNum = file -> numberOfFunctions();
for (int i = 0; i < funcNum; ++i) {
SgStatement *st = file -> functions(i);
vector<SAPFOR::BasicBlock*> blocks = findFuncBlocksByFuncStatement(st, FullIR);
map<SgForStmt*, vector<SAPFOR::BasicBlock*>> loopsMapping = findAndAnalyzeLoops(st, blocks);
for (pair<SgForStmt*, vector<SAPFOR::BasicBlock*>> loopForAnalyze: loopsMapping) {
vector<OperatorInfo> operators = analyzeOperatorsInLoop(loopForAnalyze.first, loopForAnalyze.second, FullIR);
map<string, vector<SgStatement*>> varDefinitions = findVariableDefinitions(loopForAnalyze.first, operators);
vector<SgStatement*> newOrder = optimizeOperatorOrder(loopForAnalyze.first, operators, varDefinitions);
applyOperatorReordering(loopForAnalyze.first, newOrder);
}
}
}

View File

@@ -0,0 +1,6 @@
#pragma once
#include "../../GraphLoop/graph_loops.h"
#include "../../CFGraph/CFGraph.h"
void runSwapOperators(SgFile *file, std::map<std::string, std::vector<LoopGraph*>>& loopGraph, std::map<FuncInfo*, std::vector<SAPFOR::BasicBlock*>>& FullIR, int& countOfTransform);

View File

@@ -212,6 +212,8 @@ void InitPassesDependencies(map<passes, vector<passes>> &passDepsIn, set<passes>
Pass(BUILD_IR) <= Pass(SUBST_EXPR_RD) <= Pass(SUBST_EXPR_RD_AND_UNPARSE); Pass(BUILD_IR) <= Pass(SUBST_EXPR_RD) <= Pass(SUBST_EXPR_RD_AND_UNPARSE);
list({BUILD_IR, CALL_GRAPH2}) <= Pass(SWAP_OPERATORS);
list({ LOOP_ANALYZER_DATA_DIST_S1, SUBST_EXPR_RD } ) <= Pass(PRIVATE_REMOVING_ANALYSIS); list({ LOOP_ANALYZER_DATA_DIST_S1, SUBST_EXPR_RD } ) <= Pass(PRIVATE_REMOVING_ANALYSIS);
list({ PRIVATE_REMOVING_ANALYSIS, REVERT_SUBST_EXPR_RD }) <= Pass(PRIVATE_REMOVING); list({ PRIVATE_REMOVING_ANALYSIS, REVERT_SUBST_EXPR_RD }) <= Pass(PRIVATE_REMOVING);

View File

@@ -78,10 +78,6 @@ enum typeMessage { WARR, ERROR, NOTE };
// 60 "Format misplaced" // 60 "Format misplaced"
// 61 "Array has declaration area conflict" // 61 "Array has declaration area conflict"
// 62 "need to move common declaration to main for DECLATE" // 62 "need to move common declaration to main for DECLATE"
// 63 "Failed to initialize libpredict library"
// 64 "Failed to distribute array with libpredict"
// 65 "Failed to align array with libpredict"
// 66 "Failed to process shadow_renew with libpredict"
// //
// 20xx TRANSFORM GROUP // 20xx TRANSFORM GROUP
// 01 "can not convert array assign to loop" // 01 "can not convert array assign to loop"
@@ -309,7 +305,7 @@ static void printStackTrace() { };
} \ } \
} while (0) } while (0)
// Свободный - R209 // Свободный - R206
// Гайд по русификации сообщений: При добавлении нового сообщения, меняется последний сводобный идентификатор. // Гайд по русификации сообщений: При добавлении нового сообщения, меняется последний сводобный идентификатор.
// В этом файле остаются только спецификаторы, для которых будет заполнен текст. Полный текст пишется в файле // В этом файле остаются только спецификаторы, для которых будет заполнен текст. Полный текст пишется в файле
// russian_errors_text.txt. Спецификаторы там тоже сохраняются, по ним в визуализаторе будет восстановлен // russian_errors_text.txt. Спецификаторы там тоже сохраняются, по ним в визуализаторе будет восстановлен
@@ -508,14 +504,6 @@ static const wchar_t *R183 = L"R183:";
static const wchar_t *R184 = L"R184:%s"; static const wchar_t *R184 = L"R184:%s";
//1062 //1062
static const wchar_t* R205 = L"R205:%s#%s"; static const wchar_t* R205 = L"R205:%s#%s";
//1063
static const wchar_t* R206 = L"R206:";
//1064
static const wchar_t* R207 = L"R207:";
//1065
static const wchar_t* R208 = L"R208:";
//1066
static const wchar_t* R209 = L"R209:";
//2001 //2001
static const wchar_t *R94 = L"R94:"; static const wchar_t *R94 = L"R94:";

View File

@@ -184,16 +184,8 @@ R182 = "Редукционная операция по элементу масс
R183 = "Расположение операторов FORMAT не поддерживается, попробуйте применить проход Коррекция стиля кода". R183 = "Расположение операторов FORMAT не поддерживается, попробуйте применить проход Коррекция стиля кода".
//1061 //1061
R184 = "Область объявления массива '%s' конфликтует с предыдущей областью. Возможно, это вызвано использованием include-файлов. Попробуйте применить проход 'Подстановка заголовочных файлов'". R184 = "Область объявления массива '%s' конфликтует с предыдущей областью. Возможно, это вызвано использованием include-файлов. Попробуйте применить проход 'Подстановка заголовочных файлов'".
//1062 //1042
R205 = "Массив '%s' состоящий в common блоке '%s' должен иметь описание в главной программной единице для объявления в директиве DECLARE" R205 = "Массив '%s' состоящий в common блоке '%s' должен иметь описание в главной программной единице для объявления в директиве DECLARE"
//1063
R206 = "Ошибка инициализации библиотеки libpredict с конфигурацией кластера: %s, код возврата: %d"
//1064
R207 = "Ошибка распределения массива '%s' с помощью libpredict, код возврата: %d"
//1065
R208 = "Ошибка выравнивания массива '%s' с массивом '%s' с помощью libpredict, код возврата: %d"
//1066
R209 = "Ошибка обработки shadow_renew для массива '%s' с помощью libpredict, код возврата: %d"
//2001 //2001
R94 = "Невозможно автоматически преобразовать данное присваивание к циклу" R94 = "Невозможно автоматически преобразовать данное присваивание к циклу"

View File

@@ -950,7 +950,7 @@ int SPF_ModifyArrayDistribution(void*& context, int winHandler, short *options,
extern map<string, PredictorStats> allPredictorStats; extern map<string, PredictorStats> allPredictorStats;
extern map<string, vector<SpfInterval*>> intervals; extern map<string, vector<SpfInterval*>> intervals;
extern vector<vector<size_t>> topologies; extern vector<vector<long>> topologies;
int SPF_CreateParallelVariant(void*& context, int winHandler, short *options, short *projName, short *folderName, int64_t *variants, int *varLen, int SPF_CreateParallelVariant(void*& context, int winHandler, short *options, short *projName, short *folderName, int64_t *variants, int *varLen,
string &output, string &outputMessage, string &predictorStats) string &output, string &outputMessage, string &predictorStats)
@@ -1807,7 +1807,7 @@ static int inline runModificationPass(passes passName, short* projName, short* f
runPassesForVisualizer(projName, { passName }, folderName); runPassesForVisualizer(projName, { passName }, folderName);
//fill data //fill data
// newFiles: <<3C><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>> // newFiles: <<3C><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>>
string newFile; string newFile;
if (SgFile::switchToFile(outFileName.c_str()) == -1) if (SgFile::switchToFile(outFileName.c_str()) == -1)
@@ -2376,7 +2376,7 @@ const wstring Sapfor_RunAnalysis(const char* analysisName_c, const char* options
retCode = SPF_GetArrayLinks(context, winHandler, optSh, projSh, result, output, outputMessage); retCode = SPF_GetArrayLinks(context, winHandler, optSh, projSh, result, output, outputMessage);
else if (whichRun == "SPF_GetMaxMinBlockDistribution") else if (whichRun == "SPF_GetMaxMinBlockDistribution")
retCode = SPF_GetMaxMinBlockDistribution(context, winHandler, optSh, projSh, result, output, outputMessage); retCode = SPF_GetMaxMinBlockDistribution(context, winHandler, optSh, projSh, result, output, outputMessage);
else if (whichRun == "SPF_<EFBFBD>hangeDirectory") // russian C else if (whichRun == "SPF_<EFBFBD>hangeDirectory") // russian C
{ {
if (options_c == NULL) if (options_c == NULL)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);