fixed shared memory parallelization

This commit is contained in:
ALEXks
2025-07-05 20:49:23 +03:00
parent feafa43f32
commit 29ece9072e
11 changed files with 117 additions and 186 deletions

View File

@@ -33,6 +33,7 @@ include_directories(src/Distribution)
include_directories(src/GraphCall) include_directories(src/GraphCall)
include_directories(src/GraphLoop) include_directories(src/GraphLoop)
include_directories(src/Transformations/ExpressionSubstitution) include_directories(src/Transformations/ExpressionSubstitution)
include_directories(src/Transformations)
#Sage lib includes #Sage lib includes
include_directories(${fdvm_include}) include_directories(${fdvm_include})

View File

@@ -22,7 +22,7 @@
#include "SgUtils.h" #include "SgUtils.h"
#include "../Sapfor.h" #include "../Sapfor.h"
#include "graph_loops_func.h" #include "graph_loops_func.h"
#include "../Transformations/LoopNesting/loop_transform.h" #include "LoopNesting/loop_transform.h"
#include "expr_transform.h" #include "expr_transform.h"
#include "graph_calls_func.h" #include "graph_calls_func.h"

View File

@@ -10,7 +10,7 @@
#include "../ParallelizationRegions/ParRegions.h" #include "../ParallelizationRegions/ParRegions.h"
#include "../Distribution/Arrays.h" #include "../Distribution/Arrays.h"
#include "../Transformations/LoopNesting/loop_transform.h" #include "LoopNesting/loop_transform.h"
#include "errors.h" #include "errors.h"
#include "directive_parser.h" #include "directive_parser.h"

View File

