Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > SSR_impls > SSR__MC_shared_impl
changeset 49:70d24e2343bb perf_counters
add loopgraph recording (\! changed scheduler fn prototype \!)
| author | Nina Engelhardt <nengel@mailbox.tu-berlin.de> |
|---|---|
| date | Wed, 04 Jan 2012 16:39:35 +0100 |
| parents | 593fe0543a22 |
| children | 5c59bfe62d92 |
| files | SSR.h SSR_PluginFns.c SSR_Request_Handlers.c SSR_lib.c dependency.c dependency.h |
| diffstat | 6 files changed, 94 insertions(+), 15 deletions(-) [+] |
line diff
1.1 --- a/SSR.h Wed Dec 21 16:53:22 2011 +0100 1.2 +++ b/SSR.h Wed Jan 04 16:39:35 2012 +0100 1.3 @@ -111,7 +111,9 @@ 1.4 ListOfArrays* commDependenciesList; 1.5 NtoN** ntonGroups; 1.6 PrivDynArrayInfo* ntonGroupsInfo; 1.7 - //NtoN structure? 1.8 + ListOfArrays* dynDependenciesList; 1.9 + Unit last_in_slot[NUM_CORES * NUM_SCHED_SLOTS]; 1.10 + ListOfArrays* hwArcs; 1.11 #endif 1.12 1.13 } 1.14 @@ -240,7 +242,7 @@ 1.15 SSR__Request_Handler( VirtProcr *requestingPr, void *_semEnv ); 1.16 1.17 VirtProcr * 1.18 -SSR__schedule_virt_procr( void *_semEnv, int coreNum ); 1.19 +SSR__schedule_virt_procr( void *_semEnv, int coreNum, int slotNum ); 1.20 1.21 VirtProcr* 1.22 SSR__create_procr_helper( VirtProcrFnPtr fnPtr, void *initData,
2.1 --- a/SSR_PluginFns.c Wed Dec 21 16:53:22 2011 +0100 2.2 +++ b/SSR_PluginFns.c Wed Jan 04 16:39:35 2012 +0100 2.3 @@ -36,7 +36,7 @@ 2.4 char __Scheduler[] = "FIFO Scheduler"; //Gobal variable for name in saved histogram 2.5 2.6 VirtProcr * 2.7 -SSR__schedule_virt_procr( void *_semEnv, int coreNum ) 2.8 +SSR__schedule_virt_procr( void *_semEnv, int coreNum, int slotNum ) 2.9 { VirtProcr *schedPr; 2.10 SSRSemEnv *semEnv; 2.11 2.12 @@ -44,7 +44,24 @@ 2.13 2.14 schedPr = readPrivQ( semEnv->readyVPQs[coreNum] ); 2.15 //Note, using a non-blocking queue -- it returns NULL if queue empty 2.16 + if (schedPr) { 2.17 + schedPr->numTimesScheduled++; 2.18 2.19 +#ifdef OBSERVE_UCC 2.20 + Unit prev_in_slot = semEnv->last_in_slot[coreNum * NUM_SCHED_SLOTS + slotNum]; 2.21 + if(prev_in_slot.vp != 0){ 2.22 + Dependency newd; 2.23 + newd.from_vp = prev_in_slot.vp; 2.24 + newd.from_task = prev_in_slot.task; 2.25 + newd.to_vp = schedPr->procrID; 2.26 + newd.to_task = schedPr->numTimesScheduled; 2.27 + addToListOfArrays(Dependency,newd,semEnv->hwArcs); 2.28 + } 2.29 + prev_in_slot.vp = schedPr->procrID; 2.30 + prev_in_slot.task = schedPr->numTimesScheduled; 2.31 + semEnv->last_in_slot[coreNum * NUM_SCHED_SLOTS + slotNum] = prev_in_slot; 2.32 +#endif 2.33 + } 2.34 return( schedPr ); 2.35 } 2.36
3.1 --- a/SSR_Request_Handlers.c Wed Dec 21 16:53:22 2011 +0100 3.2 +++ b/SSR_Request_Handlers.c Wed Jan 04 16:39:35 2012 +0100 3.3 @@ -133,7 +133,7 @@ 3.4 newd.to_vp = receivePr->procrID; 3.5 newd.to_task = receivePr->numTimesScheduled +1; 3.6 //(newd,semEnv->commDependenciesList); 3.7 - //addToListOfArrays(Dependency,newd,semEnv->commDependenciesList); 3.8 + addToListOfArrays(Dependency,newd,semEnv->dynDependenciesList); 3.9 int32 groupId = semReq->msgType; 3.10 if(semEnv->ntonGroupsInfo->numInArray <= groupId){ 3.11 makeHighestDynArrayIndexBeAtLeast(semEnv->ntonGroupsInfo, groupId); 3.12 @@ -146,7 +146,7 @@ 3.13 u.task = sendPr->numTimesScheduled; 3.14 addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->senders); 3.15 u.vp = receivePr->procrID; 3.16 - u.task = receivePr->numTimesScheduled; 3.17 + u.task = receivePr->numTimesScheduled +1; 3.18 addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->receivers); 3.19 #endif 3.20 3.21 @@ -322,7 +322,7 @@ 3.22 newd.to_vp = receivePr->procrID; 3.23 newd.to_task = receivePr->numTimesScheduled +1; 3.24 //addToListOfArraysDependency(newd,semEnv->commDependenciesList); 3.25 - //addToListOfArrays(Dependency,newd,semEnv->commDependenciesList); 3.26 + addToListOfArrays(Dependency,newd,semEnv->dynDependenciesList); 3.27 int32 groupId = semReq->msgType; 3.28 if(semEnv->ntonGroupsInfo->numInArray <= groupId){ 3.29 makeHighestDynArrayIndexBeAtLeast(semEnv->ntonGroupsInfo, groupId); 3.30 @@ -335,7 +335,7 @@ 3.31 u.task = sendPr->numTimesScheduled; 3.32 addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->senders); 3.33 u.vp = receivePr->procrID; 3.34 - u.task = receivePr->numTimesScheduled; 3.35 + u.task = receivePr->numTimesScheduled +1; 3.36 addToListOfArrays(Unit,u,semEnv->ntonGroups[groupId]->receivers); 3.37 #endif 3.38
4.1 --- a/SSR_lib.c Wed Dec 21 16:53:22 2011 +0100 4.2 +++ b/SSR_lib.c Wed Jan 04 16:39:35 2012 +0100 4.3 @@ -213,7 +213,11 @@ 4.4 semanticEnv->unitList = makeListOfArrays(sizeof(Unit),128); 4.5 semanticEnv->ctlDependenciesList = makeListOfArrays(sizeof(Dependency),128); 4.6 semanticEnv->commDependenciesList = makeListOfArrays(sizeof(Dependency),128); 4.7 + semanticEnv->dynDependenciesList = makeListOfArrays(sizeof(Dependency),128); 4.8 semanticEnv->ntonGroupsInfo = makePrivDynArrayOfSize((void***)&(semanticEnv->ntonGroups),8); 4.9 + 4.10 + semanticEnv->hwArcs = makeListOfArrays(sizeof(Dependency),128); 4.11 + memset(semanticEnv->last_in_slot,0,sizeof(NUM_CORES * NUM_SCHED_SLOTS * sizeof(Unit))); 4.12 #endif 4.13 4.14 //create the ready queue, hash tables used for pairing send to receive 4.15 @@ -257,12 +261,13 @@ 4.16 semanticEnv = _VMSMasterEnv->semanticEnv; 4.17 4.18 #ifdef OBSERVE_UCC 4.19 + //UCC 4.20 FILE* output; 4.21 int n; 4.22 char filename[255]; 4.23 for(n=0;n<255;n++) 4.24 { 4.25 - sprintf(filename, "./counters/Dependencies.%d.dot",n); 4.26 + sprintf(filename, "./counters/UCC.%d",n); 4.27 output = fopen(filename,"r"); 4.28 if(output) 4.29 { 4.30 @@ -272,7 +277,7 @@ 4.31 } 4.32 } 4.33 if(n<255){ 4.34 - printf("Saving Dependencies to File: %s ...\n", filename); 4.35 + printf("Saving UCC to File: %s ...\n", filename); 4.36 output = fopen(filename,"w+"); 4.37 if(output!=NULL){ 4.38 set_dependency_file(output); 4.39 @@ -286,15 +291,54 @@ 4.40 forAllInDynArrayDo(semanticEnv->ntonGroupsInfo,&print_nton_to_file); 4.41 //fprintf(output,"}\n"); 4.42 fflush(output); 4.43 - freeListOfArrays(semanticEnv->unitList); 4.44 - freeListOfArrays(semanticEnv->commDependenciesList); 4.45 - freeListOfArrays(semanticEnv->ctlDependenciesList); 4.46 + 4.47 } else 4.48 - printf("Opening Dependencies file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n"); 4.49 + printf("Opening UCC file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n"); 4.50 } else { 4.51 - printf("Could not open Dependencies file, please clean \"counters\" folder. (Must contain less than 255 files.)\n"); 4.52 + printf("Could not open UCC file, please clean \"counters\" folder. (Must contain less than 255 files.)\n"); 4.53 } 4.54 -#endif 4.55 + //Loop Graph 4.56 + for(n=0;n<255;n++) 4.57 + { 4.58 + sprintf(filename, "./counters/LoopGraph.%d",n); 4.59 + output = fopen(filename,"r"); 4.60 + if(output) 4.61 + { 4.62 + fclose(output); 4.63 + }else{ 4.64 + break; 4.65 + } 4.66 + } 4.67 + if(n<255){ 4.68 + printf("Saving LoopGraph to File: %s ...\n", filename); 4.69 + output = fopen(filename,"w+"); 4.70 + if(output!=NULL){ 4.71 + set_dependency_file(output); 4.72 + //fprintf(output,"digraph Dependencies {\n"); 4.73 + //set_dot_file(output); 4.74 + //FIXME: first line still depends on counters being enabled, replace w/ unit struct! 4.75 + //forAllInDynArrayDo(_VMSMasterEnv->counter_history_array_info, &print_dot_node_info ); 4.76 + forAllInListOfArraysDo( semanticEnv->unitList, &print_unit_to_file ); 4.77 + forAllInListOfArraysDo( semanticEnv->commDependenciesList, &print_comm_dependency_to_file ); 4.78 + forAllInListOfArraysDo( semanticEnv->ctlDependenciesList, &print_ctl_dependency_to_file ); 4.79 + forAllInListOfArraysDo( semanticEnv->dynDependenciesList, &print_dyn_dependency_to_file ); 4.80 + forAllInListOfArraysDo( semanticEnv->hwArcs, &print_hw_dependency_to_file ); 4.81 + //fprintf(output,"}\n"); 4.82 + fflush(output); 4.83 + 4.84 + } else 4.85 + printf("Opening LoopGraph file failed. Please check that folder \"counters\" exists in run directory and has write permission.\n"); 4.86 + } else { 4.87 + printf("Could not open LoopGraph file, please clean \"counters\" folder. (Must contain less than 255 files.)\n"); 4.88 + } 4.89 + 4.90 + 4.91 + freeListOfArrays(semanticEnv->unitList); 4.92 + freeListOfArrays(semanticEnv->commDependenciesList); 4.93 + freeListOfArrays(semanticEnv->ctlDependenciesList); 4.94 + freeListOfArrays(semanticEnv->dynDependenciesList); 4.95 + 4.96 + #endif 4.97 4.98 /* It's all allocated inside VMS's big chunk -- that's about to be freed, so 4.99 * nothing to do here
5.1 --- a/dependency.c Wed Dec 21 16:53:22 2011 +0100 5.2 +++ b/dependency.c Wed Jan 04 16:39:35 2012 +0100 5.3 @@ -36,6 +36,18 @@ 5.4 fprintf(dependency_file,"commDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); 5.5 } 5.6 5.7 +void print_dyn_dependency_to_file(void* _dep){ 5.8 + Dependency* dep = (Dependency*) _dep; 5.9 + if(!dep) return; 5.10 + fprintf(dependency_file,"dynDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); 5.11 +} 5.12 + 5.13 +void print_hw_dependency_to_file(void* _dep){ 5.14 + Dependency* dep = (Dependency*) _dep; 5.15 + if(!dep) return; 5.16 + fprintf(dependency_file,"hwDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); 5.17 +} 5.18 + 5.19 void print_dependency_to_file(void* _dep){ 5.20 Dependency* dep = (Dependency*) _dep; 5.21 if(!dep) return;
6.1 --- a/dependency.h Wed Dec 21 16:53:22 2011 +0100 6.2 +++ b/dependency.h Wed Jan 04 16:39:35 2012 +0100 6.3 @@ -42,6 +42,10 @@ 6.4 6.5 void print_comm_dependency_to_file(void* _dep); 6.6 6.7 +void print_dyn_dependency_to_file(void* _dep); 6.8 + 6.9 +void print_hw_dependency_to_file(void* _dep); 6.10 + 6.11 void print_dependency_to_file(void* dep); 6.12 6.13 void print_unit_to_file(void* unit);
