a better workscheduler--still has a deficiency because it does not dynamically create...
authorjjenista <jjenista>
Tue, 18 Aug 2009 18:28:08 +0000 (18:28 +0000)
committerjjenista <jjenista>
Tue, 18 Aug 2009 18:28:08 +0000 (18:28 +0000)
Robust/src/Analysis/MLP/MLPAnalysis.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/workschedule.c
Robust/src/Tests/mlp/tinyTest/debugging.txt
Robust/src/Tests/mlp/tinyTest/test.java

index 49fca039d9d326c7b1eeafcdb2e8754cac55f476..4fa426014d619d5291e4e91db8884914c047a3f2 100644 (file)
@@ -143,7 +143,7 @@ public class MLPAnalysis {
       pruneVariableResultsWithLiveness( fm );
     }
     if( state.MLPDEBUG ) {      
-      System.out.println( "\nVariable Results-Out\n----------------\n"+fmMain.printMethod( variableResults ) );
+      //System.out.println( "\nVariable Results-Out\n----------------\n"+fmMain.printMethod( variableResults ) );
     }
     
 
index 789d90e42d1138f4be40319d205df2a671197567..240e6c5f5e4a3fe797ff425c14ca5507156b098d 100644 (file)
@@ -2022,6 +2022,12 @@ public class BuildCode {
       outmethod.println(    "    /* "+fsen.getPrettyIdentifier()+" */");
       outmethod.println(    "    case "+fsen.getIdentifier()+":");
       outmethod.println(    "      "+fsen.getSESEmethodName()+"( seseRecord );");  
+
+      if( fsen.equals( mlpa.getRootSESE() ) ) {
+       outmethod.println(  "      /* work scheduler works forever, explicitly exit */");
+       outmethod.println(  "      exit( 0 );");
+      }
+
       outmethod.println(    "      break;");
       outmethod.println(    "");
     }
index 659280717815a458c1c7a80e7fc9aa626fd720be..5b24b68d1769d46b4526ff948aacc88604a8c107 100644 (file)
@@ -28,8 +28,12 @@ typedef struct workerData_t {
   int             nextWorkerToLoad;
 } workerData;
 */
+
+
+static pthread_mutex_t systemLock;
+
 // just one queue for everyone
-static pthread_mutex_t dequeLock;
+//static pthread_mutex_t dequeLock;
 static deq*            dequeWorkUnits;
 
 
@@ -38,12 +42,18 @@ static deq*            dequeWorkUnits;
 static int             numWorkers;
 //static workerData*     workerDataArray;
 static pthread_t*      workerArray;
-static pthread_mutex_t systemBeginLock  = PTHREAD_MUTEX_INITIALIZER;
+
+static int systemStarted = 0;
+
+//static pthread_mutex_t systemBeginLock  = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t  systemBeginCond  = PTHREAD_COND_INITIALIZER;
-static pthread_mutex_t systemReturnLock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t  systemReturnCond = PTHREAD_COND_INITIALIZER;
+//static pthread_mutex_t systemReturnLock = PTHREAD_MUTEX_INITIALIZER;
+//static pthread_cond_t  systemReturnCond = PTHREAD_COND_INITIALIZER;
 static void(*workFunc)(void*);
 
