Skip to content

Commit

Permalink
- changed the HpcOmSchedulerExt interface to metis-style
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18413 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Marcus Walther committed Dec 5, 2013
1 parent df94d6d commit 70054ad
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 50 deletions.
17 changes: 7 additions & 10 deletions Compiler/BackEnd/HpcOmScheduler.mo
Original file line number Diff line number Diff line change
Expand Up @@ -1235,27 +1235,24 @@ end printLevelSchedule1;
//--------------------
public function createExtCSchedule "function createExtSchedule
author: marcusw
Creates a scheduling by reading the required informations from a graphml-file."
Creates a scheduling by passing the arguments to metis."
input HpcOmTaskGraph.TaskGraph iTaskGraph;
input HpcOmTaskGraph.TaskGraphMeta iTaskGraphMeta;
input Integer iNumberOfThreads;
input array<list<Integer>> iSccSimEqMapping; //Maps each scc to a list of simEqs
output Schedule oSchedule;
protected
list<Integer> extInfo;
array<Integer> extInfoArr;
HpcOmTaskGraph.TaskGraph taskGraphT;
Schedule tmpSchedule;
array<list<Task>> threadTasks;
list<Integer> rootNodes;
array<tuple<Task, Integer>> allTasks;
list<tuple<Task,Integer>> nodeList_refCount; //list of nodes which are ready to schedule
list<Task> nodeList;
array<Integer> xadj, adjncy, vwgt, adjwgt;
algorithm
oSchedule := matchcontinue(iTaskGraph,iTaskGraphMeta,iNumberOfThreads,iSccSimEqMapping)
case(_,_,_,_)
equation
extInfo = HpcOmSchedulerExt.scheduleAdjList(iTaskGraph);
xadj = arrayCreate(1,1);
adjncy = arrayCreate(2,2);
vwgt = arrayCreate(3,3);
adjwgt = arrayCreate(4,4);
extInfo = HpcOmSchedulerExt.scheduleMetis(xadj, adjncy, vwgt, adjwgt);
then fail();
else
equation
Expand Down
11 changes: 7 additions & 4 deletions Compiler/BackEnd/HpcOmSchedulerExt.mo
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,13 @@ public function readScheduleFromGraphMl
external "C" res=HpcOmSchedulerExt_readScheduleFromGraphMl(filename) annotation(Library = "omcruntime");
end readScheduleFromGraphMl;

public function scheduleAdjList
input array<list<Integer>> adjList;
public function scheduleMetis
input array<Integer> xadj;
input array<Integer> adjncy;
input array<Integer> vwgt;
input array<Integer> adjwgt;
output list<Integer> res;
external "C" res=HpcOmSchedulerExt_scheduleAdjList(adjList) annotation(Library = "omcruntime");
end scheduleAdjList;
external "C" res=HpcOmSchedulerExt_scheduleMetis(xadj,adjncy,vwgt,adjwgt) annotation(Library = "omcruntime");
end scheduleMetis;

end HpcOmSchedulerExt;
2 changes: 1 addition & 1 deletion Compiler/runtime/HpcOmSchedulerExt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void* HpcOmSchedulerExtImpl__readScheduleFromGraphMl(const char *filename)
return res;
}

void* HpcOmSchedulerExtImpl__scheduleAdjList(std::list<std::list<long int> > adjLst)
void* HpcOmSchedulerExtImpl__scheduleMetis(int* xadj, int* adjncy, int* vwgt, int* adjwgt, int xadjCount, int adjncyCount)
{
void *res = mk_nil();

Expand Down
52 changes: 35 additions & 17 deletions Compiler/runtime/HpcOmSchedulerExt_omc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,44 @@ extern void* HpcOmSchedulerExt_readScheduleFromGraphMl(const char *filename)
return HpcOmSchedulerExtImpl__readScheduleFromGraphMl(filename);
}

extern void* HpcOmSchedulerExt_scheduleAdjList(modelica_metatype adjList)
extern void* HpcOmSchedulerExt_scheduleMetis(modelica_metatype xadjIn, modelica_metatype adjncyIn, modelica_metatype vwgtIn, modelica_metatype adjwgtIn)
{
int nelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjList));
std::list<std::list<long int> > adjLsts = std::list<std::list<long int> >();

for(int i=0; i<nelts; ++i)
{
modelica_metatype adjLstE = MMC_STRUCTDATA(adjList)[i];
std::list<long int> adjLst;

while(MMC_GETHDR(adjLstE) == MMC_CONSHDR) {
long int i1 = MMC_UNTAGFIXNUM(MMC_CAR(adjLstE));
adjLst.push_back(i1);
adjLstE = MMC_CDR(adjLstE);
}

adjLsts.push_back(adjLst);
int xadjNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(xadjIn)); //number of elements in xadj-array
int adjncyNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjncyIn)); //number of elements in adjncy-array
int vwgtNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(vwgtIn)); //number of elements in vwgt-array
int adjwgtNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjwgtIn)); //number of elements in adjwgt-array

