From 38ee1582a2189e4748f4cc52344ad14db9087d7b Mon Sep 17 00:00:00 2001 From: adash Date: Thu, 31 Jul 2008 02:26:59 +0000 Subject: [PATCH] Changes for dynamic prefetch enabling --- .../Analysis/Prefetch/PrefetchAnalysis.java | 63 ++++++++++--------- Robust/src/IR/Flat/BuildCode.java | 42 ++++++++++--- Robust/src/IR/Flat/BuildCodeMultiCore.java | 5 +- Robust/src/IR/Flat/FlatPrefetchNode.java | 2 + Robust/src/Main/Main.java | 13 ++-- Robust/src/Runtime/DSTM/interface/dstm.h | 18 +++--- Robust/src/Runtime/DSTM/interface/trans.c | 35 ++++++++--- Robust/src/buildscript | 2 +- 8 files changed, 113 insertions(+), 67 deletions(-) diff --git a/Robust/src/Analysis/Prefetch/PrefetchAnalysis.java b/Robust/src/Analysis/Prefetch/PrefetchAnalysis.java index d6b5df3e..9adc1489 100644 --- a/Robust/src/Analysis/Prefetch/PrefetchAnalysis.java +++ b/Robust/src/Analysis/Prefetch/PrefetchAnalysis.java @@ -26,6 +26,7 @@ public class PrefetchAnalysis { public static final double PROB_DIFF = 0.05; //threshold for difference in probabilities during first phase of analysis public static final double ANALYSIS_THRESHOLD_PROB = 0.10; //threshold for prefetches to stop propagating during first phase of analysis public static final double PREFETCH_THRESHOLD_PROB = 0.30;//threshold for prefetches to stop propagating while applying prefetch rules during second phase of analysis + public static int prefetchsiteid = 1; //initialized to one because there is a prefetch siteid 0 for starting remote thread LocalityAnalysis locality; public PrefetchAnalysis(State state, CallGraph callgraph, TypeUtil typeutil, LocalityAnalysis locality) { @@ -964,36 +965,38 @@ public class PrefetchAnalysis { /* This modifies the Flat representation graph */ for(Enumeration e = newprefetchset.keys();e.hasMoreElements();) { FlatNode fn = (FlatNode) e.nextElement(); - FlatPrefetchNode fpn = new FlatPrefetchNode(); - if(newprefetchset.get(fn).size() > 0) { - fpn.insAllpp((HashSet)newprefetchset.get(fn)); - if(fn.kind() == FKind.FlatMethod) { - FlatNode nn = fn.getNext(0); - fn.setNext(0, fpn); - fpn.addNext(nn); - } else { - /* Check if previous node of this FlatNode is a NEW node - * If yes, delete this flatnode and its prefetch set from hash table - * This eliminates prefetches for NULL ptrs*/ - for(int i = 0; i< fn.numPrev(); i++) { - FlatNode nn = fn.getPrev(i); - if(nn.kind() == FKind.FlatNew) { - isFNPresent = true; - } - } - if(!isFNPresent) { - while(fn.numPrev() > 0) { - FlatNode nn = fn.getPrev(0); - for(int j = 0; j 0) { + fpn.insAllpp((HashSet)newprefetchset.get(fn)); + if(fn.kind() == FKind.FlatMethod) { + FlatNode nn = fn.getNext(0); + fn.setNext(0, fpn); + fpn.addNext(nn); + fpn.siteid = prefetchsiteid++; + } else { + /* Check if previous node of this FlatNode is a NEW node + * If yes, delete this flatnode and its prefetch set from hash table + * This eliminates prefetches for NULL ptrs*/ + for(int i = 0; i< fn.numPrev(); i++) { + FlatNode nn = fn.getPrev(i); + if(nn.kind() == FKind.FlatNew) { + isFNPresent = true; + } + } + if(!isFNPresent) { + while(fn.numPrev() > 0) { + FlatNode nn = fn.getPrev(0); + for(int j = 0; j backuptable; Hashtable reverttable; SafetyAnalysis sa; + PrefetchAnalysis pa; - public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa) { - this(st, temptovar, typeutil, null, sa); + public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa, PrefetchAnalysis pa) { + this(st, temptovar, typeutil, null, sa, pa); } - public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality) { - this(st, temptovar, typeutil, locality, null); + public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, PrefetchAnalysis pa) { + this(st, temptovar, typeutil, locality, null, pa); } - public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, SafetyAnalysis sa) { + public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, SafetyAnalysis sa, PrefetchAnalysis pa) { this.sa=sa; + this.pa=pa; state=st; this.temptovar=temptovar; paramstable=new Hashtable(); @@ -192,6 +194,9 @@ public class BuildCode { private void outputMainMethod(PrintWriter outmethod) { outmethod.println("int main(int argc, const char *argv[]) {"); outmethod.println(" int i;"); + outmethod.println("#ifdef TRANSSTATS \n"); + outmethod.println("handle();\n"); + outmethod.println("#endif\n"); if (state.THREAD||state.DSM) { outmethod.println("initializethreads();"); } @@ -261,8 +266,11 @@ public class BuildCode { outmethod.println("pthread_exit(NULL);"); } + outmethod.println("#ifdef TRANSSTATS \n"); + outmethod.println("printf(\"****** Transaction Stats ******\\n\");"); outmethod.println("printf(\"numTransAbort= %d\\n\", numTransAbort);"); outmethod.println("printf(\"numTransCommit= %d\\n\", numTransCommit);"); + outmethod.println("#endif\n"); outmethod.println("}"); } @@ -307,6 +315,7 @@ public class BuildCode { outmethod.println("#include \"methodheaders.h\""); outmethod.println("#include \"virtualtable.h\""); outmethod.println("#include \"runtime.h\""); + outmethod.println("#include \"dstm.h\""); if (state.DSM) { outmethod.println("#include \"localobjects.h\""); } @@ -461,7 +470,6 @@ public class BuildCode { outtask.println("struct taskdescriptor {"); outtask.println("void * taskptr;"); outtask.println("int numParameters;"); - outtask.println("int numTotal;"); outtask.println("struct parameterdescriptor **descriptorarray;"); outtask.println("char * name;"); outtask.println("};"); @@ -714,9 +722,15 @@ public class BuildCode { * information. */ private void generateSizeArray(PrintWriter outclassdefs) { - outclassdefs.print("int numTransAbort = 0;"); - outclassdefs.print("int numTransCommit = 0;"); - outclassdefs.print("int classsize[]={"); + outclassdefs.print("extern struct prefetchCountStats * evalPrefetch;\n"); + outclassdefs.print("#ifdef TRANSSTATS \n"); + outclassdefs.print("extern int numTransAbort;\n"); + outclassdefs.print("extern int numTransCommit;\n"); + outclassdefs.print("extern void handle();\n"); + outclassdefs.print("#endif\n"); + outclassdefs.print("int numprefetchsites = " + pa.prefetchsiteid + ";\n"); + + outclassdefs.print("int classsize[]={"); Iterator it=state.getClassSymbolTable().getDescriptorsIterator(); cdarray=new ClassDescriptor[state.numClasses()]; while(it.hasNext()) { @@ -1478,6 +1492,7 @@ public class BuildCode { return; output.println("{"); output.println("/* prefetch */"); + output.println("/* prefetchid_" + fpn.siteid + " */"); output.println("void * prefptr;"); output.println("int tmpindex;"); /*Create C code for oid array */ @@ -1513,7 +1528,14 @@ public class BuildCode { } output.println("};"); /* make the prefetch call to Runtime */ - output.println(" prefetch("+tuplecount+", oidarray_, endoffsetarry_, fieldarry_);"); + output.println(" if(evalPrefetch["+fpn.siteid+"].operMode) {"); + output.println(" prefetch("+fpn.siteid+" ,"+tuplecount+", oidarray_, endoffsetarry_, fieldarry_);"); + output.println(" } else if(evalPrefetch["+fpn.siteid+"].retrycount <= 0) {"); + output.println(" prefetch("+fpn.siteid+" ,"+tuplecount+", oidarray_, endoffsetarry_, fieldarry_);"); + output.println(" evalPrefetch["+fpn.siteid+"].retrycount = RETRYINTERVAL;"); + output.println(" } else {"); + output.println(" evalPrefetch["+fpn.siteid+"].retrycount--;"); + output.println(" }"); output.println("}"); } } diff --git a/Robust/src/IR/Flat/BuildCodeMultiCore.java b/Robust/src/IR/Flat/BuildCodeMultiCore.java index 3598ebd4..57a03264 100644 --- a/Robust/src/IR/Flat/BuildCodeMultiCore.java +++ b/Robust/src/IR/Flat/BuildCodeMultiCore.java @@ -13,6 +13,7 @@ import Analysis.Scheduling.Schedule; import Analysis.TaskStateAnalysis.FEdge; import Analysis.TaskStateAnalysis.FlagState; import Analysis.TaskStateAnalysis.SafetyAnalysis; +import Analysis.Prefetch.*; import IR.ClassDescriptor; import IR.Descriptor; import IR.FlagDescriptor; @@ -42,8 +43,8 @@ public class BuildCodeMultiCore extends BuildCode { String otqueueprefix = "___otqueue"; int startupcorenum; // record the core containing startup task, suppose only one core can hava startup object - public BuildCodeMultiCore(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa, Vector scheduling, int coreNum) { - super(st, temptovar, typeutil, sa); + public BuildCodeMultiCore(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa, Vector scheduling, int coreNum, PrefetchAnalysis pa) { + super(st, temptovar, typeutil, sa, pa); this.scheduling = scheduling; this.coreNum = coreNum; this.currentSchedule = null; diff --git a/Robust/src/IR/Flat/FlatPrefetchNode.java b/Robust/src/IR/Flat/FlatPrefetchNode.java index 1623fb89..4baaf6ad 100644 --- a/Robust/src/IR/Flat/FlatPrefetchNode.java +++ b/Robust/src/IR/Flat/FlatPrefetchNode.java @@ -3,10 +3,12 @@ import Analysis.Prefetch.*; import java.util.*; public class FlatPrefetchNode extends FlatNode { + public Integer siteid; HashSet hspp; public FlatPrefetchNode() { hspp = new HashSet(); + siteid = new Integer(1); } public String toString() { diff --git a/Robust/src/Main/Main.java b/Robust/src/Main/Main.java index 33d76205..a082dd1f 100644 --- a/Robust/src/Main/Main.java +++ b/Robust/src/Main/Main.java @@ -166,10 +166,6 @@ public class Main { readSourceFile(state, ClassLibraryPrefix+"gnu/Random.java"); readSourceFile(state, ClassLibraryPrefix+"Vector.java"); readSourceFile(state, ClassLibraryPrefix+"Enumeration.java"); - if(!state.MULTICORE) { - readSourceFile(state, ClassLibraryPrefix+"Signal.java"); - } - if (state.TASK) { readSourceFile(state, ClassLibraryPrefix+"Object.java"); @@ -206,6 +202,7 @@ public class Main { BuildFlat bf=new BuildFlat(state,tu); bf.buildFlat(); SafetyAnalysis sa=null; + PrefetchAnalysis pa=null; if (state.TAGSTATE) { CallGraph callgraph=new CallGraph(state); @@ -412,7 +409,7 @@ public class Main { if(state.MULTICORE) { it_scheduling = scheduleAnalysis.getSchedulingsIter(); Vector scheduling = (Vector)it_scheduling.next(); - BuildCodeMultiCore bcm=new BuildCodeMultiCore(state, bf.getMap(), tu, sa, scheduling, scheduleAnalysis.getCoreNum()); + BuildCodeMultiCore bcm=new BuildCodeMultiCore(state, bf.getMap(), tu, sa, scheduling, scheduleAnalysis.getCoreNum(), pa); bcm.buildCode(); } } @@ -425,15 +422,15 @@ public class Main { if (state.PREFETCH) { //speed up prefetch generation using locality analysis results LocalityAnalysis la=new LocalityAnalysis(state, callgraph, tu); - PrefetchAnalysis pa=new PrefetchAnalysis(state, callgraph, tu, la); + pa=new PrefetchAnalysis(state, callgraph, tu, la); } LocalityAnalysis la=new LocalityAnalysis(state, callgraph, tu); GenerateConversions gc=new GenerateConversions(la, state); - BuildCode bc=new BuildCode(state, bf.getMap(), tu, la); + BuildCode bc=new BuildCode(state, bf.getMap(), tu, la, pa); bc.buildCode(); } else { - BuildCode bc=new BuildCode(state, bf.getMap(), tu, sa); + BuildCode bc=new BuildCode(state, bf.getMap(), tu, sa, pa); bc.buildCode(); } } diff --git a/Robust/src/Runtime/DSTM/interface/dstm.h b/Robust/src/Runtime/DSTM/interface/dstm.h index 1f32fad6..e2ad79cf 100644 --- a/Robust/src/Runtime/DSTM/interface/dstm.h +++ b/Robust/src/Runtime/DSTM/interface/dstm.h @@ -8,10 +8,11 @@ /*********************************************************** * Macros **********************************************************/ -#define GET_NTUPLES(x) ((int *)(x)) -#define GET_PTR_OID(x) ((unsigned int *)(x + sizeof(int))) -#define GET_PTR_EOFF(x,n) ((short *)(x + sizeof(int) + (n*sizeof(unsigned int)))) -#define GET_PTR_ARRYFLD(x,n) ((short *)(x + sizeof(int) + (n*sizeof(unsigned int)) + (n*sizeof(short)))) +#define GET_SITEID(x) ((int *)(x)) +#define GET_NTUPLES(x) ((int *)(x + sizeof(int))) +#define GET_PTR_OID(x) ((unsigned int *)(x + 2*sizeof(int))) +#define GET_PTR_EOFF(x,n) ((short *)(x + 2*sizeof(int) + (n*sizeof(unsigned int)))) +#define GET_PTR_ARRYFLD(x,n) ((short *)(x + 2*sizeof(int) + (n*sizeof(unsigned int)) + (n*sizeof(short)))) #define ENDEBUG(s) { printf("Inside %s()\n", s); fflush(stdout);} #define EXDEBUG(s) {printf("Outside %s()\n", s); fflush(stdout);} /***************************************** @@ -44,7 +45,7 @@ #define THREAD_NOTIFY_REQUEST 24 #define THREAD_NOTIFY_RESPONSE 25 #define TRANS_UNSUCESSFUL 26 -#define CLOSE_CONNECTION 27 +#define CLOSE_CONNECTION 27 //Max number of objects #define MAX_OBJECTS 20 @@ -56,7 +57,9 @@ #define TID_LEN 20 #define LISTEN_PORT 2156 #define UDP_PORT 2158 - +//Prefetch tuning paramters +#define RETRYINTERVAL 100 //N +#define SHUTDOWNINTERVAL 1 //M #include #include @@ -80,6 +83,7 @@ #include "sockpool.h" #include "prelookup.h" #include +#include "addPrefetchEnhance.h" //bit designations for status field of objheader #define DIRTY 0x01 @@ -281,7 +285,7 @@ int transComProcess(local_thread_data_array_t *); int transAbortProcess(local_thread_data_array_t *); void transAbort(transrecord_t *trans); void sendPrefetchResponse(int sd, char *control, char *sendbuffer, int *size); -void prefetch(int, unsigned int *, unsigned short *, short*); +void prefetch(int, int, unsigned int *, unsigned short *, short*); void *transPrefetch(void *); void *mcqProcess(void *); prefetchpile_t *foundLocal(char *);// returns node with prefetch elements(oids, offsets) diff --git a/Robust/src/Runtime/DSTM/interface/trans.c b/Robust/src/Runtime/DSTM/interface/trans.c index 943ea720..2316f7df 100644 --- a/Robust/src/Runtime/DSTM/interface/trans.c +++ b/Robust/src/Runtime/DSTM/interface/trans.c @@ -20,7 +20,7 @@ /* Global Variables */ extern int classsize[]; - +pfcstats_t *evalPrefetch; objstr_t *prefetchcache; //Global Prefetch cache pthread_mutex_t prefetchcache_mutex;// Mutex to lock Prefetch Cache pthread_mutexattr_t prefetchcache_mutex_attr; /* Attribute for lock to make it a recursive lock */ @@ -135,16 +135,20 @@ inline int findmax(int *array, int arraylength) { /* This function is a prefetch call generated by the compiler that * populates the shared primary prefetch queue*/ -void prefetch(int ntuples, unsigned int *oids, unsigned short *endoffsets, short *arrayfields) { +void prefetch(int siteid, int ntuples, unsigned int *oids, unsigned short *endoffsets, short *arrayfields) { /* Allocate for the queue node*/ - int qnodesize = sizeof(int) + ntuples * (sizeof(unsigned short) + sizeof(unsigned int)) + endoffsets[ntuples - 1] * sizeof(short); + int qnodesize = 2*sizeof(int) + ntuples * (sizeof(unsigned short) + sizeof(unsigned int)) + endoffsets[ntuples - 1] * sizeof(short); char * node= getmemory(qnodesize); /* Set queue node values */ int len; int top=endoffsets[ntuples-1]; - *((int *)(node))=ntuples; - len = sizeof(int); + /* TODO: Remove this after testing */ + evalPrefetch[siteid].callcount++; + + *((int *)(node))=siteid; + *((int *)(node + sizeof(int))) = ntuples; + len = 2*sizeof(int); memcpy(node+len, oids, ntuples*sizeof(unsigned int)); memcpy(node+len+ntuples*sizeof(unsigned int), endoffsets, ntuples*sizeof(unsigned short)); memcpy(node+len+ntuples*(sizeof(unsigned int)+sizeof(short)), arrayfields, top*sizeof(short)); @@ -230,6 +234,10 @@ void transInit() { //Create and initialize prefetch cache structure prefetchcache = objstrCreate(PREFETCH_CACHE_SIZE); initializePCache(); + if((evalPrefetch = initPrefetchStats()) == NULL) { + printf("%s() Error allocating memory at %s, %d\n", __func__, __FILE__, __LINE__); + exit(0); + } /* Initialize attributes for mutex */ pthread_mutexattr_init(&prefetchcache_mutex_attr); @@ -635,8 +643,9 @@ void *transRequest(void *threadarg) { tdata = (thread_data_array_t *) threadarg; /* Send Trans Request */ - if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - perror("Error in socket for TRANS_REQUEST\n"); + if ((sd = socket(AF_INET, SOCK_STREAM, 0)) <= 0) { + printf("transRequest():error %d\n", errno); + perror("transRequest() socket error"); pthread_exit(NULL); } bzero((char*) &serv_addr, sizeof(serv_addr)); @@ -646,6 +655,7 @@ void *transRequest(void *threadarg) { /* Open Connection */ if (connect(sd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { + printf("transRequest():error %d, sd= %d\n", errno, sd); perror("transRequest() connect"); close(sd); pthread_exit(NULL); @@ -1139,11 +1149,13 @@ int transComProcess(local_thread_data_array_t *localtdata) { } prefetchpile_t *foundLocal(char *ptr) { + int siteid = *(GET_SITEID(ptr)); int ntuples = *(GET_NTUPLES(ptr)); unsigned int * oidarray = GET_PTR_OID(ptr); unsigned short * endoffsets = GET_PTR_EOFF(ptr, ntuples); short * arryfields = GET_PTR_ARRYFLD(ptr, ntuples); prefetchpile_t * head=NULL; + int numLocal = 0; int i; for(i=0;i