From 8a689b5ee35167a963cf79cddfc01921b1331ac8 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 24 Mar 2024 21:24:32 +0300 Subject: [PATCH] refactoring --- sapfor/experts/Sapfor_2017/CMakeLists.txt | 1 - .../DirectiveProcessing/directive_creator.cpp | 62 ++++++ .../DirectiveProcessing/directive_creator.h | 19 +- .../directive_creator_base.cpp | 1 - .../directive_creator_base_nodist.cpp | 1 - .../directive_creator_internal.h | 23 --- .../DirectiveProcessing/insert_directive.cpp | 63 ++++++ .../DirectiveProcessing/insert_directive.h | 15 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 181 ++---------------- .../private_arrays_resizing.cpp | 22 ++- .../experts/Sapfor_2017/_src/Utils/utils.cpp | 68 +++++++ sapfor/experts/Sapfor_2017/_src/Utils/utils.h | 6 +- .../experts/Sapfor_2017/_src/Utils/version.h | 2 +- 13 files changed, 265 insertions(+), 199 deletions(-) delete mode 100644 sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h diff --git a/sapfor/experts/Sapfor_2017/CMakeLists.txt b/sapfor/experts/Sapfor_2017/CMakeLists.txt index 224909a..f3cca8e 100644 --- a/sapfor/experts/Sapfor_2017/CMakeLists.txt +++ b/sapfor/experts/Sapfor_2017/CMakeLists.txt @@ -242,7 +242,6 @@ set(DIRA _src/DirectiveProcessing/DirectiveAnalyzer.cpp _src/DirectiveProcessing/directive_creator.h _src/DirectiveProcessing/directive_creator_base_nodist.cpp _src/DirectiveProcessing/directive_creator_nodist.h - _src/DirectiveProcessing/directive_creator_internal.h _src/DirectiveProcessing/directive_parser.cpp _src/DirectiveProcessing/directive_parser.h _src/DirectiveProcessing/insert_directive.cpp diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp index ebfafbb..a4fd864 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.cpp @@ -45,6 +45,8 @@ using std::get; using std::string; using std::wstring; +extern int mpiProgram; + static vector>> groupRealignsDirs(const vector>>& toRealign) { @@ -423,6 +425,66 @@ bool analyzeLoopBody(LoopGraph* loopV, return true; } +void createParallelDirs(File *file, + map>& createdDirectives, + vector& messages, + const vector& loopsInFile, + const map>& allFuncInfo, + const vector& parallelRegions, + const map& depInfoForLoopGraph, + const map>& arrayLinksByFuncCalls) +{ + const string file_name = file->filename(); + map mapLoopsInFile; + createMapLoopGraph(loopsInFile, mapLoopsInFile); + + map mapFuncInfo; + createMapOfFunc(allFuncInfo, mapFuncInfo); + + for (int z = 0; z < parallelRegions.size(); ++z) + { + vector toInsert; + + const DataDirective& dataDirectives = parallelRegions[z]->GetDataDir(); + const vector& currentVariant = parallelRegions[z]->GetCurrentVariant(); + DIST::GraphCSR& reducedG = parallelRegions[z]->GetReducedGraphToModify(); + DIST::Arrays& allArrays = parallelRegions[z]->GetAllArraysToModify(); + + auto& tmp = dataDirectives.distrRules; + vector> currentVar; + + if (mpiProgram == 0) + { + for (int z1 = 0; z1 < currentVariant.size(); ++z1) + currentVar.push_back(make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]])); + } + else + { + for (auto& loop : mapLoopsInFile) + { + auto& rules = loop.second->getDataDir().distrRules; + for (auto& rule : rules) + currentVar.push_back(make_pair(rule.first, &rule.second[0])); + } + } + + selectParallelDirectiveForVariant(file, parallelRegions[z], reducedG, allArrays, loopsInFile, + mapLoopsInFile, mapFuncInfo, currentVar, + toInsert, parallelRegions[z]->GetId(), arrayLinksByFuncCalls, + depInfoForLoopGraph, messages); + + if (toInsert.size() > 0) + { + auto it = createdDirectives.find(file_name); + if (it == createdDirectives.end()) + createdDirectives.insert(it, make_pair(file_name, toInsert)); + else + for (int m = 0; m < toInsert.size(); ++m) + it->second.push_back(toInsert[m]); + } + } +} + #undef PRINT_DIR_RESULT #undef FIRST #undef SECOND diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h index 72462e8..c2f24cd 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator.h @@ -43,4 +43,21 @@ DIST::Array* getRealArrayRef(DIST::Array* in, const uint64_t regId, const std::m void shiftAlignRulesForTemplates(const std::set& arrays, const uint64_t regId, DataDirective& dataDirectives, const std::map>& arrayLinksByFuncCalls); -void createShadowSpec(const std::map>& loopGraph, const std::map>& arrayLinksByFuncCalls, const std::set& forArrays); \ No newline at end of file +void createShadowSpec(const std::map>& loopGraph, const std::map>& arrayLinksByFuncCalls, const std::set& forArrays); + +void addShadowFromAnalysis(ParallelDirective* dir, const std::map& currAccesses); + +bool checkForConflict(const std::map& currAccesses, + const LoopGraph* currentLoop, + std::map>, DIST::ArrayComparator>& arrayWriteAcc, + const std::vector, std::vector>>>& acrossInfo, + std::set& acrossOutArrays); + +void createParallelDirs(File* file, + std::map>& createdDirectives, + std::vector& messages, + const std::vector& loopsInFile, + const std::map>& allFuncInfo, + const std::vector& parallelRegions, + const std::map& depInfoForLoopGraph, + const std::map>& arrayLinksByFuncCalls); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp index 69bde5b..563c44c 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base.cpp @@ -15,7 +15,6 @@ #include "../Utils/errors.h" #include "directive_parser.h" #include "directive_creator.h" -#include "directive_creator_internal.h" #define PRINT_PROF_INFO 1 #define PRINT_DIR_RESULT 0 diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp index 0387428..27eb9d6 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_base_nodist.cpp @@ -15,7 +15,6 @@ #include "../Utils/errors.h" #include "directive_parser.h" #include "directive_creator.h" -#include "directive_creator_internal.h" #include "directive_creator_nodist.h" #define PRINT_PROF_INFO 1 diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h deleted file mode 100644 index 0061885..0000000 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/directive_creator_internal.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "../Distribution/Distribution.h" -#include "../Utils/errors.h" -#include "../GraphLoop/graph_loops.h" -#include "../Utils/types.h" - -#define FIRST(x) get<0>(x) -#define SECOND(x) get<1>(x) -#define THIRD(x) get<2>(x) - -void addShadowFromAnalysis(ParallelDirective* dir, const std::map& currAccesses); - -bool checkForConflict(const std::map& currAccesses, - const LoopGraph* currentLoop, - std::map>, DIST::ArrayComparator>& arrayWriteAcc, - const std::vector, std::vector>>>& acrossInfo, - std::set& acrossOutArrays); diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp index 262884b..b9e3678 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.cpp @@ -39,6 +39,8 @@ using std::make_tuple; static const string dvmhModuleName = "dvmh_template_mod"; +extern int mpiProgram; + //the size of vector indiceates type of DVM_DIR SgStatement* createStatFromExprs(const vector &exprs) { @@ -2364,4 +2366,65 @@ void insertDistributeDirsToParallelRegions(const vector *cu } } } +} + +void insertParallelDirs(SgFile *file, bool extract, + vector& createdDirectives, + vector& messages, + map& templateDeclInIncludes, + map>>& commentsToInclude, + const vector& callGraph, + const vector& parallelRegions, + const map>& loopGraph, + const set& allFileNames, + const map>& arrayLinksByFuncCalls, + const map, pair>& declaredArrays, + const map>& tableOfUniqNamesByArray) +{ + const char* file_name = file->filename(); + insertDirectiveToFile(file, file_name, createdDirectives, extract, messages); + + if (mpiProgram == 0) + { + map mapFuncInfo; + createMapOfFunc(callGraph, mapFuncInfo); + + for (int z = 0; z < parallelRegions.size(); ++z) + { + ParallelRegion* currReg = parallelRegions[z]; + + const DataDirective& dataDirectives = currReg->GetDataDir(); + const vector& currentVariant = currReg->GetCurrentVariant(); + const DIST::Arrays& allArrays = currReg->GetAllArrays(); + DIST::GraphCSR& reducedG = currReg->GetReducedGraphToModify(); + + const set distrArrays = fillDistributedArrays(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls); + const vector distrRules = dataDirectives.GenRule(currentVariant); + const vector> distrRulesSt = dataDirectives.GenRule(currentVariant, 0); + const vector alignRules = dataDirectives.GenAlignsRules(); + + + insertDistributionToFile(file, file_name, dataDirectives, distrArrays, distrRules, distrRulesSt, alignRules, loopGraph, + allArrays, reducedG, commentsToInclude, templateDeclInIncludes, extract, messages, + arrayLinksByFuncCalls, mapFuncInfo, currReg->GetId(), allFileNames); + + insertLoopTempalteDeclaration(file, dataDirectives, distrRules, distrRulesSt, allArrays, extract, currReg->GetId()); + } + } + + if (extract) + { + createdDirectives.clear(); + + //clear shadow specs + for (auto& array : declaredArrays) + array.second.first->ClearShadowSpecs(); + } + else if (mpiProgram == 0) + { + set regNum; + for (int z = 0; z < parallelRegions.size(); ++z) + regNum.insert(parallelRegions[z]->GetId()); + insertTemplateModuleUse(file, regNum, arrayLinksByFuncCalls); + } } \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h index 989bef5..e222067 100644 --- a/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h +++ b/sapfor/experts/Sapfor_2017/_src/DirectiveProcessing/insert_directive.h @@ -47,4 +47,17 @@ void insertDistributeDirsToParallelRegions(const std::vector& regNum, const std::map>& arrayLinksByFuncCalls); void removeStatementsFromAllproject(const std::set& variants); -void correctTemplateModuleDeclaration(const std::string& folderName); \ No newline at end of file +void correctTemplateModuleDeclaration(const std::string& folderName); + +void insertParallelDirs(SgFile* file, bool extract, + std::vector& createdDirectives, + std::vector& messages, + std::map& templateDeclInIncludes, + std::map>>& commentsToInclude, + const std::vector& callGraph, + const std::vector& parallelRegions, + const std::map>& loopGraph, + const std::set& allFileNames, + const std::map>& arrayLinksByFuncCalls, + const std::map, std::pair>& declaredArrays, + const std::map>& tableOfUniqNamesByArray); \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp index 8ab8e47..33c7e9b 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -378,68 +378,6 @@ string unparseProjectToString(SgFile *file, const int curr_regime) return unparseProjectIfNeed(file, curr_regime, true, "", NULL, allIncludeFiles, true); } -static bool isNotNullIntersection(const set &first, const set &second) -{ - for (auto &elem1 : first) - if (second.find(elem1) != second.end()) - return true; - - return false; -} - -static set fillDistributedArraysD(const DataDirective& dataDirectives, bool onlyCommon = false) -{ - set distrArrays; - set distrArraysD; - set distrArraysAdded; - - for (int z = 0; z < dataDirectives.distrRules.size(); ++z) - distrArraysD.insert(dataDirectives.distrRules[z].first); - for (int z = 0; z < dataDirectives.alignRules.size(); ++z) - distrArraysD.insert(dataDirectives.alignRules[z].alignArray); - - for (auto& elem : tableOfUniqNamesByArray) - { - set realRefs; - getRealArrayRefs(elem.first, elem.first, realRefs, arrayLinksByFuncCalls); - if (isNotNullIntersection(realRefs, distrArraysD)) - distrArraysAdded.insert(elem.first); - } - - for (auto& elem : distrArraysD) - { - if (onlyCommon) - { - if (elem->GetLocation().first == DIST::l_COMMON) - distrArrays.insert(elem); - } - else - distrArrays.insert(elem); - } - - for (auto& elem : distrArraysAdded) - { - if (onlyCommon) - { - if (elem->GetLocation().first == DIST::l_COMMON) - distrArrays.insert(elem); - } - else - distrArrays.insert(elem); - } - return distrArrays; -} - -static set fillDistributedArrays(const DataDirective &dataDirectives, bool onlyCommon = false, bool shortName = false) -{ - set distrArrays; - set ret = fillDistributedArraysD(dataDirectives, onlyCommon); - - for (auto& elem : ret) - distrArrays.insert(shortName ? elem->GetShortName() : elem->GetName()); - return distrArrays; -} - static bool runAnalysis(SgProject &project, const int curr_regime, const bool need_to_unparse, const char *newVer = NULL, const char *folderName = NULL) { if (PASSES_DONE_INIT == false) @@ -497,6 +435,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne } auto rw_analyzer = ReadWriteAnalyzer(allFuncInfo); // doesn't analyze anything until first query + int global_err = 0; for (int i = n - 1; i >= 0; --i) { @@ -526,7 +465,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { vector tmp; loopAnalyzer(file, parallelRegions, createdArrays, tmp, DATA_DISTR, - allFuncInfo, declaredArrays, declaratedArraysSt, arrayLinksByFuncCalls, createDefUseMapByPlace(), true, &(loopGraph.find(file_name)->second)); + allFuncInfo, declaredArrays, declaratedArraysSt, arrayLinksByFuncCalls, createDefUseMapByPlace(), + true, &(loopGraph.find(file_name)->second)); } else if (curr_regime == LOOP_ANALYZER_DATA_DIST_S1 || curr_regime == ONLY_ARRAY_GRAPH) { @@ -596,113 +536,24 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne verifyOK &= res; } else if (curr_regime == CORRECT_FORMAT_PLACE) - checkAndMoveFormatOperators(file, getObjectForFileFromMap(file_name, SPF_messages), false); + checkAndMoveFormatOperators(file, getObjectForFileFromMap(file_name, SPF_messages), false); else if (curr_regime == CREATE_PARALLEL_DIRS) { auto &loopsInFile = getObjectForFileFromMap(file_name, loopGraph); - map mapLoopsInFile; - createMapLoopGraph(loopsInFile, mapLoopsInFile); + map depInfoForLoopGraphV; + for (auto& elem : depInfoForLoopGraph) + depInfoForLoopGraphV[elem.first] = elem.second; - map mapFuncInfo; - createMapOfFunc(allFuncInfo, mapFuncInfo); - - for (int z = 0; z < parallelRegions.size(); ++z) - { - vector toInsert; - - const DataDirective &dataDirectives = parallelRegions[z]->GetDataDir(); - const vector ¤tVariant = parallelRegions[z]->GetCurrentVariant(); - DIST::GraphCSR &reducedG = parallelRegions[z]->GetReducedGraphToModify(); - DIST::Arrays &allArrays = parallelRegions[z]->GetAllArraysToModify(); - - auto& tmp = dataDirectives.distrRules; - vector> currentVar; - - if (mpiProgram == 0) - { - for (int z1 = 0; z1 < currentVariant.size(); ++z1) - currentVar.push_back(make_pair(tmp[z1].first, &tmp[z1].second[currentVariant[z1]])); - } - else - { - for (auto& loop : mapLoopsInFile) - { - auto& rules = loop.second->getDataDir().distrRules; - for (auto& rule : rules) - currentVar.push_back(make_pair(rule.first, &rule.second[0])); - } - } - - map depInfoForLoopGraphV; - for (auto& elem : depInfoForLoopGraph) - depInfoForLoopGraphV[elem.first] = elem.second; - - selectParallelDirectiveForVariant(new File(file), parallelRegions[z], reducedG, allArrays, loopsInFile, mapLoopsInFile, mapFuncInfo, currentVar, - toInsert, parallelRegions[z]->GetId(), arrayLinksByFuncCalls, - depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages)); - - if (toInsert.size() > 0) - { - auto it = createdDirectives.find(file_name); - if (it == createdDirectives.end()) - createdDirectives.insert(it, make_pair(file_name, toInsert)); - else - for (int m = 0; m < toInsert.size(); ++m) - it->second.push_back(toInsert[m]); - } - } + createParallelDirs(new File(file), createdDirectives, getObjectForFileFromMap(file_name, SPF_messages), + loopsInFile, allFuncInfo, parallelRegions, depInfoForLoopGraphV, arrayLinksByFuncCalls); } else if (curr_regime == INSERT_PARALLEL_DIRS || curr_regime == EXTRACT_PARALLEL_DIRS) { const bool extract = (curr_regime == EXTRACT_PARALLEL_DIRS); - - insertDirectiveToFile(file, file_name, createdDirectives[file_name], extract, getObjectForFileFromMap(file_name, SPF_messages)); - - if (mpiProgram == 0) - { - auto callGraph = getObjectForFileFromMap(file_name, allFuncInfo); - map mapFuncInfo; - createMapOfFunc(callGraph, mapFuncInfo); - - for (int z = 0; z < parallelRegions.size(); ++z) - { - ParallelRegion* currReg = parallelRegions[z]; - - const DataDirective& dataDirectives = currReg->GetDataDir(); - const vector& currentVariant = currReg->GetCurrentVariant(); - const DIST::Arrays& allArrays = currReg->GetAllArrays(); - DIST::GraphCSR& reducedG = currReg->GetReducedGraphToModify(); - - const set distrArrays = fillDistributedArrays(dataDirectives); - const vector distrRules = dataDirectives.GenRule(currentVariant); - const vector> distrRulesSt = dataDirectives.GenRule(currentVariant, 0); - const vector alignRules = dataDirectives.GenAlignsRules(); - - - insertDistributionToFile(file, file_name, dataDirectives, distrArrays, distrRules, distrRulesSt, alignRules, loopGraph, - allArrays, reducedG, commentsToInclude, templateDeclInIncludes, extract, getObjectForFileFromMap(file_name, SPF_messages), - arrayLinksByFuncCalls, mapFuncInfo, currReg->GetId(), allFileNames); - - insertLoopTempalteDeclaration(file, dataDirectives, distrRules, distrRulesSt, allArrays, extract, currReg->GetId()); - } - } - - if (extract) - { - createdDirectives[file_name].clear(); - - //clear shadow specs - for (auto& array : declaredArrays) - array.second.first->ClearShadowSpecs(); - } - else if (mpiProgram == 0) - { - set regNum; - for (int z = 0; z < parallelRegions.size(); ++z) - regNum.insert(parallelRegions[z]->GetId()); - insertTemplateModuleUse(file, regNum, arrayLinksByFuncCalls); - } + insertParallelDirs(file, extract, createdDirectives[file_name], getObjectForFileFromMap(file_name, SPF_messages), + templateDeclInIncludes, commentsToInclude, getObjectForFileFromMap(file_name, allFuncInfo), + parallelRegions, loopGraph, allFileNames, arrayLinksByFuncCalls, declaredArrays, tableOfUniqNamesByArray); } else if (curr_regime == LOOP_ANALYZER_NODIST) { @@ -734,7 +585,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, arrayLinksByFuncCalls, depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages)); + toInsert, arrayLinksByFuncCalls, depInfoForLoopGraphV, getObjectForFileFromMap(file_name, SPF_messages)); if (toInsert.size() > 0) { @@ -758,7 +609,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne DataDirective &dataDirectives = currReg->GetDataDirToModify(); DIST::GraphCSR &reducedG = parallelRegions[z]->GetReducedGraphToModify(); - set distrArraysF = fillDistributedArrays(dataDirectives); + set distrArraysF = fillDistributedArrays(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls); set distrArrays; for (auto& elem : distrArraysF) @@ -775,7 +626,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { ParallelRegion* currReg = parallelRegions[z]; DataDirective& dataDirectives = currReg->GetDataDirToModify(); - const set distrCommonArrays = fillDistributedArraysD(dataDirectives, true); + const set distrCommonArrays = fillDistributedArraysD(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls, true); insertRealignsBeforeFragments(currReg, file, distrCommonArrays, arrayLinksByFuncCalls); } } @@ -1183,7 +1034,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne unparseProjectIfNeed(file, curr_regime, need_to_unparse, newVer, folderName, allIncludeFiles); } // end of FOR by files - + if (internalExit < 0) throw -1; diff --git a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp index e5be7e9..013f3c6 100644 --- a/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Transformations/private_arrays_resizing.cpp @@ -386,12 +386,26 @@ static SgSymbol* alterShrinkArrayDeclaration(SgStatement *declarationStatement, static void extendArrayRefsInExpr(const vector& indexes, SgExpression* expr, SgSymbol* arraySymbol, SgSymbol* newArraySymbol, - const vector& lowBounds) + const vector& lowBounds, int line) { if (expr) { - extendArrayRefsInExpr(indexes, expr->lhs(), arraySymbol, newArraySymbol, lowBounds); - extendArrayRefsInExpr(indexes, expr->rhs(), arraySymbol, newArraySymbol, lowBounds); + if (expr->variant() == FUNC_CALL) + { + SgFunctionCallExp* call = isSgFunctionCallExp(expr); + for (int arg = 0; arg < call->numberOfArgs(); ++arg) + { + auto argRef = call->arg(arg); + if ((isArrayRef(argRef) || argRef->variant() == VAR_REF) && isEqSymbols(argRef->symbol(), arraySymbol)) + { + __spf_print(1, "unsupported private array extension under call on line %d\n", line); + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + } + } + } + + extendArrayRefsInExpr(indexes, expr->lhs(), arraySymbol, newArraySymbol, lowBounds, line); + extendArrayRefsInExpr(indexes, expr->rhs(), arraySymbol, newArraySymbol, lowBounds, line); if (isArrayRef(expr) && isEqSymbols(arraySymbol, expr->symbol())) extendArrayRef(indexes, expr, newArraySymbol, lowBounds); @@ -426,7 +440,7 @@ static void extendArrayRefs(const vector &indexes, SgStatement *st, S } if (st->expr(i)) - extendArrayRefsInExpr(indexes, st->expr(i), arraySymbol, newArraySymbol, lowBounds); + extendArrayRefsInExpr(indexes, st->expr(i), arraySymbol, newArraySymbol, lowBounds, st->lineNumber()); } } diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp index 3accd34..c6d98a5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.cpp @@ -1575,3 +1575,71 @@ vector splitAndArgvCreate(const string& options) } return optSplited1; } + +static bool isNotNullIntersection(const set& first, const set& second) +{ + for (auto& elem1 : first) + if (second.find(elem1) != second.end()) + return true; + + return false; +} + +set fillDistributedArraysD(const DataDirective& dataDirectives, + const map>& tableOfUniqNamesByArray, + const map>& arrayLinksByFuncCalls, + bool onlyCommon) +{ + set distrArrays; + set distrArraysD; + set distrArraysAdded; + + for (int z = 0; z < dataDirectives.distrRules.size(); ++z) + distrArraysD.insert(dataDirectives.distrRules[z].first); + for (int z = 0; z < dataDirectives.alignRules.size(); ++z) + distrArraysD.insert(dataDirectives.alignRules[z].alignArray); + + for (auto& elem : tableOfUniqNamesByArray) + { + set realRefs; + getRealArrayRefs(elem.first, elem.first, realRefs, arrayLinksByFuncCalls); + if (isNotNullIntersection(realRefs, distrArraysD)) + distrArraysAdded.insert(elem.first); + } + + for (auto& elem : distrArraysD) + { + if (onlyCommon) + { + if (elem->GetLocation().first == DIST::l_COMMON) + distrArrays.insert(elem); + } + else + distrArrays.insert(elem); + } + + for (auto& elem : distrArraysAdded) + { + if (onlyCommon) + { + if (elem->GetLocation().first == DIST::l_COMMON) + distrArrays.insert(elem); + } + else + distrArrays.insert(elem); + } + return distrArrays; +} + +set fillDistributedArrays(const DataDirective& dataDirectives, + const map>& tableOfUniqNamesByArray, + const map>& arrayLinksByFuncCalls, + bool onlyCommon, bool shortName) +{ + set distrArrays; + set ret = fillDistributedArraysD(dataDirectives, tableOfUniqNamesByArray, arrayLinksByFuncCalls, onlyCommon); + + for (auto& elem : ret) + distrArrays.insert(shortName ? elem->GetShortName() : elem->GetName()); + return distrArrays; +} \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/utils.h b/sapfor/experts/Sapfor_2017/_src/Utils/utils.h index e878329..df8e325 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/utils.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/utils.h @@ -4,10 +4,11 @@ #include #include +struct DataDirective; namespace Distribution { class Array; - class ArrayAccessInfo; + class ArrayAccessInfo; template class Arrays; } namespace DIST = Distribution; @@ -90,3 +91,6 @@ std::wstring fixedLongFormat(const wchar_t* old); std::map sortArraysByName(const std::set& toSort); bool createDirectory(const std::string& name); std::vector splitAndArgvCreate(const std::string& options); + +std::set fillDistributedArraysD(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false); +std::set fillDistributedArrays(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false, bool shortName = false); diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/version.h b/sapfor/experts/Sapfor_2017/_src/Utils/version.h index fabd458..931f5d8 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/version.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2292" +#define VERSION_SPF "2293"