# HG changeset patch # User Nina Engelhardt # Date 1370957822 -7200 # Node ID 8733d1299c3a5304a324dea03341780f51e1cf73 # Parent bb6fbcbce14d49bc69465fac484fc2cfad304953 add barrier diff -r bb6fbcbce14d -r 8733d1299c3a VSs.c --- a/VSs.c Fri Jun 07 15:47:52 2013 +0200 +++ b/VSs.c Tue Jun 11 15:37:02 2013 +0200 @@ -245,6 +245,7 @@ semanticEnv->slavesReadyToResumeQ = makeVMSQ(); semanticEnv->freeExtraTaskSlvQ = makeVMSQ(); semanticEnv->taskReadyQ = makeVMSQ(); + semanticEnv->barrierQ = makeVMSQ(); semanticEnv->argPtrHashTbl = makeHashTable32( 20, &free_pointer_entry ); semanticEnv->commHashTbl = makeHashTable32( 16, &VMS_int__free ); @@ -444,6 +445,7 @@ freePrivQ(semanticEnv->freeExtraTaskSlvQ); freePrivQ(semanticEnv->slavesReadyToResumeQ); freePrivQ(semanticEnv->taskReadyQ); + freePrivQ(semanticEnv->barrierQ); freePrivQ(semanticEnv->deferredSubmitsQ); freeHashTable(semanticEnv->argPtrHashTbl); freeHashTable(semanticEnv->commHashTbl); diff -r bb6fbcbce14d -r 8733d1299c3a VSs.h --- a/VSs.h Fri Jun 07 15:47:52 2013 +0200 +++ b/VSs.h Tue Jun 11 15:37:02 2013 +0200 @@ -171,7 +171,8 @@ singleton_data_end, atomic, trans_start, - trans_end + trans_end, + barrier }; struct _VSsSemReq @@ -215,6 +216,7 @@ PrivQueueStruc *slavesReadyToResumeQ; //Shared (slaves not pinned) PrivQueueStruc *freeExtraTaskSlvQ; //Shared PrivQueueStruc *taskReadyQ; //Shared (tasks not pinned) + PrivQueueStruc *barrierQ; SlaveVP *slotTaskSlvs[NUM_CORES][NUM_ANIM_SLOTS]; HashTable *argPtrHashTbl; HashTable *commHashTbl; @@ -230,7 +232,6 @@ bool32 *coreIsDone; - int32 numCoresDone; int numInFlightTasks; PrivQueueStruc *deferredSubmitsQ; diff -r bb6fbcbce14d -r 8733d1299c3a VSs_PluginFns.c --- a/VSs_PluginFns.c Fri Jun 07 15:47:52 2013 +0200 +++ b/VSs_PluginFns.c Tue Jun 11 15:37:02 2013 +0200 @@ -127,20 +127,41 @@ if (semEnv->numLiveExtraTaskSlvs == 0 && semEnv->numLiveThreadSlvs == 0) { //This core sees no way to generate more tasks, so say it if (semEnv->coreIsDone[coreNum] == FALSE) { - semEnv->numCoresDone += 1; semEnv->coreIsDone[coreNum] = TRUE; #ifdef DEBUG__TURN_ON_SEQUENTIAL_MODE _VMSMasterEnv->shutdownInitiated = TRUE; #else - if (semEnv->numCoresDone == NUM_CORES) { //means no cores have work, and none can generate more - _VMSMasterEnv->shutdownInitiated = TRUE; + int allDone = TRUE; + for(int i=0;icoreIsDone[i]; + } + if (allDone) { //means no cores have work, and none can generate more + if(!isEmptyPrivQ(semEnv->barrierQ)) { + while(!isEmptyPrivQ(semEnv->barrierQ)){ + resume_slaveVP(readPrivQ(semEnv->barrierQ)); + } + semEnv->coreIsDone[coreNum]=FALSE; + returnSlv = readPrivQ(semEnv->slavesReadyToResumeQ); + goto ReturnTheSlv; + } else { + _VMSMasterEnv->shutdownInitiated = TRUE; + } } #endif } } else if (_VMSMasterEnv->numAnimatedSlaves == 0){ + if(!isEmptyPrivQ(semEnv->barrierQ)) { + while(!isEmptyPrivQ(semEnv->barrierQ)){ + resume_slaveVP(readPrivQ(semEnv->barrierQ)); + } + semEnv->coreIsDone[coreNum]=FALSE; + returnSlv = readPrivQ(semEnv->slavesReadyToResumeQ); + goto ReturnTheSlv; + } else { DEBUG__printf(TRUE,"Deadlock detected"); _VMSMasterEnv->shutdownInitiated = TRUE; + } } //return NULL.. no task and none to resume returnSlv = NULL; @@ -285,6 +306,8 @@ break; case trans_end: handleTransEnd(semReq, reqSlv, semEnv); break; + case barrier: handleBarrier(semReq, reqSlv, semEnv); + break; default: VMS_PI__throw_exception("Unknown request type\n", reqSlv, NULL); break; } diff -r bb6fbcbce14d -r 8733d1299c3a VSs_Request_Handlers.c --- a/VSs_Request_Handlers.c Fri Jun 07 15:47:52 2013 +0200 +++ b/VSs_Request_Handlers.c Tue Jun 11 15:37:02 2013 +0200 @@ -1571,3 +1571,8 @@ resume_slaveVP(requestingSlv, semEnv); } + +void +handleBarrier(VSsSemReq *semReq, SlaveVP *requestingSlv, VSsSemEnv *semEnv) { + writePrivQ(requestingSlv,semEnv->barrierQ); +} \ No newline at end of file diff -r bb6fbcbce14d -r 8733d1299c3a nanos-vss.c --- a/nanos-vss.c Fri Jun 07 15:47:52 2013 +0200 +++ b/nanos-vss.c Tue Jun 11 15:37:02 2013 +0200 @@ -207,6 +207,17 @@ return NANOS_OK; } +nanos_err_t nanos_omp_barrier ( void ){ + VSsSemReq reqData; + + reqData.reqType = barrier; + reqData.callingSlv = currVP; + + VMS_WL__send_sem_request(&reqData, currVP); + + return NANOS_OK; +} + void * nanos_smp_factory( void *args){ return NULL; }