# HG changeset patch # User Nina Engelhardt # Date 1332950558 -7200 # Node ID d20b105981b70c7a279e42cebc772dc13a25b508 # Parent 69a1875af605256340e13a9a17a2666ec0a55788 make idle VPs optional diff -r 69a1875af605 -r d20b105981b7 SSR.c --- a/SSR.c Wed Mar 21 11:12:08 2012 +0100 +++ b/SSR.c Wed Mar 28 18:02:38 2012 +0200 @@ -199,14 +199,16 @@ #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS SSR__init_counter_data_structs(); #endif + #ifdef IDLE_SLAVES semanticEnv->shutdownInitiated = FALSE; for(i=0;iidlePr[i][j] = VMS_int__create_slaveVP(&idle_fn,NULL); semanticEnv->idlePr[i][j]->coreAnimatedBy = i; + semanticEnv->idlePr[i][j]->typeOfVP = Idle; } } - + #endif #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC semanticEnv->unitList = makeListOfArrays(sizeof(Unit),128); semanticEnv->ctlDependenciesList = makeListOfArrays(sizeof(Dependency),128); diff -r 69a1875af605 -r d20b105981b7 SSR.h --- a/SSR.h Wed Mar 21 11:12:08 2012 +0100 +++ b/SSR.h Wed Mar 28 18:02:38 2012 +0200 @@ -18,6 +18,8 @@ //=========================================================================== #define NUM_STRUCS_IN_SEM_ENV 1000 +//#define IDLE_SLAVES + //This is hardware dependent -- it's the number of cycles of scheduling // overhead -- if a work unit is fewer than this, it is better being // combined sequentially with other work @@ -126,8 +128,10 @@ #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS ListOfArrays* counterList[NUM_CORES]; #endif + #ifdef IDLE_SLAVES SlaveVP* idlePr[NUM_CORES][NUM_ANIM_SLOTS]; int shutdownInitiated; + #endif } SSRSemEnv; diff -r 69a1875af605 -r d20b105981b7 SSR_PluginFns.c --- a/SSR_PluginFns.c Wed Mar 21 11:12:08 2012 +0100 +++ b/SSR_PluginFns.c Wed Mar 28 18:02:38 2012 +0200 @@ -46,7 +46,8 @@ assignPr = readPrivQ( semEnv->readyVPQs[coreNum] ); //Note, using a non-blocking queue -- it returns NULL if queue empty - if(!assignPr){ + #ifdef IDLE_SLAVES + if(!assignPr){ assignPr = semEnv->idlePr[coreNum][slotNum]; if(semEnv->shutdownInitiated) { @@ -72,8 +73,9 @@ } #endif } + #endif #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC - if (assignPr && assignPr->typeOfVP == Slave) { + if (assignPr && (assignPr->typeOfVP == Slave || assignPr->typeOfVP == Idle)) { //assignPr->numTimesAssigned++; Unit prev_in_slot = semEnv->last_in_slot[coreNum * NUM_ANIM_SLOTS + slotNum]; if(prev_in_slot.vp != 0){ @@ -194,8 +196,11 @@ semEnv->numSlaveVP -= 1; if( semEnv->numSlaveVP == 0 ) { //no more work, so shutdown + #ifdef IDLE_SLAVES semEnv->shutdownInitiated = TRUE; - //VMS_SS__shutdown(); + #else + VMS_SS__shutdown(); + #endif } } @@ -289,6 +294,16 @@ Unit newu; newu.vp = procr->slaveID; newu.task = procr->assignCount; + if(procr->assignCount <= 1){ + newu.ret_ptr = procr->resumeInstrPtr; + } else { + void* frame_ptr0 = procr->framePtr; + void* frame_ptr1 = *((void**)frame_ptr0); + void* frame_ptr2 = *((void**)frame_ptr1); + void* frame_ptr3 = *((void**)frame_ptr2); + void* ret_addr = *((void**)frame_ptr3 + 1); + newu.ret_ptr = ret_addr; + } addToListOfArrays(Unit,newu,semEnv->unitList); if (procr->assignCount > 1){ diff -r 69a1875af605 -r d20b105981b7 dependency.c --- a/dependency.c Wed Mar 21 11:12:08 2012 +0100 +++ b/dependency.c Wed Mar 28 18:02:38 2012 +0200 @@ -57,7 +57,7 @@ void print_unit_to_file(void* _unit){ Unit* unit = (Unit*) _unit; if(!unit) return; - fprintf(dependency_file,"unit,%d,%d\n",unit->vp,unit->task); + fprintf(dependency_file,"unit,%d,%d,%p\n",unit->vp,unit->task,unit->ret_ptr); } void print_nton_set_helper(void* _u){ diff -r 69a1875af605 -r d20b105981b7 dependency.h --- a/dependency.h Wed Mar 21 11:12:08 2012 +0100 +++ b/dependency.h Wed Mar 28 18:02:38 2012 +0200 @@ -15,6 +15,7 @@ typedef struct { int vp; int task; + void* ret_ptr; } Unit; typedef struct {