Files
SAPFOR/src/DirectiveProcessing/directive_analyzer.cpp

92 lines
2.6 KiB
C++
Raw Normal View History

#include "leak_detector.h"
2023-09-14 19:43:13 +03:00
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstdint>
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <utility>
#include <assert.h>
#include "../Distribution/DvmhDirective.h"
2025-06-04 13:08:38 +03:00
#include "graph_loops.h"
2024-04-02 17:48:48 +03:00
#include "directive_analyzer.h"
2025-06-04 13:08:38 +03:00
#include "utils.h"
2023-09-14 19:43:13 +03:00
using std::vector;
using std::map;
static void recUniteAcrossOut(LoopGraph *currLoop)
{
if (currLoop->perfectLoop > 1)
{
recUniteAcrossOut(currLoop->children[0]);
if (currLoop->directive)
currLoop->acrossOutAttribute.insert(currLoop->children[0]->acrossOutAttribute.begin(), currLoop->children[0]->acrossOutAttribute.end());
}
}
static void recUnite(vector<LoopGraph*> &loopGraph)
{
for (int i = 0; i < loopGraph.size(); ++i)
{
LoopGraph &currLoop = *loopGraph[i];
if (currLoop.perfectLoop > 1)
{
vector<ParallelDirective*> united;
vector<ParallelDirective*> elems;
LoopGraph *elem = loopGraph[i];
for (int k = 0; k < currLoop.perfectLoop; ++k)
{
elems.push_back(elem->directive);
if (k != currLoop.perfectLoop - 1)
elem = elem->children[0];
}
united.push_back(elems.back());
for (int k = currLoop.perfectLoop - 2; k >= 0; --k)
{
ParallelDirective *first = elems[k];
ParallelDirective *second = united.back();
ParallelDirective *newDir = NULL;
if (first != NULL && second != NULL)
newDir = *first + *second;
else if (first != NULL)
newDir = new ParallelDirective(*first);
else if (first == NULL && second != NULL)
{
newDir = new ParallelDirective(*second);
newDir->parallel.insert(newDir->parallel.begin(), "*");
}
united.push_back(newDir);
}
elem = loopGraph[i];
for (int k = 0; k < currLoop.perfectLoop - 1; ++k)
{
if (elem->directive)
delete elem->directive;
elem->directive = united[currLoop.perfectLoop - k - 1];
elem = elem->children[0];
}
recUniteAcrossOut(loopGraph[i]);
}
else
recUnite(currLoop.children);
}
}
void UniteNestedDirectives(vector<LoopGraph*> &loopGraph)
{
recUnite(loopGraph);
}