moved
This commit is contained in:
92
Sapfor/_src/DirectiveProcessing/directive_analyzer.cpp
Normal file
92
Sapfor/_src/DirectiveProcessing/directive_analyzer.cpp
Normal file
@@ -0,0 +1,92 @@
|
||||
#include "../Utils/leak_detector.h"
|
||||
|
||||
#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"
|
||||
#include "../GraphLoop/graph_loops.h"
|
||||
#include "directive_analyzer.h"
|
||||
#include "../Utils/utils.h"
|
||||
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user