annotate SSR_Counter_Recording.c @ 84:ce07f1a42ddf

Added skeleton for data tracking assigner + design notes
author Sean Halle <seanhalle@yahoo.com>
date Thu, 10 Jan 2013 11:16:42 -0800
parents 81a0f076b12e
children
rev   line source
seanhalle@60 1 /*
seanhalle@60 2 *
seanhalle@60 3 * author: Nina Engelhardt
seanhalle@60 4 */
seanhalle@60 5
nengel@50 6 #include "SSR_Counter_Recording.h"
seanhalle@60 7 #include "VMS_impl/VMS.h"
nengel@50 8 #include "SSR.h"
nengel@50 9
seanhalle@60 10 #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS
seanhalle@60 11
nengel@50 12 void SSR__init_counter_data_structs(){
nengel@50 13 SSRSemEnv *semanticEnv = _VMSMasterEnv->semanticEnv;
nengel@56 14 int i;
nengel@56 15 for(i=0;i<NUM_CORES;i++){
nengel@56 16 semanticEnv->counterList[i] = makeListOfArrays(sizeof(CounterEvent), 128);
nengel@56 17 }
nengel@50 18 }
nengel@50 19
nengel@59 20 void addToListOfArraysCounterEvent(CounterEvent value, ListOfArrays* list){
nengel@59 21 int offset_in_fragment = list->next_free_index % list->num_entries_per_fragment;
nengel@59 22 if(offset_in_fragment == 0){
nengel@59 23 void* newBlock = malloc(list->entry_size * list->num_entries_per_fragment);
nengel@59 24 addToDynArray(newBlock,list->dim1info);
nengel@59 25 }
nengel@59 26 CounterEvent* typedFragment = (CounterEvent*) ((list->dim1)[list->dim1info->numInArray -1]);
nengel@59 27 typedFragment[offset_in_fragment] = value;
nengel@59 28 list->next_free_index++;
nengel@59 29 }
nengel@59 30
nengel@75 31 void SSR__counter_handler(int evt_type, int vpid, int task, SlaveVP* pr, uint64 cycles, uint64 instrs, uint64 cachem)
nengel@50 32 {
nengel@58 33
seanhalle@67 34 if (pr->typeOfVP == Master || pr->typeOfVP == Shutdown)
seanhalle@67 35 { //Only save values for application work, done in a SlaveVP
nengel@52 36 return;
seanhalle@67 37 }
nengel@54 38
nengel@50 39 SSRSemEnv *semanticEnv = _VMSMasterEnv->semanticEnv;
nengel@50 40
nengel@50 41 CounterEvent e;
nengel@50 42 e.event_type = evt_type;
nengel@56 43 e.vp = vpid;
nengel@56 44 e.task = task;
nengel@56 45
nengel@50 46 e.cycles = cycles;
nengel@50 47 e.instrs = instrs;
nengel@75 48 e.cachem = cachem;
nengel@56 49
nengel@56 50 if(pr){
nengel@56 51 e.coreID = pr->coreAnimatedBy;
seanhalle@67 52 e.slot = pr->animSlotAssignedTo;
nengel@58 53 } else {
nengel@58 54 e.coreID = -1;
nengel@58 55 e.slot = NULL;
nengel@56 56 }
nengel@56 57
nengel@56 58 int corenum;
nengel@56 59
nengel@56 60 if(pr) corenum = pr->coreAnimatedBy; else return;
nengel@58 61
nengel@58 62 if(evt_type==Work_start || evt_type==Work_end || evt_type==AppResponderInvocation_start){
nengel@58 63 addToListOfArrays_ext(CounterEvent,e,semanticEnv->counterList[corenum]);
nengel@58 64 } else {
nengel@59 65 addToListOfArraysCounterEvent(e,semanticEnv->counterList[corenum]);
nengel@58 66 }
nengel@51 67 }
nengel@51 68
nengel@51 69 void set_counter_file(FILE* f){
nengel@51 70 counterfile = f;
nengel@51 71 }
nengel@51 72
nengel@51 73 void print_counter_events_to_file(void* _e){
nengel@51 74 CounterEvent* e = (CounterEvent*) _e;
nengel@52 75 fprintf(counterfile, "event, ");
nengel@52 76 switch(e->event_type){
nengel@56 77 case AppResponderInvocation_start:
nengel@56 78 fprintf(counterfile, "AppResponderInvocation_start");
nengel@56 79 break;
nengel@56 80 case AppResponder_start:
nengel@58 81 fprintf(counterfile, "AppResponder_start");
nengel@52 82 break;
nengel@56 83 case AppResponder_end:
nengel@58 84 fprintf(counterfile, "AppResponder_end");
nengel@58 85 break;
nengel@58 86 case AssignerInvocation_start:
nengel@58 87 fprintf(counterfile, "AssignerInvocation_start");
nengel@58 88 break;
nengel@58 89 case NextAssigner_start:
nengel@58 90 fprintf(counterfile, "NextAssigner_start");
nengel@52 91 break;
nengel@56 92 case Assigner_start:
nengel@58 93 fprintf(counterfile, "Assigner_start");
nengel@52 94 break;
nengel@56 95 case Assigner_end:
nengel@58 96 fprintf(counterfile, "Assigner_end");
nengel@52 97 break;
nengel@56 98 case Work_end:
nengel@58 99 fprintf(counterfile, "Work_end");
nengel@52 100 break;
nengel@56 101 case Work_start:
nengel@58 102 fprintf(counterfile, "Work_start");
nengel@52 103 break;
nengel@56 104 case HwResponderInvocation_start:
nengel@58 105 fprintf(counterfile, "HwResponderInvocation_start");
nengel@58 106 break;
nengel@58 107 case Timestamp_start:
nengel@58 108 fprintf(counterfile, "Timestamp_start");
nengel@58 109 break;
nengel@58 110 case Timestamp_end:
nengel@58 111 fprintf(counterfile, "Timestamp_end");
nengel@52 112 break;
nengel@52 113 default:
nengel@52 114 fprintf(counterfile, "unknown event");
nengel@52 115 }
nengel@75 116 fprintf(counterfile,", %d, %d, %llu, %llu, %llu",e->vp,e->task,e->cycles,e->instrs,e->cachem);
nengel@58 117 if(e->coreID >=0)
nengel@58 118 fprintf(counterfile,", %d",e->coreID);
nengel@58 119 fprintf(counterfile,"\n");
nengel@58 120 fflush(counterfile);
seanhalle@60 121 }
seanhalle@60 122 #endif