source: trunk/lib/perflib/perfsec.h @ 2481

Last change on this file since 2481 was 2481, checked in by ksherdy, 7 years ago

Updated perflib to allow runs against individual PAPI events.

File size: 3.9 KB
Line 
1#ifndef PERFSEC_H
2#define PERFSEC_H
3
4#if defined(WALL_TIMING)
5#include "WallTime.h"
6#elif defined(BUFFER_PROFILING)
7#include "BOM_Profiler.h"
8#elif defined(PAPI)
9        #include <cc.h>
10        #include <cc.cxx>
11#endif
12
13#if defined __linux__
14
15  #include <sched.h>
16
17  static inline int set_processor_affinity(unsigned long mask) { // mask = 1 sets hard processor affinity for core 1, mask = 2 for core 2, mask = 4 for core 3, mask = 7 for core 1 and core 2 and core 3.
18
19    unsigned int len = sizeof(mask);
20
21    if (sched_setaffinity(0, len, (const cpu_set_t *)&mask) < 0) {
22      //printf("sched_setaffinity call failed.\n");
23      return -1;
24    }
25
26    //printf("CPU affinity mask: %08lx\n", mask);
27
28    return 0;
29  }
30
31#elif defined _MSC_VER
32
33  #include <process.h>
34  #include <Windows.h>
35  #define getpid _getpid
36
37  static inline int set_processor_affinity(DWORD_PTR mask) {
38
39    HANDLE hProcess  = OpenProcess(PROCESS_ALL_ACCESS, 0, getpid());
40
41        if(0 == SetProcessAffinityMask(hProcess, mask)) {
42          // printf("SetProcessAffinityMask call failed.\n");
43              return -1;
44        }
45
46    // printf("CPU affinity mask: %08lx\n", mask);
47
48        return 0;
49  }
50
51#else
52
53  inline int set_processor_affinity(unsigned long mask) {
54        printf("set_processor_affinity is not implemented on the current OS.\n");
55        return -1;
56  }
57
58#endif
59
60#define PERF_SEC_BIND(mask) \
61        set_processor_affinity(mask)
62
63#if defined(WALL_TIMING)
64
65        #define PERF_SEC_INIT(timer) \
66                timer = init_Wall_timer()
67       
68        #define PERF_SEC_ADD_PARAM(timer, name, value) 
69
70        #define PERF_SEC_START(timer) \
71                start_Wall_interval(timer) 
72       
73        #define PERF_SEC_END(timer,elems) \
74                end_Wall_interval(timer,elems) 
75       
76        #define PERF_SEC_DUMP(timer) \
77                dump_Timer_Table(timer)
78
79        #define PERF_SEC_WRITE(timer) 
80       
81        #define PERF_SEC_DESTROY(timer) \
82                destroy_Wall_timer(timer)       
83       
84#elif defined(BUFFER_PROFILING)
85
86        #define PERF_SEC_INIT(timer) \
87                timer = init_BOM_timer()
88
89        #define PERF_SEC_ADD_PARAM(timer, name, value) 
90       
91        #define PERF_SEC_START(timer) \
92                start_BOM_interval(timer) 
93       
94        #define PERF_SEC_END(timer,elems) \
95                end_BOM_interval(timer,elems) 
96       
97        #define PERF_SEC_DUMP(timer) \
98                dump_BOM_table(timer)
99       
100        #define PERF_SEC_WRITE(timer) 
101
102        #define PERF_SEC_DESTROY(timer) \
103                destroy_BOM_timer(timer)       
104       
105#elif defined(PAPI)
106
107        //#PAPI_L1_DCM 
108        #if (0x80000000 == CC_EVENT) 
109                                int Events[1] = {PAPI_L1_DCM}; 
110        //#PAPI_L1_ICM 
111        #elif (0x80000001 == CC_EVENT)
112                                int Events[1] = {PAPI_L1_ICM};
113        //#PAPI_L2_DCM 
114        #elif (0x80000002 == CC_EVENT)
115                                int Events[1] = {PAPI_L2_DCM};
116        //#PAPI_L2_ICM 
117        #elif (0x80000003 == CC_EVENT)
118                                int Events[1] = {PAPI_L2_ICM};
119        //#PAPI_L3_DCM 
120        #elif (0x80000004 == CC_EVENT)
121                                int Events[1] = {PAPI_L3_DCM};
122        //#PAPI_L3_ICM 
123        #elif (0x80000005 == CC_EVENT)
124                                int Events[1] = {PAPI_L3_ICM};
125        //#PAPI_BR_CN   
126        #elif (0x8000002b == CC_EVENT)
127                                int Events[1] = {PAPI_BR_CN};
128        //#PAPI_BR_MSP 
129        #elif (0x8000002e == CC_EVENT)
130                                int Events[1] = {PAPI_BR_MSP};
131        //#PAPI_TOT_INS 
132        #elif (0x80000032 == CC_EVENT)
133                                int Events[1] = {PAPI_TOT_INS};
134        //#PAPI_TOT_CYC   
135        #elif (0x8000003b == CC_EVENT)
136                                int Events[1] = {PAPI_TOT_CYC };
137        #else
138                                #warning CC_EVENT not defined in Makefile. Default to PAPI_TOT_CYC.
139                                int Events[1] = {PAPI_TOT_CYC };
140        #endif
141
142        #define PERF_SEC_INIT(timer) \
143                        timer = new CC(Events,1,0)
144
145        #define PERF_SEC_ADD_PARAM(timer, name, value) \
146                timer->set_param(name, value) \
147
148        #define PERF_SEC_START(timer) \
149                timer->start_interval() \
150
151        #define PERF_SEC_END(timer,elems) \
152                timer->end_interval(elems)
153       
154        #define PERF_SEC_DUMP(timer) \
155                timer->display_system_info();\
156                timer->display_raw_event_data();\
157                timer->dump_avg_kelem() \
158
159        #define PERF_SEC_WRITE(timer) \
160                timer->write_xml_file() \
161               
162        #define PERF_SEC_DESTROY(timer) \
163                if(timer) delete timer
164               
165#else
166
167        #define PERF_SEC_INIT(timer)
168        #define PERF_SEC_START(timer)
169        #define PERF_SEC_ADD_PARAM(timer, name, value) 
170        #define PERF_SEC_END(timer,elems)
171        #define PERF_SEC_DUMP(timer)
172        #define PERF_SEC_DESTROY(timer)
173        #define PERF_SEC_WRITE(timer) 
174
175#endif
176#endif
177
Note: See TracBrowser for help on using the repository browser.