Skip to content

Commit

Permalink
Allows to link against an existing metis or patoh library using ./con…
Browse files Browse the repository at this point in the history
…figure --with-METIS=DIR or --with-PATOH=DIR

These libraries can then be used as schedulers in the HpcOm module.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19927 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Michael Kloeppel committed Apr 2, 2014
1 parent 72d818b commit a565e5d
Show file tree
Hide file tree
Showing 10 changed files with 1,121 additions and 602 deletions.
318 changes: 195 additions & 123 deletions Compiler/BackEnd/HpcOmScheduler.mo

Large diffs are not rendered by default.

17 changes: 14 additions & 3 deletions Compiler/BackEnd/HpcOmSchedulerExt.mo
Expand Up @@ -37,7 +37,7 @@ encapsulated package HpcOmSchedulerExt
RCS: $Id: HpcOmSchedulerExt.mo 2013-09-27 marcusw $

"

public function readScheduleFromGraphMl
input String filename;
output list<Integer> res;
Expand All @@ -49,8 +49,19 @@ public function scheduleMetis
input array<Integer> adjncy;
input array<Integer> vwgt;
input array<Integer> adjwgt;
input Integer nparts;
output list<Integer> res;
external "C" res=HpcOmSchedulerExt_scheduleMetis(xadj,adjncy,vwgt,adjwgt) annotation(Library = "omcruntime");
external "C" res=HpcOmSchedulerExt_scheduleMetis(xadj,adjncy,vwgt,adjwgt,nparts) annotation(Library = "omcruntime");
end scheduleMetis;

end HpcOmSchedulerExt;
public function schedulehMetis
input array<Integer> vwgts;
input array<Integer> eptr;
input array<Integer> eint;
input array<Integer> hewgts;
input Integer nparts;
output list<Integer> res;
external "C" res=HpcOmSchedulerExt_schedulehMetis(vwgts,eptr,eint,hewgts,nparts) annotation(Library = "omcruntime");
end schedulehMetis;

end HpcOmSchedulerExt;
176 changes: 91 additions & 85 deletions Compiler/BackEnd/HpcOmSimCode.mo

Large diffs are not rendered by default.

946 changes: 572 additions & 374 deletions Compiler/BackEnd/HpcOmTaskGraph.mo

Large diffs are not rendered by default.

17 changes: 15 additions & 2 deletions Compiler/omc_release/Makefile.in
Expand Up @@ -8,7 +8,7 @@ LIBSOCKET = @LIBSOCKET@
LIBLPSOLVE55 = @LIBLPSOLVE55@

USE_CORBA = @USE_CORBA@

USE_GRAPH = @USE_GRAPH@
SHELL = /bin/sh
CC = @CC@
OMPCC = @OMPCC@
Expand All @@ -28,7 +28,20 @@ else
CORBALIBS=
endif

LDFLAGS = @LDFLAGS@ -lm -L$(RMLHOME)/lib/plain -lrml $(LIBSOCKET) $(CORBALIBS) $(LIBLPSOLVE55) -L../../build/lib/omc @RPATH@ @OMC_LIBS@ -lgc -lexpat @RT_LDFLAGS@
ifdef USE_GRAPH
USE_METIS=@USE_METIS@
USE_PATOH=@USE_PATOH@
ifeq ($(USE_METIS),1)
METISHOME=@METISHOME@
METISLIB=$(METISHOME)/lib/libmetis.a
endif
ifeq ($(USE_PATOH),1)
PATOHHOME=@PATOHHOME@
PATOHLIB=$(PATOHHOME)/libpatoh.a
endif
endif

LDFLAGS = @LDFLAGS@ -lm -L$(RMLHOME)/lib/plain -lrml $(LIBSOCKET) $(CORBALIBS) $(LIBLPSOLVE55) $(METISLIB) $(PATOHLIB) -L../../build/lib/omc @RPATH@ @OMC_LIBS@ -lgc -lexpat @RT_LDFLAGS@

PROG = omc
RMLC = @rmlc_bin@
Expand Down
85 changes: 82 additions & 3 deletions Compiler/runtime/HpcOmSchedulerExt.cpp
@@ -1,4 +1,11 @@
#include "TaskGraphResultsCmp.h"
#include "HpcOmSchedulerExt.h"
#include <iostream>


