Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VSs_impls > VSs__MC_shared_impl
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 }