changeset 43:8733d1299c3a dev_expl_VP_and_DKU

add barrier
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 11 Jun 2013 15:37:02 +0200
parents bb6fbcbce14d
children 7e7f37aa2f61
files VSs.c VSs.h VSs_PluginFns.c VSs_Request_Handlers.c nanos-vss.c
diffstat 5 files changed, 47 insertions(+), 5 deletions(-) [+]
line diff
     1.1 --- a/VSs.c	Fri Jun 07 15:47:52 2013 +0200
     1.2 +++ b/VSs.c	Tue Jun 11 15:37:02 2013 +0200
     1.3 @@ -245,6 +245,7 @@
     1.4     semanticEnv->slavesReadyToResumeQ = makeVMSQ();
     1.5     semanticEnv->freeExtraTaskSlvQ    = makeVMSQ();
     1.6     semanticEnv->taskReadyQ           = makeVMSQ();
     1.7 +   semanticEnv->barrierQ             = makeVMSQ();
     1.8     
     1.9     semanticEnv->argPtrHashTbl  = makeHashTable32( 20, &free_pointer_entry );
    1.10     semanticEnv->commHashTbl    = makeHashTable32( 16, &VMS_int__free );
    1.11 @@ -444,6 +445,7 @@
    1.12      freePrivQ(semanticEnv->freeExtraTaskSlvQ);
    1.13      freePrivQ(semanticEnv->slavesReadyToResumeQ);
    1.14      freePrivQ(semanticEnv->taskReadyQ);
    1.15 +    freePrivQ(semanticEnv->barrierQ);
    1.16      freePrivQ(semanticEnv->deferredSubmitsQ);
    1.17      freeHashTable(semanticEnv->argPtrHashTbl);
    1.18      freeHashTable(semanticEnv->commHashTbl);
     2.1 --- a/VSs.h	Fri Jun 07 15:47:52 2013 +0200
     2.2 +++ b/VSs.h	Tue Jun 11 15:37:02 2013 +0200
     2.3 @@ -171,7 +171,8 @@
     2.4     singleton_data_end,
     2.5     atomic,
     2.6     trans_start,
     2.7 -   trans_end
     2.8 +   trans_end,
     2.9 +   barrier
    2.10   };
    2.11  
    2.12  struct _VSsSemReq
    2.13 @@ -215,6 +216,7 @@
    2.14     PrivQueueStruc  *slavesReadyToResumeQ; //Shared (slaves not pinned)
    2.15     PrivQueueStruc  *freeExtraTaskSlvQ;    //Shared
    2.16     PrivQueueStruc  *taskReadyQ;           //Shared (tasks not pinned)
    2.17 +   PrivQueueStruc  *barrierQ;  
    2.18     SlaveVP         *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS];
    2.19     HashTable       *argPtrHashTbl;
    2.20     HashTable       *commHashTbl;
    2.21 @@ -230,7 +232,6 @@
    2.22  
    2.23  
    2.24     bool32          *coreIsDone;
    2.25 -   int32            numCoresDone;
    2.26     
    2.27     int              numInFlightTasks;
    2.28     PrivQueueStruc  *deferredSubmitsQ;
     3.1 --- a/VSs_PluginFns.c	Fri Jun 07 15:47:52 2013 +0200
     3.2 +++ b/VSs_PluginFns.c	Tue Jun 11 15:37:02 2013 +0200
     3.3 @@ -127,20 +127,41 @@
     3.4              if (semEnv->numLiveExtraTaskSlvs == 0 &&
     3.5                      semEnv->numLiveThreadSlvs == 0) { //This core sees no way to generate more tasks, so say it
     3.6                  if (semEnv->coreIsDone[coreNum] == FALSE) {
     3.7 -                    semEnv->numCoresDone += 1;
     3.8                      semEnv->coreIsDone[coreNum] = TRUE;
     3.9  #ifdef DEBUG__TURN_ON_SEQUENTIAL_MODE
    3.10                      _VMSMasterEnv->shutdownInitiated = TRUE;
    3.11                 
    3.12  #else
    3.13 -                    if (semEnv->numCoresDone == NUM_CORES) { //means no cores have work, and none can generate more
    3.14 -                        _VMSMasterEnv->shutdownInitiated = TRUE;
    3.15 +                    int allDone = TRUE;
    3.16 +                    for(int i=0;i<NUM_CORES;i++){
    3.17 +                        allDone = allDone && semEnv->coreIsDone[i];
    3.18 +                    }
    3.19 +                    if (allDone) { //means no cores have work, and none can generate more
    3.20 +                        if(!isEmptyPrivQ(semEnv->barrierQ)) {
    3.21 +                            while(!isEmptyPrivQ(semEnv->barrierQ)){
    3.22 +                                resume_slaveVP(readPrivQ(semEnv->barrierQ));
    3.23 +                            }
    3.24 +                            semEnv->coreIsDone[coreNum]=FALSE;
    3.25 +                            returnSlv = readPrivQ(semEnv->slavesReadyToResumeQ);
    3.26 +                            goto ReturnTheSlv;
    3.27 +                        } else {
    3.28 +                            _VMSMasterEnv->shutdownInitiated = TRUE;
    3.29 +                        }
    3.30                      }
    3.31  #endif
    3.32                  }
    3.33              } else if (_VMSMasterEnv->numAnimatedSlaves == 0){
    3.34 +                if(!isEmptyPrivQ(semEnv->barrierQ)) {
    3.35 +                            while(!isEmptyPrivQ(semEnv->barrierQ)){
    3.36 +                                resume_slaveVP(readPrivQ(semEnv->barrierQ));
    3.37 +                            }
    3.38 +                            semEnv->coreIsDone[coreNum]=FALSE;
    3.39 +                            returnSlv = readPrivQ(semEnv->slavesReadyToResumeQ);
    3.40 +                            goto ReturnTheSlv;
    3.41 +                        } else {
    3.42                  DEBUG__printf(TRUE,"Deadlock detected");
    3.43                  _VMSMasterEnv->shutdownInitiated = TRUE;
    3.44 +                        }
    3.45              }
    3.46              //return NULL.. no task and none to resume
    3.47              returnSlv = NULL;
    3.48 @@ -285,6 +306,8 @@
    3.49              break;
    3.50          case trans_end: handleTransEnd(semReq, reqSlv, semEnv);
    3.51              break;
    3.52 +        case barrier: handleBarrier(semReq, reqSlv, semEnv);
    3.53 +            break;
    3.54          default: VMS_PI__throw_exception("Unknown request type\n", reqSlv, NULL);
    3.55              break;
    3.56      }
     4.1 --- a/VSs_Request_Handlers.c	Fri Jun 07 15:47:52 2013 +0200
     4.2 +++ b/VSs_Request_Handlers.c	Tue Jun 11 15:37:02 2013 +0200
     4.3 @@ -1571,3 +1571,8 @@
     4.4  
     4.5      resume_slaveVP(requestingSlv, semEnv);
     4.6  }
     4.7 +
     4.8 +void
     4.9 +handleBarrier(VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv) {
    4.10 +    writePrivQ(requestingSlv,semEnv->barrierQ);
    4.11 +}
    4.12 \ No newline at end of file
     5.1 --- a/nanos-vss.c	Fri Jun 07 15:47:52 2013 +0200
     5.2 +++ b/nanos-vss.c	Tue Jun 11 15:37:02 2013 +0200
     5.3 @@ -207,6 +207,17 @@
     5.4      return NANOS_OK;
     5.5  }
     5.6  
     5.7 +nanos_err_t nanos_omp_barrier ( void ){
     5.8 +    VSsSemReq reqData;
     5.9 +
    5.10 +    reqData.reqType = barrier;
    5.11 +    reqData.callingSlv = currVP;
    5.12 +
    5.13 +    VMS_WL__send_sem_request(&reqData, currVP);
    5.14 +    
    5.15 +    return NANOS_OK;
    5.16 +}
    5.17 +
    5.18  void * nanos_smp_factory( void *args){
    5.19      return NULL;
    5.20  }