using namespace std;



void* HpcOmSchedulerExtImpl__readScheduleFromGraphMl(const char *filename)
{
Expand Down Expand Up @@ -31,9 +38,81 @@ void* HpcOmSchedulerExtImpl__readScheduleFromGraphMl(const char *filename)
return res;
}

void* HpcOmSchedulerExtImpl__scheduleMetis(int* xadj, int* adjncy, int* vwgt, int* adjwgt, int xadjCount, int adjncyCount)
#if usemetis
void* HpcOmSchedulerExtImpl__scheduleMetis(int* xadj, int* adjncy, int* vwgt, int* adjwgt, int xadjCount, int adjncyCount, int nparts)
{
void *res = mk_nil();
void *res = mk_nil();
int nvert=xadjCount-1;
idx_t met_nvtxs=xadjCount-1;
idx_t met_ncon=1;
//double * part=new double[nvert];
idx_t * met_xadj=new idx_t[nvert+1]; //={0,2,5,8,11,13,16,20,24,28,31,33,36,39,42,44};
idx_t * met_adjncy=new idx_t[xadj[nvert]];//={1,5,0,2,6,1,3,7,2,4,8,3,9,0,6,10,1,5,7,11,2,6,8,12,3,7,9,13,4,8,14,5,11,6,10,12,2,7,11,13,8,12,14,9,13};
idx_t * met_vwgt=new idx_t[nvert]; //={0,2,5,8,11,13,16,20,24,28,31,33,36,39,42,44};
idx_t * met_adjwgt=new idx_t[xadj[nvert]];
idx_t met_objval;
idx_t * met_part=new idx_t[nvert];
idx_t met_nparts=nparts;
int returnval;

return res;
for(int i=0; i<nvert; i++) {
met_xadj[i]=xadj[i];
met_vwgt[i]=vwgt[i];
// cout<<met_xadj[i]<<" "<<met_vwgt[i]<<endl;
}
met_xadj[nvert]=xadj[nvert];
// cout<<"test: "<<met_xadj[nvert+4]<<endl;
for(int i=0; i<xadj[nvert]; i++) {
met_adjncy[i]=adjncy[i];
met_adjwgt[i]=adjwgt[i];
// cout<<met_adjncy[i]<<" "<<met_adjwgt[i]<<endl;
}
int * result=new int[nvert];
returnval=METIS_PartGraphKway(&met_nvtxs,&met_ncon,met_xadj,met_adjncy,met_vwgt,NULL,met_adjwgt,&met_nparts,NULL,NULL,NULL,&met_objval,met_part);
for(int i=nvert-1; i>=0; i--) {
result[i]=met_part[i]+1;
res = mk_cons(mk_icon(result[i]),res);
}
delete[] met_xadj;
delete[] met_adjncy;
delete[] met_vwgt;
delete[] met_adjwgt;
delete[] met_part;
return res;
}
#else
void* HpcOmSchedulerExtImpl__scheduleMetis(int* xadj, int* adjncy, int* vwgt, int* adjwgt, int xadjCount, int adjncyCount, int nparts)
{
std::cerr<<"OpenModelica was not compiled with METIS."<<std::endl;
}
#endif