@@ -11,9 +11,9 @@
#include "DvmhRegionInserter.h" #include "DvmhRegionInserter.h"
#include "DvmhRegions/RegionsMerger.h" #include "DvmhRegions/RegionsMerger.h"
#include "../VerificationCode/verifications.h" #include "../VerificationCode/verifications.h"
#include "../Transformations/FunctionPurifying/function_purifying.h"
#include "../LoopAnalyzer/loop_analyzer.h" #include "../LoopAnalyzer/loop_analyzer.h"
#include "../DirectiveProcessing/directive_parser.h" #include "../DirectiveProcessing/directive_parser.h"
#include "FunctionPurifying/function_purifying.h"
using namespace std; using namespace std;
@@ -794,154 +794,6 @@ ArraySet DvmhRegionInserter::get_used_arrs_for_block(SgStatement* st, int usage_
return usages; return usages;
} }
static bool filterFromList(SgStatement* st, const set<string>& idents, bool exclude = false)
{
bool empty = false;
SgExpression* list = st->expr(0);
vector<SgExpression*> newList;
int total = 0;
while (list)
{
if (exclude)
{
if (idents.find(list->lhs()->symbol()->identifier()) == idents.end())
newList.push_back(list->lhs());
}
else
{
if (idents.find(list->lhs()->symbol()->identifier()) != idents.end())
newList.push_back(list->lhs());
}
total++;
list = list->rhs();
}
if (newList.size() == 0)
empty = true;
else if (total != newList.size())
st->setExpression(0, makeExprList(newList));
return empty;
}
static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
{
string oldFile = current_file->filename();
if (!func->switchToFile())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto copy = duplicateProcedure(func, NULL, false, false, false, true);
const set<string> idents(pars.identificators.begin(), pars.identificators.end());
bool need = (func->symbol()->identifier() == string("bl182"));
//remove all exec
SgStatement* st = copy->lexNext();
SgStatement* last = copy->lastNodeOfStmt();
vector<SgStatement*> toExtract;
while (st != last)
{
if (isDVM_stat(st) || isSPF_stat(st))
{
if (st->variant() != ACC_ROUTINE_DIR)
{
toExtract.push_back(st);
st = st->lexNext();
}
else
st = st->lexNext();
}
else if (isSgExecutableStatement(st))
{
SgStatement* next = st->lastNodeOfStmt();
if (next != last)
next = next->lexNext();
toExtract.push_back(st);
st = next;
}
else
st = st->lexNext();
}
//remove unused declarations
st = copy->lexNext();
while (st != last)
{
const int var = st->variant();
if (var == VAR_DECL
|| var == VAR_DECL_90
|| var == DIM_STAT
|| var == INTENT_STMT
|| var == EXTERN_STAT)
{
bool empty = filterFromList(st, idents);
if (empty)
{
toExtract.push_back(st);
st = st->lexNext();
continue;
}
}
else if (!isDVM_stat(st) && !isSPF_stat(st))
toExtract.push_back(st);
if (st->variant() == CONTAINS_STMT)
break;
st = st->lexNext();
}
for (auto& elem : toExtract)
elem->extractStmt();
string retVal = copy->unparse();
if (SgFile::switchToFile(oldFile) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
return retVal;
}
static void insertInterface(SgStatement* func, const string& iface, const string& fName)
{
string oldFile = current_file->filename();
if (!func->switchToFile())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
SgStatement* st = func->lexNext();
SgStatement* last = func->lastNodeOfStmt();
while (st != last)
{
if (st->variant() == VAR_DECL || st->variant() == VAR_DECL_90)
{
bool empty = filterFromList(st, { fName }, true);
if (empty)
{
SgStatement* next = st->lexNext();
st->extractStmt();
st = next;
continue;
}
}
if (isSgExecutableStatement(st))
break;
st = st->lexNext();
}
SgStatement* ifaceBlock = new SgStatement(INTERFACE_STMT);
addControlEndToStmt(ifaceBlock->thebif);
ifaceBlock->setlineNumber(getNextNegativeLineNumber()); // st->lineNumber()
ifaceBlock->setFileName(st->fileName());
st->insertStmtBefore(*ifaceBlock, *st->controlParent());
ifaceBlock->lastNodeOfStmt()->addComment(iface.c_str());
if (SgFile::switchToFile(oldFile) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
}
static LoopGraph* getParallelLoop(LoopGraph* loop) static LoopGraph* getParallelLoop(LoopGraph* loop)
{ {
auto prev_st = loop->loop->lexPrev(); auto prev_st = loop->loop->lexPrev();
@@ -1172,7 +1024,7 @@ static bool isPure(SgStatement* func)
void DvmhRegionInserter::createInterfaceBlockForOutCall(FuncInfo* func, FuncInfo* callFrom) void DvmhRegionInserter::createInterfaceBlockForOutCall(FuncInfo* func, FuncInfo* callFrom)
{ {
insertInterface(func->funcPointer, getInterfaceBlock(callFrom->funcPointer->GetOriginal(), callFrom->funcParams), callFrom->funcName); insertInterface(func->funcPointer, callFrom);
} }
void DvmhRegionInserter::createInterfaceBlockForParallelFunctions(bool onlyRoutine) void DvmhRegionInserter::createInterfaceBlockForParallelFunctions(bool onlyRoutine)

View File

@@ -31,7 +31,7 @@
#include "../DirectiveProcessing/directive_parser.h" #include "../DirectiveProcessing/directive_parser.h"
#include "../DynamicAnalysis/gCov_parser_func.h" #include "../DynamicAnalysis/gCov_parser_func.h"
#include "../Transformations/VectorAssignToLoop/array_assign_to_loop.h" #include "VectorAssignToLoop/array_assign_to_loop.h"
using std::vector; using std::vector;
using std::map; using std::map;

View File

@@ -48,7 +48,7 @@ extern int passDone;
#include "../VisualizerCalls/get_information.h" #include "../VisualizerCalls/get_information.h"
#include "../VisualizerCalls/SendMessage.h" #include "../VisualizerCalls/SendMessage.h"
#include "../Transformations/LoopEndDoConverter/enddo_loop_converter.h" #include "LoopEndDoConverter/enddo_loop_converter.h"
#include "../DirectiveProcessing/remote_access.h" #include "../DirectiveProcessing/remote_access.h"
#include "../DirectiveProcessing/directive_omp_parser.h" #include "../DirectiveProcessing/directive_omp_parser.h"

View File

@@ -18,7 +18,7 @@
#include "../DirectiveProcessing/insert_directive.h" #include "../DirectiveProcessing/insert_directive.h"
#include "SgUtils.h" #include "SgUtils.h"
#include "expr_transform.h" #include "expr_transform.h"
#include "../Transformations/FunctionPurifying/function_purifying.h" #include "FunctionPurifying/function_purifying.h"
using std::map; using std::map;
using std::pair; using std::pair;

View File

@@ -1281,6 +1281,8 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
detectCopies(allFuncInfo); detectCopies(allFuncInfo);
fillInterfaceBlock(allFuncInfo); fillInterfaceBlock(allFuncInfo);
intentInsertToInterfaces(allFuncInfo); intentInsertToInterfaces(allFuncInfo);
if (sharedMemoryParallelization != 1)
createInterfacesForAssumedSize(allFuncInfo); createInterfacesForAssumedSize(allFuncInfo);
//this call is only for testing //this call is only for testing
@@ -2632,7 +2634,10 @@ int main(int argc, char **argv)
} }
if (curr_regime == INSERT_PARALLEL_DIRS_NODIST) if (curr_regime == INSERT_PARALLEL_DIRS_NODIST)
{
ignoreArrayDistributeState = true; ignoreArrayDistributeState = true;
sharedMemoryParallelization = 1;
}
if (runAsClient) if (runAsClient)
{ {

View File

@@ -1388,6 +1388,37 @@ static string makeName(SgSymbol* var, map<SgSymbol*, set< SgSymbol*>>& modVarsTo
return name; return name;
} }
static bool filterFromList(SgStatement* st, const set<string>& idents, bool exclude = false)
{
bool empty = false;
SgExpression* list = st->expr(0);
vector<SgExpression*> newList;
int total = 0;
while (list)
{
if (exclude)
{
if (idents.find(list->lhs()->symbol()->identifier()) == idents.end())
newList.push_back(list->lhs());
}
else
{
if (idents.find(list->lhs()->symbol()->identifier()) != idents.end())
newList.push_back(list->lhs());
}
total++;
list = list->rhs();
}
if (newList.size() == 0)
empty = true;
else if (total != newList.size())
st->setExpression(0, makeExprList(newList));
return empty;
}
static string getInterfaceBlock(SgStatement* func, const FuncParam& pars) static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
{ {
string oldFile = current_file->filename(); string oldFile = current_file->filename();
@@ -1395,22 +1426,21 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
auto copy = duplicateProcedure(func, NULL, false, false, false, true); auto copy = duplicateProcedure(func, NULL, false, false, false, true);
const set<string> idents(pars.identificators.begin(), pars.identificators.end());
const set<string> ident(pars.identificators.begin(), pars.identificators.end());
//remove all exec //remove all exec
SgStatement* st = copy->lexNext(); SgStatement* st = copy->lexNext();
SgStatement* last = copy->lastNodeOfStmt(); SgStatement* last = copy->lastNodeOfStmt();
vector<SgStatement*> toExtract; vector<SgStatement*> toExtract;
while (st != last) while (st != last)
{ {
if (isDVM_stat(st) || isSPF_stat(st)) if (isDVM_stat(st) || isSPF_stat(st))
{ {
if (st->variant() != ACC_ROUTINE_DIR) if (st->variant() != ACC_ROUTINE_DIR)
{ {
SgStatement* next = st->lexNext(); toExtract.push_back(st);
st->extractStmt(); st = st->lexNext();
st = next;
} }
else else
st = st->lexNext(); st = st->lexNext();
@@ -1431,31 +1461,20 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
st = copy->lexNext(); st = copy->lexNext();
while (st != last) while (st != last)
{ {
if (st->variant() == VAR_DECL const int var = st->variant();
|| st->variant() == VAR_DECL_90
|| st->variant() == DIM_STAT
|| st->variant() == INTENT_STMT)
{
SgExpression* list = st->expr(0);
vector<SgExpression*> newList;
while (list)
{
if (ident.find(list->lhs()->symbol()->identifier()) != ident.end())
newList.push_back(list->lhs());
list = list->rhs();
}
if (newList.size() == 0) if (var == VAR_DECL || var == VAR_DECL_90 || var == DIM_STAT ||
var == INTENT_STMT || var == EXTERN_STAT)
{
bool empty = filterFromList(st, idents);
if (empty)
{ {
SgStatement* next = st->lexNext();
toExtract.push_back(st); toExtract.push_back(st);
st = next; st = st->lexNext();
continue; continue;
} }
else
st->setExpression(0, makeExprList(newList));
} }
else else if (!isDVM_stat(st) && !isSPF_stat(st))
toExtract.push_back(st); toExtract.push_back(st);
if (st->variant() == CONTAINS_STMT) if (st->variant() == CONTAINS_STMT)
@@ -1466,16 +1485,56 @@ static string getInterfaceBlock(SgStatement* func, const FuncParam& pars)
for (auto& elem : toExtract) for (auto& elem : toExtract)
elem->extractStmt(); elem->extractStmt();
string retVal = copy->unparse(); string codeString = copy->unparse();
if (SgFile::switchToFile(oldFile) == -1) if (SgFile::switchToFile(oldFile) == -1)
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
//insert tabs
const string tab = " ";
const int countEnds = std::count(codeString.begin(), codeString.end(), '\n');
string retVal = " ";
retVal.reserve(retVal.size() + codeString.size() + countEnds * tab.size());
for (int z = 0, ends = 0; z < codeString.size(); ++z)
{
retVal += codeString[z];
if (codeString[z] == '\n')
{
ends++;
if (ends == countEnds)
continue;
int p = z + 1;
while (codeString[p] == ' ' && p < codeString.size())
++p;
auto start = p;
auto end = string::npos;
auto sub = codeString.find("subroutine", p);
auto func = codeString.find("function", p);
auto end_sub = codeString.find("end subroutine", p);
auto end_func = codeString.find("end function", p);
if (sub != end && sub == start || end_sub != end && end_sub == start ||
func != end && func == start || end_func != end && end_func == start)
{
retVal += " ";
}
else
retVal += tab;
}
}
return retVal; return retVal;
} }
static void insertInterface(SgStatement* func, const string& iface) void insertInterface(SgStatement* func, const FuncInfo *callFrom)
{ {
const string& iface = getInterfaceBlock(callFrom->funcPointer->GetOriginal(), callFrom->funcParams);
const string& fName = callFrom->funcName;
string oldFile = current_file->filename(); string oldFile = current_file->filename();
if (!func->switchToFile()) if (!func->switchToFile())
printInternalError(convertFileName(__FILE__).c_str(), __LINE__); printInternalError(convertFileName(__FILE__).c_str(), __LINE__);
@@ -1484,6 +1543,18 @@ static void insertInterface(SgStatement* func, const string& iface)
SgStatement* last = func->lastNodeOfStmt(); SgStatement* last = func->lastNodeOfStmt();
while (st != last) while (st != last)
{ {
if (st->variant() == VAR_DECL || st->variant() == VAR_DECL_90)
{
bool empty = filterFromList(st, { fName }, true);
if (empty)
{
SgStatement* next = st->lexNext();
st->extractStmt();
st = next;
continue;
}
}
if (isSgExecutableStatement(st)) if (isSgExecutableStatement(st))
break; break;
st = st->lexNext(); st = st->lexNext();
@@ -1491,7 +1562,7 @@ static void insertInterface(SgStatement* func, const string& iface)
SgStatement* ifaceBlock = new SgStatement(INTERFACE_STMT); SgStatement* ifaceBlock = new SgStatement(INTERFACE_STMT);
addControlEndToStmt(ifaceBlock->thebif); addControlEndToStmt(ifaceBlock->thebif);
ifaceBlock->setlineNumber(st->lineNumber()); ifaceBlock->setlineNumber(getNextNegativeLineNumber());
ifaceBlock->setFileName(st->fileName()); ifaceBlock->setFileName(st->fileName());
st->insertStmtBefore(*ifaceBlock, *st->controlParent()); st->insertStmtBefore(*ifaceBlock, *st->controlParent());
ifaceBlock->lastNodeOfStmt()->addComment(iface.c_str()); ifaceBlock->lastNodeOfStmt()->addComment(iface.c_str());
@@ -1507,7 +1578,7 @@ static void createInterfaceBlockForToCalls(FuncInfo* func)
if (callTo->interfaceBlocks.find(func->funcName) == callTo->interfaceBlocks.end()) if (callTo->interfaceBlocks.find(func->funcName) == callTo->interfaceBlocks.end())
{ {
callTo->interfaceBlocks[func->funcName] = func; callTo->interfaceBlocks[func->funcName] = func;
insertInterface(callTo->funcPointer, getInterfaceBlock(func->funcPointer->GetOriginal(), func->funcParams)); insertInterface(callTo->funcPointer, func);
} }
} }
} }

View File

@@ -14,3 +14,5 @@ void setPureStatus(const std::map<std::string, std::vector<FuncInfo*>>& allFuncI
void commonTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo, const std::map<std::string, CommonBlock*>& commonBlocks); void commonTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo, const std::map<std::string, CommonBlock*>& commonBlocks);
void saveTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo); void saveTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);
void moduleTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo); void moduleTransfer(const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo);
void insertInterface(SgStatement* func, const FuncInfo* callFrom);

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define VERSION_SPF "2433" #define VERSION_SPF "2434"