+static pthread_cond_t  workAvailCond  = PTHREAD_COND_INITIALIZER;
+
+
 
 /*
 // helper func
@@ -144,35 +154,29 @@ void* workerMain( void* arg ) {
   
   void* workUnit;
 
-  int tries = 3;
-
   // all workers wait until system is ready
-  pthread_mutex_lock  ( &systemBeginLock );
-  pthread_cond_wait   ( &systemBeginCond, &systemBeginLock );
-  pthread_mutex_unlock( &systemBeginLock );
-
-  while( tries > 0 ) {
-
-    pthread_mutex_lock( &dequeLock );
+  pthread_mutex_lock  ( &systemLock );
+  while( !systemStarted ) {
+    pthread_cond_wait( &systemBeginCond, &systemLock );
+  }
+  pthread_mutex_unlock( &systemLock );
 
-    // look in the queue for work
-    if( !isEmpty( dequeWorkUnits ) ) {
-      workUnit = getItem( dequeWorkUnits );
-    } else {
-      workUnit = NULL;
-    }
+  while( 1 ) {
 
-    pthread_mutex_unlock( &dequeLock );
+    pthread_mutex_lock( &systemLock );
+    // wait for work
+    while( isEmpty( dequeWorkUnits ) ) {
+      pthread_cond_wait( &workAvailCond, &systemLock );
+    }     
+    workUnit = getItem( dequeWorkUnits );
+    pthread_mutex_unlock( &systemLock );
 
-    // yield processor before moving on
+    // yield processor before moving on, just to exercise
+    // system's out-of-order correctness
     if( sched_yield() == -1 ) { printf( "Error thread trying to yield.\n" ); exit( -1 ); }
-
-    if( workUnit != NULL ) {   
-      workFunc( workUnit );
-      tries = 3;
-    } else {
-      --tries;
-    }
+    if( sched_yield() == -1 ) { printf( "Error thread trying to yield.\n" ); exit( -1 ); }
+    
+    workFunc( workUnit );
   }
 
   return NULL;
@@ -236,7 +240,7 @@ void workScheduleInit( int numProcessors,
 
   dequeWorkUnits = createQueue();
 
-  status = pthread_mutex_init( &dequeLock, NULL );
+  status = pthread_mutex_init( &systemLock, NULL );
   if( status != 0 ) { printf( "Error\n" ); exit( -1 ); }
 
   workerArray = RUNMALLOC( sizeof( pthread_t ) * numWorkers );
@@ -275,9 +279,10 @@ void workScheduleSubmit( void* workUnit ) {
 */
 
 void workScheduleSubmit( void* workUnit ) {
-  pthread_mutex_lock  ( &dequeLock );
+  pthread_mutex_lock  ( &systemLock );
   addNewItemBack      ( dequeWorkUnits, workUnit );
-  pthread_mutex_unlock( &dequeLock );
+  pthread_cond_signal( &workAvailCond );
+  pthread_mutex_unlock( &systemLock );
 }
 
 
@@ -287,9 +292,10 @@ void workScheduleBegin() {
   int i;
 
   // tell all workers to begin
-  pthread_mutex_lock    ( &systemBeginLock );
+  pthread_mutex_lock    ( &systemLock );
+  systemStarted = 1;
   pthread_cond_broadcast( &systemBeginCond );
-  pthread_mutex_unlock  ( &systemBeginLock );  
+  pthread_mutex_unlock  ( &systemLock );  
 
   for( i = 0; i < numWorkers; ++i ) {
     pthread_join( workerArray[i], NULL );
index 96c48048bc8a655006f74f65ac8328f78b44c8b2..756f2bc1ffaa3eea04d743c93393add257bf38e8 100644 (file)
@@ -1,2 +1,11 @@
-break methods.c:6664
-run
+break methods.c:6605
+break methods.c:6606
+break methods.c:6644
+break methods.c:6657
+break methods.c:6755
+break methods.c:6782
+break methods.c:6789
+break methods.c:6793
+break methods.c:6805
+break methods.c:6808
+run 2
index c7637214c489143e1eee840c0e0b18daec5db0bd..1969cb84b9cbbaff0000af5c368c58ef873e528d 100644 (file)
@@ -8,7 +8,7 @@ public class Test {
 
   public static void main( String args[] ) {
     
-    //int x = Integer.parseInt( args[0] );
+    int x = Integer.parseInt( args[0] );
     //int y = Integer.parseInt( args[1] );
     //System.out.println( "root: x="+x+", y="+y );
 
@@ -28,13 +28,15 @@ public class Test {
 
     
     int total = 0;
-    for( int i = 0; i < 5; ++i ) {
+    for( int i = 0; i < x; ++i ) {
 
       System.out.println( "i="+i );
 
       sese sum {
        total = total + i;
       }
+
+      System.out.println( "pi="+i );
     }