#if usepatoh
void* HpcOmSchedulerExtImpl__schedulehMetis(int* vwgts, int* eptr, int* eint, int* hewgts, int vwgtsNelts, int eptrNelts, int nparts)
{
void *res = mk_nil();
int * result=new int[vwgtsNelts];
PaToH_Parameters args;
int c, n, nconst, cut, *partweights;
PaToH_Initialize_Parameters(&args, PATOH_CONPART, PATOH_SUGPARAM_DEFAULT);
args._k = nparts;
partweights = new int[nparts];
PaToH_Alloc(&args, vwgtsNelts, eptrNelts-1, 1, vwgts, NULL, eptr, eint);
PaToH_Part(&args, vwgtsNelts, eptrNelts-1, 1, 0, vwgts, NULL,eptr, eint, NULL, result, partweights, &cut);
PaToH_Free();


for(int i=vwgtsNelts-1; i>=0; i--) {
res = mk_cons(mk_icon(result[i]+1),res);
}
cout<<endl;
delete [] result;
delete [] partweights;
return res;
}
#else
void* HpcOmSchedulerExtImpl__schedulehMetis(int* vwgts, int* eptr, int* eint, int* hewgts, int vwgtsNelts, int eptrNelts, int nparts)
{
std::cerr<<"OpenModelica was not compiled with PATOH."<<std::endl;
}
#endif
11 changes: 11 additions & 0 deletions Compiler/runtime/HpcOmSchedulerExt.h.in
@@ -0,0 +1,11 @@
#define usegraph @USE_GRAPH@
#if usegraph
#define usepatoh @USE_PATOH@
#if usepatoh
#include "@PATOHHOME@/patoh.h"
#endif
#define usemetis @USE_METIS@
#if usemetis
#include "@METISHOME@/include/metis.h"
#endif
#endif
53 changes: 48 additions & 5 deletions Compiler/runtime/HpcOmSchedulerExt_omc.cpp
Expand Up @@ -12,12 +12,13 @@ extern void* HpcOmSchedulerExt_readScheduleFromGraphMl(const char *filename)
return HpcOmSchedulerExtImpl__readScheduleFromGraphMl(filename);
}

extern void* HpcOmSchedulerExt_scheduleMetis(modelica_metatype xadjIn, modelica_metatype adjncyIn, modelica_metatype vwgtIn, modelica_metatype adjwgtIn)
extern void* HpcOmSchedulerExt_scheduleMetis(modelica_metatype xadjIn, modelica_metatype adjncyIn, modelica_metatype vwgtIn, modelica_metatype adjwgtIn, modelica_metatype npartsIn)
{
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 nparts = MMC_UNTAGFIXNUM(npartsIn);

int* xadj = (int *) malloc(xadjNelts*sizeof(int));
int* adjncy = (int *) malloc(adjncyNelts*sizeof(int));
Expand All @@ -34,22 +35,64 @@ extern void* HpcOmSchedulerExt_scheduleMetis(modelica_metatype xadjIn, modelica_
for(int i=0; i<adjncyNelts; i++) {
int adjncyElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjncyIn)[i]);
std::cerr << "adjncyElem: " << adjncyElem << std::endl;
xadj[i] = adjncyElem;
adjncy[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;
vwgt[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;
adjwgt[i] = adjwgtElem;
}

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

extern void* HpcOmSchedulerExt_schedulehMetis(modelica_metatype xadjIn, modelica_metatype adjncyIn, modelica_metatype vwgtIn, modelica_metatype adjwgtIn, modelica_metatype npartsIn)
{

int vwgtsNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(xadjIn)); //number of elements in xadj-array
int eptrNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjncyIn)); //number of elements in adjncy-array
int eintNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(vwgtIn)); //number of elements in vwgt-array
int hewgtsNelts = (int)MMC_HDRSLOTS(MMC_GETHDR(adjwgtIn)); //number of elements in adjwgt-array
int nparts = MMC_UNTAGFIXNUM(npartsIn);

int* vwgts = (int *) malloc(vwgtsNelts*sizeof(int));
int* eptr = (int *) malloc(eptrNelts*sizeof(int));
int* eint = (int *) malloc(eintNelts*sizeof(int));
int* hewgts = (int *) malloc(hewgtsNelts*sizeof(int));

//setup xadj
for(int i=0; i<vwgtsNelts; i++) {
int xadjElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(xadjIn)[i]);
std::cerr << "vwgtsElem: " << xadjElem << std::endl;
vwgts[i] = xadjElem;
}
//setup adjncy
for(int i=0; i<eptrNelts; i++) {
int adjncyElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjncyIn)[i]);
std::cerr << "eptrElem: " << adjncyElem << std::endl;
eptr[i] = adjncyElem;
}
//setup vwgt
for(int i=0; i<eintNelts; i++) {
int vwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(vwgtIn)[i]);
std::cerr << "eintElem: " << vwgtElem << std::endl;
eint[i] = vwgtElem;
}
//setup adjwgt
for(int i=0; i<hewgtsNelts; i++) {
int adjwgtElem = MMC_UNTAGFIXNUM(MMC_STRUCTDATA(adjwgtIn)[i]);
std::cerr << "adjwgtElem: " << adjwgtElem << std::endl;
hewgts[i] = adjwgtElem;
}
return HpcOmSchedulerExtImpl__schedulehMetis(vwgts, eptr, eint, hewgts, vwgtsNelts, eptrNelts, nparts);
}


}
60 changes: 55 additions & 5 deletions Compiler/runtime/HpcOmSchedulerExt_rml.cpp
Expand Up @@ -31,7 +31,7 @@
extern "C" {
#include "rml.h"
}

