# HG changeset patch # User Nina Engelhardt # Date 1325691575 -3600 # Node ID 70d24e2343bbe80d875a725ba3dc16b6f0664e7b # Parent 593fe0543a221cf98a594abb7fddedbf076ea507 add loopgraph recording (\! changed scheduler fn prototype \!) diff -r 593fe0543a22 -r 70d24e2343bb SSR.h --- a/SSR.h Wed Dec 21 16:53:22 2011 +0100 +++ b/SSR.h Wed Jan 04 16:39:35 2012 +0100 @@ -111,7 +111,9 @@ ListOfArrays* commDependenciesList; NtoN** ntonGroups; PrivDynArrayInfo* ntonGroupsInfo; - //NtoN structure? + ListOfArrays* dynDependenciesList; + Unit last_in_slot[NUM_CORES * NUM_SCHED_SLOTS]; + ListOfArrays* hwArcs; #endif } @@ -240,7 +242,7 @@ SSR__Request_Handler( VirtProcr *requestingPr, void *_semEnv ); VirtProcr * -SSR__schedule_virt_procr( void *_semEnv, int coreNum ); +SSR__schedule_virt_procr( void *_semEnv, int coreNum, int slotNum ); VirtProcr* SSR__create_procr_helper( VirtProcrFnPtr fnPtr, void *initData, diff -r 593fe0543a22 -r 70d24e2343bb SSR_PluginFns.c --- a/SSR_PluginFns.c Wed Dec 21 16:53:22 2011 +0100 +++ b/SSR_PluginFns.c Wed Jan 04 16:39:35 2012 +0100 @@ -36,7 +36,7 @@ char __Scheduler[] = "FIFO Scheduler"; //Gobal variable for name in saved histogram VirtProcr * -SSR__schedule_virt_procr( void *_semEnv, int coreNum ) +SSR__schedule_virt_procr( void *_semEnv, int coreNum, int slotNum ) { VirtProcr *schedPr; SSRSemEnv *semEnv; @@ -44,7 +44,24 @@ schedPr = readPrivQ( semEnv->readyVPQs[coreNum] ); //Note, using a non-blocking queue -- it returns NULL if queue empty + if (schedPr) { + schedPr->numTimesScheduled++; +#ifdef OBSERVE_UCC + Unit prev_in_slot = semEnv->last_in_slot[coreNum * NUM_SCHED_SLOTS + slotNum]; + if(prev_in_slot.vp != 0){ + Dependency newd; + newd.from_vp = prev_in_slot.vp; + newd.from_task = prev_in_slot.task; + newd.to_vp = schedPr->procrID; + newd.to_task = schedPr->numTimesScheduled; + addToListOfArrays(Dependency,newd,semEnv->hwArcs); + } + prev_in_slot.vp = schedPr->procrID; + prev_in_slot.task = schedPr->numTimesScheduled; + semEnv->last_in_slot[coreNum * NUM_SCHED_SLOTS + slotNum] = prev_in_slot; +#endif + } return( schedPr ); } diff -r 593fe0543a22 -r 70d24e2343bb SSR_Request_Handlers.c --- a/SSR_Request_Handlers.c Wed Dec 21 16:53:22 2011 +0100 +++ b/SSR_Request_Handlers.c Wed Jan 04 16:39:35 2012 +0100 @@ -133,7 +133,7 @@ newd.to_vp = receivePr->procrID; newd.to_task = receivePr->numTimesScheduled +1; //(newd,semEnv->commDependenciesList); - //addToListOfArrays(Dependency,newd,semEnv->commDependenciesList); + addToListOfArrays(Dependency,newd,semEnv->dynDependenciesList); int32 groupId = semReq->msgType; if(semEnv->ntonGroupsInfo->numInArray <= groupId){ makeHighestDynArrayIndexBeAtLeast(semEnv->ntonGroupsInfo, groupId); @@ -146,7 +146,7 @@ u.task = sendPr->numTimesScheduled; addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->senders); u.vp = receivePr->procrID; - u.task = receivePr->numTimesScheduled; + u.task = receivePr->numTimesScheduled +1; addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->receivers); #endif @@ -322,7 +322,7 @@ newd.to_vp = receivePr->procrID; newd.to_task = receivePr->numTimesScheduled +1; //addToListOfArraysDependency(newd,semEnv->commDependenciesList); - //addToListOfArrays(Dependency,newd,semEnv->commDependenciesList); + addToListOfArrays(Dependency,newd,semEnv->dynDependenciesList); int32 groupId = semReq->msgType; if(semEnv->ntonGroupsInfo->numInArray <= groupId){ makeHighestDynArrayIndexBeAtLeast(semEnv->ntonGroupsInfo, groupId); @@ -335,7 +335,7 @@ u.task = sendPr->numTimesScheduled; addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->senders); u.vp = receivePr->procrID; - u.task = receivePr->numTimesScheduled; + u.task = receivePr->numTimesScheduled +1; addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->receivers); #endif diff -r 593fe0543a22 -r 70d24e2343bb SSR_lib.c --- a/SSR_lib.c Wed Dec 21 16:53:22 2011 +0100 +++ b/SSR_lib.c Wed Jan 04 16:39:35 2012 +0100 @@ -213,7 +213,11 @@ semanticEnv->unitList = makeListOfArrays(sizeof(Unit),128); semanticEnv->ctlDependenciesList = makeListOfArrays(sizeof(Dependency),128); semanticEnv->commDependenciesList = makeListOfArrays(sizeof(Dependency),128); + semanticEnv->dynDependenciesList = makeListOfArrays(sizeof(Dependency),128); semanticEnv->ntonGroupsInfo = makePrivDynArrayOfSize((void***)&(semanticEnv->ntonGroups),8); + + semanticEnv->hwArcs = makeListOfArrays(sizeof(Dependency),128); + memset(semanticEnv->last_in_slot,0,sizeof(NUM_CORES * NUM_SCHED_SLOTS * sizeof(Unit))); #endif //create the ready queue, hash tables used for pairing send to receive @@ -257,12 +261,13 @@ semanticEnv = _VMSMasterEnv->semanticEnv; #ifdef OBSERVE_UCC + //UCC FILE* output; int n; char filename[255]; for(n=0;n<255;n++) { - sprintf(filename, "./counters/Dependencies.%d.dot",n); + sprintf(filename, "./counters/UCC.%d",n); output = fopen(filename,"r"); if(output) { @@ -272,7 +277,7 @@ } } if(n<255){ - printf("Saving Dependencies to File: %s ...\n", filename); + printf("Saving UCC to File: %s ...\n", filename); output = fopen(filename,"w+"); if(output!=NULL){ set_dependency_file(output); @@ -286,15 +291,54 @@ forAllInDynArrayDo(semanticEnv->ntonGroupsInfo,&print_nton_to_file); //fprintf(output,"}\n"); fflush(output); - freeListOfArrays(semanticEnv->unitList); - freeListOfArrays(semanticEnv->commDependenciesList); - freeListOfArrays(semanticEnv->ctlDependenciesList); + } else - printf("Opening Dependencies file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n"); + printf("Opening UCC file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n"); } else { - printf("Could not open Dependencies file, please clean \"counters\" folder. (Must contain less than 255 files.)\n"); + printf("Could not open UCC file, please clean \"counters\" folder. (Must contain less than 255 files.)\n"); } -#endif + //Loop Graph + for(n=0;n<255;n++) + { + sprintf(filename, "./counters/LoopGraph.%d",n); + output = fopen(filename,"r"); + if(output) + { + fclose(output); + }else{ + break; + } + } + if(n<255){ + printf("Saving LoopGraph to File: %s ...\n", filename); + output = fopen(filename,"w+"); + if(output!=NULL){ + set_dependency_file(output); + //fprintf(output,"digraph Dependencies {\n"); + //set_dot_file(output); + //FIXME: first line still depends on counters being enabled, replace w/ unit struct! + //forAllInDynArrayDo(_VMSMasterEnv->counter_history_array_info, &print_dot_node_info ); + forAllInListOfArraysDo( semanticEnv->unitList, &print_unit_to_file ); + forAllInListOfArraysDo( semanticEnv->commDependenciesList, &print_comm_dependency_to_file ); + forAllInListOfArraysDo( semanticEnv->ctlDependenciesList, &print_ctl_dependency_to_file ); + forAllInListOfArraysDo( semanticEnv->dynDependenciesList, &print_dyn_dependency_to_file ); + forAllInListOfArraysDo( semanticEnv->hwArcs, &print_hw_dependency_to_file ); + //fprintf(output,"}\n"); + fflush(output); + + } else + printf("Opening LoopGraph file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n"); + } else { + printf("Could not open LoopGraph file, please clean \"counters\" folder. (Must contain less than 255 files.)\n"); + } + + + freeListOfArrays(semanticEnv->unitList); + freeListOfArrays(semanticEnv->commDependenciesList); + freeListOfArrays(semanticEnv->ctlDependenciesList); + freeListOfArrays(semanticEnv->dynDependenciesList); + + #endif /* It's all allocated inside VMS's big chunk -- that's about to be freed, so * nothing to do here diff -r 593fe0543a22 -r 70d24e2343bb dependency.c --- a/dependency.c Wed Dec 21 16:53:22 2011 +0100 +++ b/dependency.c Wed Jan 04 16:39:35 2012 +0100 @@ -36,6 +36,18 @@ fprintf(dependency_file,"commDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); } +void print_dyn_dependency_to_file(void* _dep){ + Dependency* dep = (Dependency*) _dep; + if(!dep) return; + fprintf(dependency_file,"dynDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); +} + +void print_hw_dependency_to_file(void* _dep){ + Dependency* dep = (Dependency*) _dep; + if(!dep) return; + fprintf(dependency_file,"hwDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); +} + void print_dependency_to_file(void* _dep){ Dependency* dep = (Dependency*) _dep; if(!dep) return; diff -r 593fe0543a22 -r 70d24e2343bb dependency.h --- a/dependency.h Wed Dec 21 16:53:22 2011 +0100 +++ b/dependency.h Wed Jan 04 16:39:35 2012 +0100 @@ -42,6 +42,10 @@ void print_comm_dependency_to_file(void* _dep); +void print_dyn_dependency_to_file(void* _dep); + +void print_hw_dependency_to_file(void* _dep); + void print_dependency_to_file(void* dep); void print_unit_to_file(void* unit);