int* xadj = (int *) malloc(xadjNelts*sizeof(int));
int* adjncy = (int *) malloc(adjncyNelts*sizeof(int));
int* vwgt = (int *) malloc(vwgtNelts*sizeof(int));
int* adjwgt = (int *) malloc(adjwgtNelts*sizeof(int));

//setup xadj
for(int i=0; i<xadjNelts; i++) {
int xadjElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(xadjIn)[i]);
std::cerr << "xadjElem: " << xadjElem << std::endl;
xadj[i] = xadjElem;
}
//setup adjncy
for(int i=0; i<adjncyNelts; i++) {
int adjncyElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjncyIn)[i]);
std::cerr << "adjncyElem: " << adjncyElem << std::endl;
xadj[i] = adjncyElem;
}
//setup vwgt
for(int i=0; i<vwgtNelts; i++) {
int vwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(vwgtIn)[i]);
std::cerr << "vwgtElem: " << vwgtElem << std::endl;
xadj[i] = vwgtElem;
}
//setup adjwgt
for(int i=0; i<adjwgtNelts; i++) {
int adjwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjwgtIn)[i]);
std::cerr << "adjwgtElem: " << adjwgtElem << std::endl;
xadj[i] = adjwgtElem;
}

return HpcOmSchedulerExtImpl__scheduleAdjList(adjLsts);
return HpcOmSchedulerExtImpl__scheduleMetis(xadj, adjncy, vwgt, adjwgt, xadjNelts, adjncyNelts);
}

}
55 changes: 37 additions & 18 deletions Compiler/runtime/HpcOmSchedulerExt_rml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,30 +46,49 @@ RML_BEGIN_LABEL(HpcOmSchedulerExt__readScheduleFromGraphMl)
}
RML_END_LABEL

RML_BEGIN_LABEL(HpcOmSchedulerExt__scheduleAdjList)
RML_BEGIN_LABEL(HpcOmSchedulerExt__scheduleMetis)
{
int nelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA0)); //number of elements in array
std::list<std::list<long int> > adjLsts = std::list<std::list<long int> >();
int xadjNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA0)); //number of elements in xadj-array
int adjncyNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA1)); //number of elements in adjncy-array
int vwgtNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA2)); //number of elements in vwgt-array
int adjwgtNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA3)); //number of elements in adjwgt-array

std::cerr << "element count: " << nelts << std::endl;
int* xadj = (int *) malloc(xadjNelts*sizeof(int));
int* adjncy = (int *) malloc(adjncyNelts*sizeof(int));
int* vwgt = (int *) malloc(vwgtNelts*sizeof(int));
int* adjwgt = (int *) malloc(adjwgtNelts*sizeof(int));

for(int i=0; i<nelts; i++) {
std::cerr << "bla" << std::endl;
void* adjLstE = RML_STRUCTDATA(rmlA0)[i]; //adjacence list entry
std::list<long int> adjLst;
std::cerr << "xadj element count: " << xadjNelts << std::endl;
std::cerr << "adjncy element count: " << adjncyNelts << std::endl;
std::cerr << "vwgt element count: " << vwgtNelts << std::endl;
std::cerr << "adjwgt element count: " << adjwgtNelts << std::endl;

while(RML_GETHDR(adjLstE) == RML_CONSHDR)
{
long int i1 = RML_UNTAGFIXNUM(RML_CAR(adjLstE));
adjLst.push_back(i1);
std::cerr << "elem: " << i1 << std::endl;
adjLstE = RML_CDR(adjLstE);
}

adjLsts.push_back(adjLst);
//setup xadj
for(int i=0; i<xadjNelts; i++) {
int xadjElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA0)[i]);
std::cerr << "xadjElem: " << xadjElem << std::endl;
xadj[i] = xadjElem;
}
//setup adjncy
for(int i=0; i<adjncyNelts; i++) {
int adjncyElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA1)[i]);
std::cerr << "adjncyElem: " << adjncyElem << std::endl;
xadj[i] = adjncyElem;
}
//setup vwgt
for(int i=0; i<vwgtNelts; i++) {
int vwgtElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA2)[i]);
std::cerr << "vwgtElem: " << vwgtElem << std::endl;
xadj[i] = vwgtElem;
}
//setup adjwgt
for(int i=0; i<adjwgtNelts; i++) {
int adjwgtElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA3)[i]);
std::cerr << "adjwgtElem: " << adjwgtElem << std::endl;
xadj[i] = adjwgtElem;
}

rmlA0 = HpcOmSchedulerExtImpl__scheduleAdjList(adjLsts);
rmlA0 = HpcOmSchedulerExtImpl__scheduleMetis(xadj, adjncy, vwgt, adjwgt, xadjNelts, adjncyNelts);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL
Expand Down

0 comments on commit 70054ad

Please sign in to comment.