improved shared memory parallelization

This commit is contained in:
ALEXks
2024-05-03 16:32:39 +03:00
parent 2292a37a15
commit 0197fd3a4b
4 changed files with 396 additions and 14 deletions

View File

@@ -81,7 +81,7 @@ static void preventLoopsFromParallelizations(LoopGraph* loop, const set<DIST::Ar
loop->usedArraysAll.begin(), loop->usedArraysAll.end(),
back_inserter(conflict_arrays));
for(DIST::Array* conflict_array: conflict_arrays)
for(auto& conflict_array : conflict_arrays)
{
// constructing string with array and it's sizes
string array_bounds;
@@ -90,11 +90,7 @@ static void preventLoopsFromParallelizations(LoopGraph* loop, const set<DIST::Ar
{
if(i != 0)
array_bounds += ",";
const auto& bounds_pair = array_sizes[i];
array_bounds += bounds_pair.first >= 0 ? to_string(bounds_pair.first) : "*";
array_bounds += ":";
array_bounds += bounds_pair.second >= 0 ? to_string(bounds_pair.second) : "*";
array_bounds += "*";
}
string array_ref = conflict_array->GetShortName() + "(" + array_bounds + ")";
@@ -219,7 +215,16 @@ void SelectArrayConfForParallelization(SgProject* proj, map<string, vector<FuncI
set<DIST::Array*> realRefs;
getRealArrayRefs(arr, arr, realRefs, arrayLinksByFuncCalls);
int num_of_dims = arr->GetDimSize();
bool fullUnknownSizes = true;
for (auto& dim : arr->GetSizes())
{
if (dim.first == dim.second && dim.first != -1)
fullUnknownSizes = false;
}
if (fullUnknownSizes && realRefs.find(arr) != realRefs.end())
continue;
for(DIST::Array* ref : realRefs)
usedArrays[ref][DimConf(arr)][byFunc.first].insert(arr);
}

View File

@@ -1336,7 +1336,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne
detectCopies(allFuncInfo);
fillInterfaceBlock(allFuncInfo);
intentInsertToInterfaces(allFuncInfo);
//createInterfacesForAssumedSize(allFuncInfo);
createInterfacesForAssumedSize(allFuncInfo);
//this call is only for testing
//setPureStatus(allFuncInfo);

View File

@@ -30,6 +30,8 @@ using std::wstring;
using std::make_pair;
using std::to_string;
static bool isIntrincis(const string& name);
void insertIntrinsicStat(const vector<FuncInfo*>& allFuncInfo)
{
for (auto& func : allFuncInfo)
@@ -59,7 +61,7 @@ void insertIntrinsicStat(const vector<FuncInfo*>& allFuncInfo)
if (intrincis.find(name) != intrincis.end())
continue;
if (!isIntrinsicFunctionName(name.c_str()))
if (!isIntrincis(name))
continue;
void* ptr = call.pointerDetailCallsFrom.first;
@@ -123,14 +125,15 @@ void createInterfacesForOutCalls(FuncInfo* func)
}
}
static bool changeIfHasStarRange(SgExpression* arrayDecl)
static bool changeIfHasStarRange(SgExpression* arrayDecl, bool doReplace = false)
{
SgExpression* list = arrayDecl->lhs();
bool has = false;
bool has = doReplace;
while (list)
{
if (list->lhs()->variant() == STAR_RANGE)
const int var = list->lhs()->variant();
if (var == STAR_RANGE)
has = true;
list = list->rhs();
}
@@ -148,6 +151,43 @@ static bool changeIfHasStarRange(SgExpression* arrayDecl)
return has;
}
static void removeExternalStat(SgStatement* func, const set<string>& addedInterfaceFor)
{
vector<SgStatement*> toRem;
for (auto st = func; st != func->lastNodeOfStmt(); st = st->lexNext())
{
if (isSgExecutableStatement(st))
break;
if (st->variant() == CONTAINS_STMT)
break;
if (st->variant() == EXTERN_STAT)
{
vector<SgExpression*> list;
SgExpression* ex = st->expr(0);
int count = 0;
while (ex)
{
if (addedInterfaceFor.find(ex->lhs()->symbol()->identifier()) == addedInterfaceFor.end())
list.push_back(ex->lhs());
count++;
ex = ex->rhs();
}
if (count == list.size())
continue;
if (list.size() == 0)
toRem.push_back(st);
else
st->setExpression(0, makeExprList(list, false));
}
}
for (auto& rem : toRem)
rem->deleteStmt();
}
void createInterfacesForAssumedSize(const map<string, vector<FuncInfo*>>& allFuncInfo)
{
set<FuncInfo*> hasAssumedSizeArrays;
@@ -163,6 +203,8 @@ void createInterfacesForAssumedSize(const map<string, vector<FuncInfo*>>& allFun
if (prog == NULL)
continue;
vector<SgExpression*> arrayRefs;
bool hasRefs = false;
for (int z = 0; z < func->funcParams.countOfPars; ++z)
{
if (func->funcParams.parametersT[z] == ARRAY_T)
@@ -181,7 +223,12 @@ void createInterfacesForAssumedSize(const map<string, vector<FuncInfo*>>& allFun
if (list->lhs() && list->lhs()->symbol()->identifier() == name)
{
if (changeIfHasStarRange(list->lhs()))
{
hasRefs = true;
hasAssumedSizeArrays.insert(func);
}
else
arrayRefs.push_back(list->lhs());
break;
}
list = list->rhs();
@@ -189,6 +236,10 @@ void createInterfacesForAssumedSize(const map<string, vector<FuncInfo*>>& allFun
}
}
}
if (hasRefs)
for (auto& ref : arrayRefs)
changeIfHasStarRange(ref, true);
}
}
@@ -202,6 +253,11 @@ void createInterfacesForAssumedSize(const map<string, vector<FuncInfo*>>& allFun
for (auto& func : funcByFile.second)
{
SgProgHedrStmt* prog = isSgProgHedrStmt(func->funcPointer->GetOriginal());
if (prog == NULL)
continue;
set<string> addedInterfaceFor;
for (auto& elem : func->callsFromV)
{
auto it = hasAssumedSizeArrays.find(elem);
@@ -209,10 +265,13 @@ void createInterfacesForAssumedSize(const map<string, vector<FuncInfo*>>& allFun
{
auto callFrom = *it;
DvmhRegionInserter::createInterfaceBlockForOutCall(func, callFrom);
}
addedInterfaceFor.insert(callFrom->funcName);
}
}
if (addedInterfaceFor.size())
removeExternalStat(prog, addedInterfaceFor);
}
}
}
@@ -1703,3 +1762,321 @@ void moduleTransfer(const map<string, vector<FuncInfo*>>& allFuncInfo)
for (auto& func : funcForInterfaceAdd)
createInterfaceBlockForToCalls(func);
}
static bool isIntrincis(const string& name)
{
static set<string> intrinsicF;
if (intrinsicF.size() == 0)
{
intrinsicF.insert(string("abs"));
intrinsicF.insert(string("adjustl"));
intrinsicF.insert(string("and"));
intrinsicF.insert(string("any"));
intrinsicF.insert(string("associated"));
intrinsicF.insert(string("allocated"));
intrinsicF.insert(string("amod"));
intrinsicF.insert(string("aimax0"));
intrinsicF.insert(string("ajmax0"));
intrinsicF.insert(string("akmax0"));
intrinsicF.insert(string("aimin0"));
intrinsicF.insert(string("ajmin0"));
intrinsicF.insert(string("akmin0"));
intrinsicF.insert(string("amax1"));
intrinsicF.insert(string("amax0"));
intrinsicF.insert(string("amin1"));
intrinsicF.insert(string("amin0"));
intrinsicF.insert(string("aimag"));
intrinsicF.insert(string("alog"));
intrinsicF.insert(string("alog10"));
intrinsicF.insert(string("asin"));
intrinsicF.insert(string("asind"));
intrinsicF.insert(string("asinh"));
intrinsicF.insert(string("acos"));
intrinsicF.insert(string("acosd"));
intrinsicF.insert(string("acosh"));
intrinsicF.insert(string("atan"));
intrinsicF.insert(string("atand"));
intrinsicF.insert(string("atanh"));
intrinsicF.insert(string("atan2"));
intrinsicF.insert(string("atan2d"));
intrinsicF.insert(string("aint"));
intrinsicF.insert(string("anint"));
intrinsicF.insert(string("achar"));
intrinsicF.insert(string("babs"));
intrinsicF.insert(string("bbits"));
intrinsicF.insert(string("bbset"));
intrinsicF.insert(string("bdim"));
intrinsicF.insert(string("biand"));
intrinsicF.insert(string("bieor"));
intrinsicF.insert(string("bior"));
intrinsicF.insert(string("bixor"));
intrinsicF.insert(string("btest"));
intrinsicF.insert(string("bbtest"));
intrinsicF.insert(string("bbclr"));
intrinsicF.insert(string("bitest"));
intrinsicF.insert(string("bjtest"));
intrinsicF.insert(string("bktest"));
intrinsicF.insert(string("bessel_j0"));
intrinsicF.insert(string("bessel_j1"));
intrinsicF.insert(string("bessel_jn"));
intrinsicF.insert(string("bessel_y0"));
intrinsicF.insert(string("bessel_y1"));
intrinsicF.insert(string("bessel_yn"));
intrinsicF.insert(string("bmod"));
intrinsicF.insert(string("bnot"));
intrinsicF.insert(string("bshft"));
intrinsicF.insert(string("bshftc"));
intrinsicF.insert(string("bsign"));
intrinsicF.insert(string("cos"));
intrinsicF.insert(string("ccos"));
intrinsicF.insert(string("cdcos"));
intrinsicF.insert(string("cosd"));
intrinsicF.insert(string("cosh"));
intrinsicF.insert(string("cotan"));
intrinsicF.insert(string("cotand"));
intrinsicF.insert(string("ceiling"));
intrinsicF.insert(string("cexp"));
intrinsicF.insert(string("conjg"));
intrinsicF.insert(string("csqrt"));
intrinsicF.insert(string("clog"));
intrinsicF.insert(string("clog10"));
intrinsicF.insert(string("cdlog"));
intrinsicF.insert(string("cdlog10"));
intrinsicF.insert(string("csin"));
intrinsicF.insert(string("cabs"));
intrinsicF.insert(string("cdabs"));
intrinsicF.insert(string("cdexp"));
intrinsicF.insert(string("cdsin"));
intrinsicF.insert(string("cdsqrt"));
intrinsicF.insert(string("cdtan"));
intrinsicF.insert(string("cmplx"));
intrinsicF.insert(string("char"));
intrinsicF.insert(string("ctan"));
intrinsicF.insert(string("cpu_time"));
intrinsicF.insert(string("dim"));
intrinsicF.insert(string("ddim"));
intrinsicF.insert(string("dble"));
intrinsicF.insert(string("dfloat"));
intrinsicF.insert(string("dfloti"));
intrinsicF.insert(string("dflotj"));
intrinsicF.insert(string("dflotk"));
intrinsicF.insert(string("dint"));
intrinsicF.insert(string("dmax1"));
intrinsicF.insert(string("dmin1"));
intrinsicF.insert(string("dmod"));
intrinsicF.insert(string("dprod"));
intrinsicF.insert(string("dreal"));
intrinsicF.insert(string("dsign"));
intrinsicF.insert(string("dshiftl"));
intrinsicF.insert(string("dshiftr"));
intrinsicF.insert(string("dabs"));
intrinsicF.insert(string("dsqrt"));
intrinsicF.insert(string("dexp"));
intrinsicF.insert(string("dlog"));
intrinsicF.insert(string("dlog10"));
intrinsicF.insert(string("dsin"));
intrinsicF.insert(string("dcos"));
intrinsicF.insert(string("dcosd"));
intrinsicF.insert(string("dtan"));
intrinsicF.insert(string("dtand"));
intrinsicF.insert(string("dasin"));
intrinsicF.insert(string("dasind"));
intrinsicF.insert(string("dasinh"));
intrinsicF.insert(string("dacos"));
intrinsicF.insert(string("dacosd"));
intrinsicF.insert(string("dacosh"));
intrinsicF.insert(string("datan"));
intrinsicF.insert(string("datand"));
intrinsicF.insert(string("datanh"));
intrinsicF.insert(string("datan2"));
intrinsicF.insert(string("datan2d"));
intrinsicF.insert(string("derf"));
intrinsicF.insert(string("derfc"));
intrinsicF.insert(string("dsind"));
intrinsicF.insert(string("dsinh"));
intrinsicF.insert(string("dcosh"));
intrinsicF.insert(string("dcotan"));
intrinsicF.insert(string("dcotand"));
intrinsicF.insert(string("dtanh"));
intrinsicF.insert(string("dnint"));
intrinsicF.insert(string("dcmplx"));
intrinsicF.insert(string("dconjg"));
intrinsicF.insert(string("dimag"));
intrinsicF.insert(string("exp"));
intrinsicF.insert(string("erf"));
intrinsicF.insert(string("erfc"));
intrinsicF.insert(string("erfc_scaled"));
intrinsicF.insert(string("etime"));
intrinsicF.insert(string("float"));
intrinsicF.insert(string("floati"));
intrinsicF.insert(string("floatj"));
intrinsicF.insert(string("floatk"));
intrinsicF.insert(string("floor"));
intrinsicF.insert(string("flush"));
intrinsicF.insert(string("gamma"));
intrinsicF.insert(string("habs"));
intrinsicF.insert(string("hbclr"));
intrinsicF.insert(string("hbits"));
intrinsicF.insert(string("hbset"));
intrinsicF.insert(string("hdim"));
intrinsicF.insert(string("hiand"));
intrinsicF.insert(string("hieor"));
intrinsicF.insert(string("hior"));
intrinsicF.insert(string("hixor"));
intrinsicF.insert(string("hmod"));
intrinsicF.insert(string("hnot"));
intrinsicF.insert(string("hshft"));
intrinsicF.insert(string("hshftc"));
intrinsicF.insert(string("hsign"));
intrinsicF.insert(string("htest"));
intrinsicF.insert(string("huge"));
intrinsicF.insert(string("hypot"));
intrinsicF.insert(string("iiabs"));
intrinsicF.insert(string("iargc"));
intrinsicF.insert(string("iiand"));
intrinsicF.insert(string("iibclr"));
intrinsicF.insert(string("iibits"));
intrinsicF.insert(string("iibset"));
intrinsicF.insert(string("iidim"));
intrinsicF.insert(string("iieor"));
intrinsicF.insert(string("iior"));
intrinsicF.insert(string("iishft"));
intrinsicF.insert(string("iishftc"));
intrinsicF.insert(string("iisign"));
intrinsicF.insert(string("iixor"));
intrinsicF.insert(string("int"));
intrinsicF.insert(string("idint"));
intrinsicF.insert(string("ifix"));
intrinsicF.insert(string("idim"));
intrinsicF.insert(string("isign"));
intrinsicF.insert(string("index"));
intrinsicF.insert(string("iabs"));
intrinsicF.insert(string("ibits"));
intrinsicF.insert(string("idnint"));
intrinsicF.insert(string("ichar"));
intrinsicF.insert(string("iachar"));
intrinsicF.insert(string("isnan"));
intrinsicF.insert(string("iand"));
intrinsicF.insert(string("ior"));
intrinsicF.insert(string("ibset"));
intrinsicF.insert(string("ibclr"));
intrinsicF.insert(string("ibchng"));
intrinsicF.insert(string("ieor"));
intrinsicF.insert(string("ilen"));
intrinsicF.insert(string("imag"));
intrinsicF.insert(string("imax0"));
intrinsicF.insert(string("imax1"));
intrinsicF.insert(string("imin0"));
intrinsicF.insert(string("imin1"));
intrinsicF.insert(string("imod"));
intrinsicF.insert(string("inot"));
intrinsicF.insert(string("isha"));
intrinsicF.insert(string("ishc"));
intrinsicF.insert(string("ishft"));
intrinsicF.insert(string("ishftc"));
intrinsicF.insert(string("ishl"));
intrinsicF.insert(string("ixor"));
intrinsicF.insert(string("jiabs"));
intrinsicF.insert(string("jiand"));
intrinsicF.insert(string("jibclr"));
intrinsicF.insert(string("jibits"));
intrinsicF.insert(string("jibset"));
intrinsicF.insert(string("jidim"));
intrinsicF.insert(string("jieor"));
intrinsicF.insert(string("jior"));
intrinsicF.insert(string("jishft"));
intrinsicF.insert(string("jishftc"));
intrinsicF.insert(string("jisign"));
intrinsicF.insert(string("jixor"));
intrinsicF.insert(string("jmax0"));
intrinsicF.insert(string("jmax1"));
intrinsicF.insert(string("jmin0"));
intrinsicF.insert(string("jmin1"));
intrinsicF.insert(string("jmod"));
intrinsicF.insert(string("jnot"));
intrinsicF.insert(string("kiabs"));
intrinsicF.insert(string("kiand"));
intrinsicF.insert(string("kibclr"));
intrinsicF.insert(string("kibits"));
intrinsicF.insert(string("kibset"));
intrinsicF.insert(string("kidim"));
intrinsicF.insert(string("kieor"));
intrinsicF.insert(string("kior"));
intrinsicF.insert(string("kishft"));
intrinsicF.insert(string("kishftc"));
intrinsicF.insert(string("kisign"));
intrinsicF.insert(string("kmax0"));
intrinsicF.insert(string("kmax1"));
intrinsicF.insert(string("kmin0"));
intrinsicF.insert(string("kmin1"));
intrinsicF.insert(string("kmod"));
intrinsicF.insert(string("knot"));
intrinsicF.insert(string("len"));
intrinsicF.insert(string("len_trim"));
intrinsicF.insert(string("lge"));
intrinsicF.insert(string("lgt"));
intrinsicF.insert(string("lle"));
intrinsicF.insert(string("llt"));
intrinsicF.insert(string("log_gamma"));
intrinsicF.insert(string("log"));
intrinsicF.insert(string("log10"));
intrinsicF.insert(string("lshft"));
intrinsicF.insert(string("lshift"));
intrinsicF.insert(string("max"));
intrinsicF.insert(string("max0"));
intrinsicF.insert(string("max1"));
intrinsicF.insert(string("merge_bits"));
intrinsicF.insert(string("min"));
intrinsicF.insert(string("minval"));
intrinsicF.insert(string("maxval"));
intrinsicF.insert(string("min0"));
intrinsicF.insert(string("min1"));
intrinsicF.insert(string("mod"));
intrinsicF.insert(string("modulo"));
intrinsicF.insert(string("not"));
intrinsicF.insert(string("nint"));
intrinsicF.insert(string("null"));
intrinsicF.insert(string("or"));
intrinsicF.insert(string("popcnt"));
intrinsicF.insert(string("poppar"));
intrinsicF.insert(string("random_number"));
intrinsicF.insert(string("real"));
intrinsicF.insert(string("reshape"));
intrinsicF.insert(string("present"));
intrinsicF.insert(string("repeat"));
intrinsicF.insert(string("rshft"));
intrinsicF.insert(string("rshift"));
intrinsicF.insert(string("sign"));
intrinsicF.insert(string("size"));
intrinsicF.insert(string("scan"));
intrinsicF.insert(string("sizeof"));
intrinsicF.insert(string("sngl"));
intrinsicF.insert(string("sqrt"));
intrinsicF.insert(string("sin"));
intrinsicF.insert(string("sind"));
intrinsicF.insert(string("sinh"));
intrinsicF.insert(string("shifta"));
intrinsicF.insert(string("shiftl"));
intrinsicF.insert(string("shiftr"));
intrinsicF.insert(string("sum"));
intrinsicF.insert(string("tan"));
intrinsicF.insert(string("tand"));
intrinsicF.insert(string("tanh"));
intrinsicF.insert(string("tiny"));
intrinsicF.insert(string("trailz"));
intrinsicF.insert(string("trim"));
intrinsicF.insert(string("xor"));
intrinsicF.insert(string("wtime"));
intrinsicF.insert(string("zabs"));
intrinsicF.insert(string("zcos"));
intrinsicF.insert(string("zexp"));
intrinsicF.insert(string("zlog"));
intrinsicF.insert(string("zsin"));
intrinsicF.insert(string("zsqrt"));
intrinsicF.insert(string("ztan"));
}
if (intrinsicF.find(name) != intrinsicF.end())
return true;
return false;
}

View File

@@ -1,3 +1,3 @@
#pragma once
#define VERSION_SPF "2327"
#define VERSION_SPF "2329"