#include "HpcOmSchedulerExt.h"
#include "HpcOmSchedulerExt.cpp"
#include <iostream>
extern "C" {
Expand All @@ -52,6 +52,7 @@ RML_BEGIN_LABEL(HpcOmSchedulerExt__scheduleMetis)
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
int nparts = RML_UNTAGFIXNUM(rmlA4); //number of threads

int* xadj = (int *) malloc(xadjNelts*sizeof(int));
int* adjncy = (int *) malloc(adjncyNelts*sizeof(int));
Expand All @@ -73,23 +74,72 @@ RML_BEGIN_LABEL(HpcOmSchedulerExt__scheduleMetis)
for(int i=0; i<adjncyNelts; i++) {
int adjncyElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA1)[i]);
std::cerr << "adjncyElem: " << adjncyElem << std::endl;
xadj[i] = adjncyElem;
adjncy[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;
vwgt[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;
adjwgt[i] = adjwgtElem;
}

rmlA0 = HpcOmSchedulerExtImpl__scheduleMetis(xadj, adjncy, vwgt, adjwgt, xadjNelts, adjncyNelts);
rmlA0 = HpcOmSchedulerExtImpl__scheduleMetis(xadj, adjncy, vwgt, adjwgt, xadjNelts, adjncyNelts, nparts);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(HpcOmSchedulerExt__schedulehMetis)
{
int vwgtsNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA0)); //number of elements in xadj-array
int eptrNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA1)); //number of elements in adjncy-array
int eintNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA2)); //number of elements in vwgt-array
int hewgtsNelts = (int)RML_HDRSLOTS(RML_GETHDR(rmlA3)); //number of elements in adjwgt-array
int nparts = RML_UNTAGFIXNUM(rmlA4); //number of threads

int* vwgts = (int *) malloc(vwgtsNelts*sizeof(int));
int* eptr = (int *) malloc(eptrNelts*sizeof(int));
int* eint = (int *) malloc(eintNelts*sizeof(int));
int* hewgts = (int *) malloc(hewgtsNelts*sizeof(int));

std::cerr << "vwgts element count: " << vwgtsNelts << std::endl;
std::cerr << "eptr element count: " << eptrNelts << std::endl;
std::cerr << "eint element count: " << eintNelts << std::endl;
std::cerr << "hewgts element count: " << hewgtsNelts << std::endl;

//setup xadj
for(int i=0; i<vwgtsNelts; i++) {
int xadjElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA0)[i]);
std::cerr << "vwgtsElem: " << xadjElem << std::endl;
vwgts[i] = xadjElem;
}
//setup adjncy
for(int i=0; i<eptrNelts; i++) {
int adjncyElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA1)[i]);
std::cerr << "eptrElem: " << adjncyElem << std::endl;
eptr[i] = adjncyElem;
}
//setup vwgt
for(int i=0; i<eintNelts; i++) {
int vwgtElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA2)[i]);
std::cerr << "eintElem: " << vwgtElem << std::endl;
eint[i] = vwgtElem;
}
//setup adjwgt
for(int i=0; i<hewgtsNelts; i++) {
int adjwgtElem = RML_UNTAGFIXNUM(RML_STRUCTDATA(rmlA3)[i]);
std::cerr << "hewgtsElem: " << adjwgtElem << std::endl;
hewgts[i] = adjwgtElem;
}

rmlA0 = HpcOmSchedulerExtImpl__schedulehMetis(vwgts, eptr, eint, hewgts, vwgtsNelts, eptrNelts, nparts);
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL
}

0 comments on commit a565e5d

Please sign in to comment.