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);