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
|