From c50bb82a48cdb6548434f503176c977070bb9323 Mon Sep 17 00:00:00 2001 From: mkoch Date: Tue, 26 Sep 2023 20:48:41 +0300 Subject: [PATCH 1/3] fix applyRemovals for pass manager --- .../Sapfor_2017/_src/Utils/PassManager.h | 53 +++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index c02e607..b83997c 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -99,23 +99,58 @@ public: } void applyRemovals() { - set to_process = { name }, processed; + map> to_process, processed; + to_process[name] = {}; while (!to_process.empty()) { - set to_process_next; + map> to_process_next; for (const auto& pass : to_process) { - if (processed.insert(pass).second) { - auto removals_it = passRemovals.find(pass); - auto deps_it = passDeps->find(pass); + auto processed_it = processed.find(pass.first); + auto& done_removals = processed_it != processed.end() ? processed_it->second : processed[pass.first]; + + set removals_to_do; + bool process_pass = false; + + if (processed_it == processed.end()) { + removals_to_do = done_removals = pass.second; + process_pass = true; + } + else { + const auto& needed_removals = pass.second; + + set_difference(needed_removals.begin(), needed_removals.end(), done_removals.begin(), done_removals.end(), + inserter(removals_to_do, removals_to_do.begin())); + process_pass = needed_removals.size() != 0; + + done_removals.insert(removals_to_do.begin(), removals_to_do.end()); + } + + if (process_pass) { + processed[pass.first] = pass.second; + + auto removals_it = passRemovals.find(pass.first); - if (removals_it != passRemovals.end() && deps_it != passDeps->end()) { - auto& removals = removals_it->second; + if (removals_it != passRemovals.end()) { + auto& removals_saved = removals_it->second; + + set add; + set_difference(removals_saved.begin(), removals_saved.end(), done_removals.begin(), done_removals.end(), + inserter(add, add.begin())); + + done_removals.insert(add.begin(), add.end()); + removals_to_do.insert(add.begin(), add.end()); + } + + auto deps_it = passDeps->find(pass.first); + + if (deps_it != passDeps->end()) { auto& deps = deps_it->second; + for (auto dep_it = deps.begin(); dep_it != deps.end();) { - if (removals.find(*dep_it) == removals.end()) - to_process_next.insert(*(dep_it++)); + if (removals_to_do.find(*dep_it) == removals_to_do.end()) + to_process_next[*(dep_it++)].insert(removals_to_do.begin(), removals_to_do.end()); else dep_it = deps.erase(dep_it); } -- 2.49.1 From 377e60df7805bc618d9ae674ed6594e5285cfee7 Mon Sep 17 00:00:00 2001 From: mkoch Date: Tue, 26 Sep 2023 22:13:21 +0300 Subject: [PATCH 2/3] code style improvements --- .../Sapfor_2017/_src/Utils/PassManager.h | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h index b83997c..7b584e5 100644 --- a/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h +++ b/sapfor/experts/Sapfor_2017/_src/Utils/PassManager.h @@ -98,7 +98,8 @@ public: list({ *this }) -= list({ right }); } - void applyRemovals() { + void applyRemovals() + { map> to_process, processed; to_process[name] = {}; @@ -106,18 +107,21 @@ public: { map> to_process_next; - for (const auto& pass : to_process) { + for (const auto& pass : to_process) + { auto processed_it = processed.find(pass.first); auto& done_removals = processed_it != processed.end() ? processed_it->second : processed[pass.first]; set removals_to_do; bool process_pass = false; - if (processed_it == processed.end()) { + if (processed_it == processed.end()) + { removals_to_do = done_removals = pass.second; process_pass = true; } - else { + else + { const auto& needed_removals = pass.second; set_difference(needed_removals.begin(), needed_removals.end(), done_removals.begin(), done_removals.end(), @@ -127,12 +131,14 @@ public: done_removals.insert(removals_to_do.begin(), removals_to_do.end()); } - if (process_pass) { + if (process_pass) + { processed[pass.first] = pass.second; auto removals_it = passRemovals.find(pass.first); - if (removals_it != passRemovals.end()) { + if (removals_it != passRemovals.end()) + { auto& removals_saved = removals_it->second; set add; @@ -145,10 +151,12 @@ public: auto deps_it = passDeps->find(pass.first); - if (deps_it != passDeps->end()) { + if (deps_it != passDeps->end()) + { auto& deps = deps_it->second; - for (auto dep_it = deps.begin(); dep_it != deps.end();) { + for (auto dep_it = deps.begin(); dep_it != deps.end();) + { if (removals_to_do.find(*dep_it) == removals_to_do.end()) to_process_next[*(dep_it++)].insert(removals_to_do.begin(), removals_to_do.end()); else -- 2.49.1 From bd17dde9b051e0e7c04d568eabb0dc1528b41a68 Mon Sep 17 00:00:00 2001 From: mkoch Date: Tue, 26 Sep 2023 22:45:09 +0300 Subject: [PATCH 3/3] added error if no directives were inserted --- .../_src/GraphCall/select_array_conf.cpp | 76 +++++++++++++++++++ .../_src/GraphCall/select_array_conf.h | 7 +- sapfor/experts/Sapfor_2017/_src/Sapfor.cpp | 1 + 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp index 6774907..9ec630e 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.cpp @@ -1,10 +1,12 @@ #include "select_array_conf.h" +#include "../Utils/utils.h" using std::map; using std::string; using std::vector; using std::set; using std::pair; +using std::wstring; using std::inserter; using std::copy; @@ -229,3 +231,77 @@ void SelectArrayConfForParallelization(SgProject* proj, map>& createdDirectives, + vector& parallelRegions, + const map>& allFuncInfo, + map>& SPF_messages) +{ + set empty_regs(parallelRegions.begin(), parallelRegions.end()); + + for (const auto& byFile : createdDirectives) + for (const auto& dir : byFile.second) + empty_regs.erase(getRegionByLine(parallelRegions, byFile.first, dir->line)); + + set idxToDel; + for (int z = 0; z < parallelRegions.size(); ++z) + { + if (empty_regs.find(parallelRegions[z]) != empty_regs.end()) + { + __spf_print(1, " no parallel directives for parallel region '%s'\n", parallelRegions[z]->GetName().c_str()); + + if (parallelRegions[z]->GetId() == 0) // DEFAULT + { + wstring bufE, bufR; + __spf_printToLongBuf(bufE, L"Can not find arrays or free loops for distribution in this project"); + __spf_printToLongBuf(bufR, R130); + + for (auto& funcByFile : allFuncInfo) + { + vector& fileM = getObjectForFileFromMap(funcByFile.first.c_str(), SPF_messages); + for (auto& func : funcByFile.second) + { + auto stat = func->funcPointer->GetOriginal(); + if (stat->variant() == PROG_HEDR) + fileM.push_back(Messages(ERROR, stat->lineNumber(), bufR, bufE, 3010)); + } + } + } + else + { + wstring bufE, bufR; + __spf_printToLongBuf(bufE, L"Can not find arrays or free loops for distribution in this region"); + __spf_printToLongBuf(bufR, R131); + + for (auto& linesByFile : parallelRegions[z]->GetAllLines()) + { + vector& fileM = getObjectForFileFromMap(linesByFile.first.c_str(), SPF_messages); + for (auto& lines : linesByFile.second) + if (!lines.isImplicit()) + fileM.push_back(Messages(ERROR, lines.lines.first, bufR, bufE, 3010)); + } + } + idxToDel.insert(z); + } + } + + vector newParReg; + for (int z = 0; z < parallelRegions.size(); ++z) + { + if (idxToDel.find(z) != idxToDel.end()) + { + ParallelRegion* regToDel = parallelRegions[z]; +#ifdef _WIN32 + removeFromCollection(parallelRegions[z]); +#endif + delete parallelRegions[z]; + } + else + newParReg.push_back(parallelRegions[z]); + } + parallelRegions.clear(); + parallelRegions = newParReg; + + if (parallelRegions.size() == 0) + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); +} \ No newline at end of file diff --git a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h index ac6cffd..cb35893 100644 --- a/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h +++ b/sapfor/experts/Sapfor_2017/_src/GraphCall/select_array_conf.h @@ -14,4 +14,9 @@ void SelectArrayConfForParallelization(SgProject* proj, std::map>& loopGraph, std::map>& createdDirectives, std::map>& allMessages, - const std::map>& arrayLinksByFuncCalls, const std::vector& regions); \ No newline at end of file + const std::map>& arrayLinksByFuncCalls, const std::vector& regions); + +void removeRegionsWithoutDirs(const std::map>& createdDirectives, + std::vector& parallelRegions, + const std::map>& allFuncInfo, + std::map>& SPF_messages); \ 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 81ec7bb..9dda347 100644 --- a/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp +++ b/sapfor/experts/Sapfor_2017/_src/Sapfor.cpp @@ -2179,6 +2179,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne map> localMessages; SelectArrayConfForParallelization(&project, allFuncInfo, loopGraph, createdDirectives, localMessages, arrayLinksByFuncCalls, parallelRegions); + removeRegionsWithoutDirs(createdDirectives, parallelRegions, allFuncInfo, SPF_messages); } const float elapsed = duration_cast(high_resolution_clock::now() - timeForPass).count() / 1000.; -- 2.49.1