stall mechanism working, but data passing between SESE's incorrect
authorjjenista <jjenista>
Thu, 30 Jul 2009 22:21:11 +0000 (22:21 +0000)
committerjjenista <jjenista>
Thu, 30 Jul 2009 22:21:11 +0000 (22:21 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/mlp_runtime.c
Robust/src/Runtime/mlp_runtime.h
Robust/src/Runtime/workschedule.c

index 0fd4ac1fd9bee532dfabaad1356ef350f8e89d6e..b25311c619b3d319710a5015b1561d217609fb1e 100644 (file)
@@ -513,6 +513,7 @@ public class BuildCode {
     outstructs.println("#endif");
     outstructs.println("#endif");
     if( state.MLP ) {
+      outstructs.println("#include \"mlp_runtime.h\"");
       outstructs.println("#include \"psemaphore.h\"");
     }
 
@@ -1753,12 +1754,10 @@ public class BuildCode {
     // generate the SESE record structure
     outputStructs.println(fsen.getSESErecordName()+" {");
     
-    // SESE's static class ID
-    outputStructs.println("  int classID;");
-
-    // child is issued with this locked, and it
-    // unlocks it when it completes
-    outputStructs.println("  psemaphore stallSem;");
+    // data common to any SESE, and it must be placed first so
+    // a module that doesn't know what kind of SESE record this
+    // is can cast the pointer to a common struct
+    outputStructs.println("  SESEcommon common;");
 
     // then garbage list stuff
     outputStructs.println("  INTPTR size;");
@@ -2226,7 +2225,7 @@ public class BuildCode {
        while( pItr.hasNext() ) {
          SESEandAgePair p = pItr.next();
          output.println("   {");
-         output.println("     SESErecord* child = (SESErecord*) "+p+";");
+         output.println("     SESEcommon* child = (SESEcommon*) "+p+";");
          output.println("     psem_take( &(child->stallSem) );");
          output.println("   }");
        }
@@ -2694,8 +2693,8 @@ public class BuildCode {
     output.println("     "+fsen.getSESErecordName()+"* seseToIssue = ("+
                           fsen.getSESErecordName()+"*) mlpAllocSESErecord( sizeof( "+
                           fsen.getSESErecordName()+" ) );");
-    output.println("     seseToIssue->classID = "+fsen.getIdentifier()+";");
-    output.println("     psem_init( &(seseToIssue->stallSem) );");
+    output.println("     seseToIssue->common.classID = "+fsen.getIdentifier()+";");
+    output.println("     psem_init( &(seseToIssue->common.stallSem) );");
 
     // give pointers to in-set variables, when this SESE is ready to
     // execute it should copy values from the pointers because they
@@ -2734,7 +2733,7 @@ public class BuildCode {
 
     if( fsexn.getFlatEnter() != mlpa.getRootSESE() ) {
       output.println("   {");
-      output.println("     psem_give( &("+paramsprefix+"->stallSem) );");
+      output.println("     psem_give( &("+paramsprefix+"->common.stallSem) );");
       output.println("   }");
     }
   }
index 25f5b9f88719ced7ddbfd16fa648b9acf494b597..1070c2c97ecc456d14c64262ecc8f66e318cda6c 100644 (file)
 
 
 void* mlpAllocSESErecord( int size ) {
-
-  void* newrec = RUNMALLOC( size );
-  
-  /*
-  SESErecord* commonView = (SESErecord*) newrec;
-  commonView->classID = classID;
-  pthread_mutex_init( &(newrec->lock),  NULL );
-  newrec->forwardList   = createQueue();
-  newrec->doneExecuting = FALSE;
-  */
-
+  void* newrec = RUNMALLOC( size );  
   return newrec;
 }
 
 
 void mlpFreeSESErecord( void* seseRecord ) {
-
-  /*
-  SESErecord* commonView = (SESErecord*) seseRecord;
-  pthread_mutex_destroy( &(commonView->lock) );
-  freeQueue( commonView->forwardList );
-  */
-
   RUNFREE( seseRecord );
 }
 
 
-/*
-struct rootSESEinSetObjs  { char** argv; };
-struct rootSESEinSetPrims { int argc;    };
-*/
-
 void mlpInit( int numProcessors, 
              void(*workFunc)(void*),
              int argc, char** argv,
              int maxSESEage ) {  
 
-  //SESErecord* rootSESE;
-  
-  //struct rootSESEinSetObjs*  inObjs  = RUNMALLOC( sizeof( struct rootSESEinSetObjs ) );
-  //struct rootSESEinSetPrims* inPrims = RUNMALLOC( sizeof( struct rootSESEinSetPrims ) );
-
   // first initialize the work scheduler
-  workScheduleInit( numProcessors, workFunc );
-
-  // the prepare the root SESE
-  //inObjs->argv  = argv;
-  //inPrims->argc = argc;
-  //rootSESE = mlpCreateSESErecord( 0, inObjs, NULL, inPrims, NULL );
-
-  // skip the issue step because the root SESE will
-  // never have outstanding dependencies
-  //workScheduleSubmit( (void*) rootSESE );
+  //workScheduleInit( numProcessors, workFunc );
 
-  // now the work scheduler is initialized and work is
-  // in the hopper, so begin processing.  This call 
-  // will not return
-  workScheduleBegin();
+  //workScheduleBegin();
 }
 
 
index 1fb78a1646b418fe90ce8ecb07a44a6e764b2ea2..d5b51c8cbc3deb689d640b429c3f5b02ba7c770c 100644 (file)
@@ -7,14 +7,11 @@
 #include "psemaphore.h"
 
 
-// forward delcarations
-//struct SESErecord_t;
-
-
-// note that this record is never used other than
-// to cast a customized record and have easy access
-// the common fields listed here
-typedef struct SESErecord_t {  
+// these fields are common to any SESE, and casting the
+// generated SESE record to this can be used, because
+// the common structure is always the first item in a
+// customized SESE record
+typedef struct SESEcommon_t {  
 
   // the identifier for the class of sese's that
   // are instances of one particular static code block
@@ -30,7 +27,7 @@ typedef struct SESErecord_t {
   struct Queue*   forwardList;
   int             doneExecuting;
 
-} SESErecord;
+} SESEcommon;
 
 
 /*
index 01aeab3784750207982a2559df7bcff5619f357c..659280717815a458c1c7a80e7fc9aa626fd720be 100644 (file)
@@ -231,7 +231,7 @@ void workScheduleInit( int numProcessors,
                        void(*func)(void*) ) {
   int i, status;
 
-  numWorkers = numProcessors;
+  numWorkers = numProcessors*5;
   workFunc   = func;
 
   dequeWorkUnits = createQueue();