From 641039128b774dd7722e73944c2ba18b15cbe43a Mon Sep 17 00:00:00 2001 From: bdemsky Date: Wed, 13 Oct 2010 21:35:18 +0000 Subject: [PATCH] changes...plus a little optimization --- Robust/src/Analysis/MLP/MLPAnalysis.java | 5 +- Robust/src/IR/Flat/BuildCode.java | 220 ++++++++---------- Robust/src/IR/Flat/FlatSESEEnterNode.java | 21 +- .../src/IR/Flat/RuntimeConflictResolver.java | 9 +- Robust/src/Runtime/mlp_runtime.h | 3 + Robust/src/Runtime/oooJava/rcr_runtime.c | 9 + Robust/src/Runtime/oooJava/rcr_runtime.h | 8 + Robust/src/Runtime/workschedule.c | 24 +- 8 files changed, 161 insertions(+), 138 deletions(-) diff --git a/Robust/src/Analysis/MLP/MLPAnalysis.java b/Robust/src/Analysis/MLP/MLPAnalysis.java index 95744071..c0e610cc 100644 --- a/Robust/src/Analysis/MLP/MLPAnalysis.java +++ b/Robust/src/Analysis/MLP/MLPAnalysis.java @@ -10,6 +10,7 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; +import java.util.Collection; import java.util.Set; import java.util.Stack; import java.util.Map.Entry; @@ -1208,7 +1209,7 @@ public class MLPAnalysis { if (!fsen.getIsCallerSESEplaceholder()) { // uniquely taint each live-in variable - Set set = fsen.getInVarSet(); + Collection set = fsen.getInVarSet(); Iterator iter = set.iterator(); int idx = 0; while (iter.hasNext()) { @@ -2394,7 +2395,7 @@ public class MLPAnalysis { .getOwnvershipGraphByMethodContext(mc); if (!fsen.getIsCallerSESEplaceholder()) { - Set invar_set = fsen.getInVarSet(); + Collection invar_set = fsen.getInVarSet(); SESESummary seseSummary=seseSummaryMap.get(fsen); ConflictGraph conflictGraph=null; diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 60080861..aaf0d431 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -2122,14 +2122,34 @@ public class BuildCode { // calculated above should match the pointer object params // used in the following code, but let's just leave the working // implementation unless there is actually a problem... + + Vector inset=fsen.getInVarVector(); + int incount=0; + + for(int i=0; i lockSet = oooa.getLockMappings(graph); - System.out.println("#lockSet="+lockSet); - if (lockSet.size() > 0) { - output.println(" numMemoryQueue=" + lockSet.size() + ";"); - output.println(" runningSESE->numMemoryQueue=numMemoryQueue;"); - output.println(" runningSESE->memoryQueueArray=mlpCreateMemoryQueueArray(numMemoryQueue);"); - output.println(); - } - output.println(" }"); + output.println(" // set up memory queues "); + output.println(" int numMemoryQueue=0;"); + output.println(" int memoryQueueItemID=0;"); + Analysis.OoOJava.ConflictGraph graph = oooa.getConflictGraph(fsen); + if (graph != null && graph.hasConflictEdge()) { + output.println(" {"); + Set lockSet = oooa.getLockMappings(graph); + System.out.println("#lockSet="+lockSet); + if (lockSet.size() > 0) { + output.println(" numMemoryQueue=" + lockSet.size() + ";"); + output.println(" runningSESE->numMemoryQueue=numMemoryQueue;"); + output.println(" runningSESE->memoryQueueArray=mlpCreateMemoryQueueArray(numMemoryQueue);"); + output.println(); } - }else{ + output.println(" }"); + } + } else { output.println(" // set up memory queues "); output.println(" int numMemoryQueue=0;"); output.println(" int memoryQueueItemID=0;"); @@ -2323,7 +2346,6 @@ public class BuildCode { } output.println(" }"); } - } @@ -2356,9 +2378,7 @@ public class BuildCode { } output.println(" // decrement references to static sources"); - for( Iterator pairItr = fsen.getStaticInVarSrcs().iterator(); - pairItr.hasNext(); - ) { + for( Iterator pairItr = fsen.getStaticInVarSrcs().iterator(); pairItr.hasNext(); ) { SESEandAgePair srcPair = pairItr.next(); output.println("#ifndef OOO_DISABLE_TASKMEMPOOL" ); output.println(" {"); @@ -2904,9 +2924,13 @@ public class BuildCode { output.println("#endif"); } output.println(" pthread_mutex_lock( &(common->lock) );"); - output.println(" while( common->doneExecuting == FALSE ) {"); - output.println(" pthread_cond_wait( &(common->doneCond), &(common->lock) );"); - output.println(" }"); + output.println(" if( common->doneExecuting == FALSE ) {"); + output.println(" stopforgc((struct garbagelist *)&___locals___);"); + output.println(" do {"); + output.println(" pthread_cond_wait( &(common->doneCond), &(common->lock) );"); + output.println(" } while( common->doneExecuting == FALSE );"); + output.println(" restartaftergc();"); + output.println(" }"); output.println(" pthread_mutex_unlock( &(common->lock) );"); // copy things we might have stalled for @@ -3728,15 +3752,15 @@ public class BuildCode { ); } + if (state.RCR) { + output.println(" seseToIssumer->common.offsetToParamRecords=(INTPTR)sizeof("+fsen.getSESErecordName()+") - (INTPTR) & ((("+fsen.getSESErecordName()+"*)0)->rcrRecords);"); + } + // fill in common data output.println(" int localCount=0;"); output.println(" seseToIssue->common.classID = "+fsen.getIdentifier()+";"); output.println(" psem_init( &(seseToIssue->common.stallSem) );"); - output.println(" seseToIssue->common.forwardList = createQueue();"); - //output.println(" seseToIssue->common.forwardList.numItems = 0;"); - //output.println(" seseToIssue->common.forwardList.nextElement = NULL;"); - output.println(" seseToIssue->common.unresolvedDependencies = 10000;"); output.println(" pthread_cond_init( &(seseToIssue->common.doneCond), NULL );"); output.println(" seseToIssue->common.doneExecuting = FALSE;"); @@ -3790,22 +3814,10 @@ public class BuildCode { SESEandAgePair srcPair = staticSrcsItr.next(); output.println(" {"); output.println(" SESEcommon* src = (SESEcommon*)"+srcPair+";"); - - - if(GENERATEPRECISEGC){ - output.println(" stopforgc((struct garbagelist *)&___locals___);"); - } - output.println(" pthread_mutex_lock( &(src->lock) );"); - - if(GENERATEPRECISEGC){ - output.println(" restartaftergc();"); - } - // FORWARD TODO output.println(" if( !src->doneExecuting ) {"); output.println(" addNewItem( src->forwardList, seseToIssue );"); - //output.println(" ADD_FORWARD_ITEM( src->forwardList, seseToIssue );"); output.println(" ++(localCount);"); output.println(" }"); output.println("#ifndef OOO_DISABLE_TASKMEMPOOL" ); @@ -3833,14 +3845,7 @@ public class BuildCode { // the address off to the new child, because you're not done executing and // might change the variable, so copy it right now output.println(" if( src != NULL ) {"); - //eomgc - if(GENERATEPRECISEGC){ - output.println(" stopforgc((struct garbagelist *)&___locals___);"); - } output.println(" pthread_mutex_lock( &(src->lock) );"); - if(GENERATEPRECISEGC){ - output.println(" restartaftergc();"); - } // FORWARD TODO @@ -3908,19 +3913,23 @@ public class BuildCode { output.println(" }"); output.println("#endif // OOO_DISABLE_TASKMEMPOOL" ); } - + + if (state.RCR) { + + + } + + if(state.RCR) { + //TODO BCD + //clear out the parameter records + + } //////////////// // count up memory conflict dependencies, // eom if(state.OOOJAVA){ - - //output.println(" seseToIssue->common.numMemoryQueue=0;"); - //output.println(" seseToIssue->common.rentryIdx=0;"); - //output.println(" seseToIssue->common.unresolvedRentryIdx=0;"); - //output.println(" seseToIssue->common.memoryQueueArray=NULL;"); - FlatSESEEnterNode parent = fsen.getParent(); Analysis.OoOJava.ConflictGraph graph = oooa.getConflictGraph(parent); if (graph != null && graph.hasConflictEdge()) { @@ -3929,23 +3938,21 @@ public class BuildCode { output.println(" //add memory queue element"); Analysis.OoOJava.SESEWaitingQueue seseWaitingQueue= graph.getWaitingElementSetBySESEID(fsen.getIdentifier(), seseLockSet); - if(seseWaitingQueue.getWaitingElementSize()>0){ + if(seseWaitingQueue.getWaitingElementSize()>0) { output.println(" {"); output.println(" REntry* rentry=NULL;"); output.println(" INTPTR* pointer=NULL;"); output.println(" seseToIssue->common.rentryIdx=0;"); - + Set queueIDSet=seseWaitingQueue.getQueueIDSet(); - for (Iterator iterator = queueIDSet.iterator(); iterator - .hasNext();) { + for (Iterator iterator = queueIDSet.iterator(); iterator.hasNext();) { Integer key = (Integer) iterator.next(); int queueID=key.intValue(); Set waitingQueueSet = seseWaitingQueue.getWaitingElementSet(queueID); int enqueueType=seseWaitingQueue.getType(queueID); - if(enqueueType==SESEWaitingQueue.EXCEPTION){ - output.println(" INITIALIZEBUF(runningSESE->memoryQueueArray[" - + queueID+ "]);"); + if(enqueueType==SESEWaitingQueue.EXCEPTION) { + output.println(" INITIALIZEBUF(runningSESE->memoryQueueArray[" + queueID+ "]);"); } for (Iterator iterator2 = waitingQueueSet.iterator(); iterator2.hasNext();) { Analysis.OoOJava.WaitingElement waitingElement @@ -3972,9 +3979,7 @@ public class BuildCode { VariableSourceToken vst = fsen.getStaticInVarSrc(td); if (vst != null) { - String srcId = "SESE_" - + vst.getSESE() - .getPrettyIdentifier() + String srcId = "SESE_" + vst.getSESE().getPrettyIdentifier() + vst.getSESE().getIdentifier() + "_" + vst.getAge(); output.println(" pointer=(void*)&seseToIssue->" @@ -3990,7 +3995,7 @@ public class BuildCode { } else { output.println(" rentry=mlpCreateFineREntry(" + waitingElement.getStatus() - + ", &(seseToIssue->common), (void*)&seseToIssue->" + + ", &(seseToIssue->common), (void*)&seseToIssue->" + waitingElement.getDynID() + ");"); } @@ -4003,8 +4008,8 @@ public class BuildCode { output.println(" seseToIssue->common.rentryArray[seseToIssue->common.rentryIdx++]=rentry;"); output.println(" if(ADDRENTRY(runningSESE->memoryQueueArray[" + waitingElement.getQueueID() - + "],rentry)==NOTREADY){"); - output.println(" ++(localCount);"); + + "],rentry)==NOTREADY) {"); + output.println(" localCount++;"); output.println(" }"); // Trying to execute the dynamic coarse grain conflict strategy... @@ -4030,10 +4035,7 @@ public class BuildCode { } } }else{ - output - .println(" ADDRENTRYTOBUF(runningSESE->memoryQueueArray[" - + waitingElement.getQueueID() - + "],rentry);"); + output.println(" ADDRENTRYTOBUF(runningSESE->memoryQueueArray[" + waitingElement.getQueueID() + "],rentry);"); } } if(enqueueType!=SESEWaitingQueue.NORMAL){ @@ -4045,8 +4047,7 @@ public class BuildCode { } output.println(); } - - }else{ + } else { ConflictGraph graph = null; FlatSESEEnterNode parent = fsen.getParent(); if (parent != null) { @@ -4068,7 +4069,7 @@ public class BuildCode { output.println(" REntry* rentry=NULL;"); output.println(" INTPTR* pointer=NULL;"); output.println(" seseToIssue->common.rentryIdx=0;"); - + Set queueIDSet=seseWaitingQueue.getQueueIDSet(); for (Iterator iterator = queueIDSet.iterator(); iterator .hasNext();) { @@ -4165,32 +4166,24 @@ public class BuildCode { if(enqueueType!=SESEWaitingQueue.NORMAL){ output.println(" localCount+=RESOLVEBUF(runningSESE->memoryQueueArray[" + queueID+ "],&seseToIssue->common);"); - } + } } output.println(" }"); } output.println(); } } - //////////////// } - - // release this SESE for siblings to update its dependencies or, - // eventually, for it to mark itself finished - // output.println(" pthread_mutex_unlock( &(seseToIssue->common.lock) );"); - + + // Enqueue Task Record + if (state.RCR) { + output.println(" enqueueTR((void *)seseToIssue);"); + } + // if there were no outstanding dependencies, issue here output.println(" if( atomic_sub_and_test(10000-localCount,&(seseToIssue->common.unresolvedDependencies) ) ) {"); output.println(" workScheduleSubmit( (void*)seseToIssue );"); output.println(" }"); - /* - output.println(" if( seseToIssue->common.unresolvedDependencies == 0 ) {"); - output.println(" workScheduleSubmit( (void*)seseToIssue );"); - output.println(" }"); - */ - // release this SESE for siblings to update its dependencies or, - // eventually, for it to mark itself finished -// output.println(" pthread_mutex_unlock( &(seseToIssue->common.lock) );"); if( state.COREPROF ) { output.println("#ifdef CP_EVENTID_TASKDISPATCH"); @@ -4248,22 +4241,13 @@ public class BuildCode { // this SESE cannot be done until all of its children are done // so grab your own lock with the condition variable for watching // that the number of your running children is greater than zero - if (GENERATEPRECISEGC){ - output.println(" stopforgc((struct garbagelist *)&___locals___);"); - } output.println(" pthread_mutex_lock( &("+com+".lock) );"); - if (GENERATEPRECISEGC){ - output.println(" restartaftergc();"); - } - output.println(" while( "+com+".numRunningChildren > 0 ) {"); - if (GENERATEPRECISEGC){ -// output.println(" stopforgc((struct garbagelist *)&(((SESEcommon*)(___params___))[1]));"); - output.println(" stopforgc((struct garbagelist *)&___locals___);"); - } - output.println(" pthread_cond_wait( &("+com+".runningChildrenCond), &("+com+".lock) );"); - if (GENERATEPRECISEGC){ - output.println(" restartaftergc();"); - } + output.println(" if ( "+com+".numRunningChildren > 0 ) {"); + output.println(" stopforgc((struct garbagelist *)&___locals___);"); + output.println(" do {"); + output.println(" pthread_cond_wait( &("+com+".runningChildrenCond), &("+com+".lock) );"); + output.println(" } while( "+com+".numRunningChildren > 0 );"); + output.println(" restartaftergc();"); output.println(" }"); @@ -4325,13 +4309,9 @@ public class BuildCode { output.println(" }"); -// output.println(" pthread_mutex_lock( &(consumer->lock) );"); -// output.println(" --(consumer->unresolvedDependencies);"); -// output.println(" if( consumer->unresolvedDependencies == 0 ) {"); output.println(" if( atomic_sub_and_test(1, &(consumer->unresolvedDependencies)) ){"); output.println(" workScheduleSubmit( (void*)consumer );"); output.println(" }"); -// output.println(" pthread_mutex_unlock( &(consumer->lock) );"); output.println(" }"); @@ -4363,13 +4343,7 @@ public class BuildCode { // last of all, decrement your parent's number of running children output.println(" if( "+paramsprefix+"->common.parent != NULL ) {"); output.println(" if (atomic_sub_and_test(1, &"+paramsprefix+"->common.parent->numRunningChildren)) {"); - if (GENERATEPRECISEGC){ - output.println(" stopforgc((struct garbagelist *)&___locals___);"); - } output.println(" pthread_mutex_lock( &("+paramsprefix+"->common.parent->lock) );"); - if (GENERATEPRECISEGC){ - output.println(" restartaftergc();"); - } output.println(" pthread_cond_signal( &("+paramsprefix+"->common.parent->runningChildrenCond) );"); output.println(" pthread_mutex_unlock( &("+paramsprefix+"->common.parent->lock) );"); output.println(" }"); diff --git a/Robust/src/IR/Flat/FlatSESEEnterNode.java b/Robust/src/IR/Flat/FlatSESEEnterNode.java index 79d01055..d75e137e 100644 --- a/Robust/src/IR/Flat/FlatSESEEnterNode.java +++ b/Robust/src/IR/Flat/FlatSESEEnterNode.java @@ -3,6 +3,8 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.Set; import java.util.Vector; +import java.util.Iterator; +import java.util.Collection; import Analysis.MLP.SESEEffectsKey; import Analysis.MLP.SESEEffectsSet; @@ -35,7 +37,7 @@ public class FlatSESEEnterNode extends FlatNode { protected Set children; - protected Set inVars; + protected Vector inVars; protected Set outVars; protected Set needStaticNameInCode; @@ -82,7 +84,7 @@ public class FlatSESEEnterNode extends FlatNode { oldestAgeToTrack = new Integer( 0 ); children = new HashSet(); - inVars = new HashSet(); + inVars = new Vector(); outVars = new HashSet(); needStaticNameInCode = new HashSet(); staticInVarSrcs = new HashSet(); @@ -167,7 +169,8 @@ public class FlatSESEEnterNode extends FlatNode { } public void addInVar( TempDescriptor td ) { - inVars.add( td ); + if (!inVars.contains(td)) + inVars.add( td ); } public void addOutVar( TempDescriptor td ) { @@ -175,14 +178,22 @@ public class FlatSESEEnterNode extends FlatNode { } public void addInVarSet( Set s ) { - inVars.addAll( s ); + for(Iterator sit=s.iterator();sit.hasNext();) { + TempDescriptor tmp=sit.next(); + if (!inVars.contains(tmp)) + inVars.add(tmp); + } } public void addOutVarSet( Set s ) { outVars.addAll( s ); } - public Set getInVarSet() { + public Collection getInVarSet() { + return inVars; + } + + public Vector getInVarVector() { return inVars; } diff --git a/Robust/src/IR/Flat/RuntimeConflictResolver.java b/Robust/src/IR/Flat/RuntimeConflictResolver.java index 1714619b..87c118f5 100644 --- a/Robust/src/IR/Flat/RuntimeConflictResolver.java +++ b/Robust/src/IR/Flat/RuntimeConflictResolver.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; @@ -148,7 +149,7 @@ public class RuntimeConflictResolver { private void traverseSESEBlock(FlatSESEEnterNode rblock, ReachGraph rg) { - Set inVars = rblock.getInVarSet(); + Collection inVars = rblock.getInVarSet(); if (inVars.size() == 0) return; @@ -190,11 +191,7 @@ public class RuntimeConflictResolver { } } - - private void traverseStallSite( - FlatNode enterNode, - TempDescriptor invar, - ReachGraph rg) { + private void traverseStallSite(FlatNode enterNode, TempDescriptor invar, ReachGraph rg) { TypeDescriptor type = invar.getType(); if(type == null || type.isPrimitive()) { return; diff --git a/Robust/src/Runtime/mlp_runtime.h b/Robust/src/Runtime/mlp_runtime.h index 6a2972ea..743fe189 100644 --- a/Robust/src/Runtime/mlp_runtime.h +++ b/Robust/src/Runtime/mlp_runtime.h @@ -122,6 +122,9 @@ typedef struct SESEcommon_t { int numDependentSESErecords; int offsetToDepSESErecords; +#ifdef RCR + int offsetToParamRecords; +#endif // for determining when task records can be returned // to the parent record's memory pool diff --git a/Robust/src/Runtime/oooJava/rcr_runtime.c b/Robust/src/Runtime/oooJava/rcr_runtime.c index f0382d66..cbf4e06b 100644 --- a/Robust/src/Runtime/oooJava/rcr_runtime.c +++ b/Robust/src/Runtime/oooJava/rcr_runtime.c @@ -1,8 +1,17 @@ #include "rcr_runtime.h" +#include "mlp_runtime.h" void workerTR(void *x) { struct trQueue * queue=(struct trQueue *)x; while(true) { + SESEcommon * tmp; + do { + tmp=(SESEcommon *) dequeueTR(TRqueue); + if (tmp!=NULL) + break; + sched_yield(); + } while(1); + } } diff --git a/Robust/src/Runtime/oooJava/rcr_runtime.h b/Robust/src/Runtime/oooJava/rcr_runtime.h index bcc90a01..fe5b4782 100644 --- a/Robust/src/Runtime/oooJava/rcr_runtime.h +++ b/Robust/src/Runtime/oooJava/rcr_runtime.h @@ -5,4 +5,12 @@ extern __thread struct trqueue * TRqueue; void workerTR(void *); +#define RCRSIZE 32 + +struct rcrRecord { + int count; + int index; + int flag; + int array[RCRSIZE]; +}; #endif diff --git a/Robust/src/Runtime/workschedule.c b/Robust/src/Runtime/workschedule.c index bdca1127..f342bedc 100644 --- a/Robust/src/Runtime/workschedule.c +++ b/Robust/src/Runtime/workschedule.c @@ -6,6 +6,9 @@ #include "workschedule.h" #include "mlp_runtime.h" #include "coreprof/coreprof.h" +#ifdef RCR +#include "rcr_runtime.h" +#endif // NOTE: Converting this from a work-stealing strategy // to a single-queue thread pool protected by a single @@ -50,6 +53,10 @@ extern __thread SESEcommon* seseCommon; __thread int oid; +#ifdef RCR +#include "trqueue.h" +__thread struct trqueue * TRqueue; +#endif void workerExit( void* arg ) { @@ -57,8 +64,6 @@ void workerExit( void* arg ) { CP_EXIT(); } - - void* workerMain( void* arg ) { void* workUnit; WorkerData* myData = (WorkerData*) arg; @@ -74,6 +79,21 @@ void* workerMain( void* arg ) { // oid with value 0 indicates an invalid object oid = myData->id + 1; +#ifdef RCR + //allocate task record queue + pthread_t thread; + pthread_attr_t nattr; + pthread_attr_init(&nattr); + pthread_attr_setdetachstate(&nattr, PTHREAD_CREATE_DETACHED); + TRqueue=allocTR(); + int status = pthread_create( &(workerDataArray[i].workerThread), + NULL, + workerTR, + (void*) TRqueue); + pthread_attr_destroy(&nattr); + if( status != 0 ) { printf( "Error\n" ); exit( -1 ); } +#endif + //pthread_setcanceltype ( PTHREAD_CANCEL_ASYNCHRONOUS, &oldState ); //pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, &oldState ); -- 2.34.1