PAPI  5.7.0.0
powercap_plot.c
Go to the documentation of this file.
1 
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <unistd.h>
9 
10 #include "papi.h"
11 
12 #define MAX_EVENTS 128
13 
14 char events[MAX_EVENTS][BUFSIZ];
15 char units[MAX_EVENTS][BUFSIZ];
17 char filenames[MAX_EVENTS][BUFSIZ];
18 
19 FILE *fff[MAX_EVENTS];
20 
21 static int num_events=0;
22 
23 int main (int argc, char **argv)
24 {
25 
26  int retval,cid,rapl_cid=-1,numcmp;
27  int EventSet = PAPI_NULL;
28  long long values[MAX_EVENTS];
29  int i,code,enum_retval;
30  PAPI_event_info_t evinfo;
31  const PAPI_component_info_t *cmpinfo = NULL;
32  long long start_time,before_time,after_time;
33  double elapsed_time,total_time;
34  char event_name[BUFSIZ];
35 
36  /* PAPI Initialization */
38  if ( retval != PAPI_VER_CURRENT ) {
39  fprintf(stderr,"PAPI_library_init failed\n");
40  exit(1);
41  }
42 
43  numcmp = PAPI_num_components();
44 
45  for(cid=0; cid<numcmp; cid++) {
46 
47  if ( (cmpinfo = PAPI_get_component_info(cid)) == NULL) {
48  fprintf(stderr,"PAPI_get_component_info failed\n");
49  exit(1);
50  }
51 
52  if (strstr(cmpinfo->name,"powercap")) {
53  rapl_cid=cid;
54  printf("Found rapl component at cid %d\n", rapl_cid);
55 
56  if (cmpinfo->disabled) {
57  fprintf(stderr,"No rapl events found: %s\n",
58  cmpinfo->disabled_reason);
59  exit(1);
60  }
61  break;
62  }
63  }
64 
65  /* Component not found */
66  if (cid==numcmp) {
67  fprintf(stderr,"No powercap component found\n");
68  exit(1);
69  }
70 
71  /* Find Events */
72  code = PAPI_NATIVE_MASK;
73 
74  enum_retval = PAPI_enum_cmp_event( &code, PAPI_ENUM_FIRST, cid );
75 
76  while ( enum_retval == PAPI_OK ) {
77 
79  if ( retval != PAPI_OK ) {
80  printf("Error translating %#x\n",code);
81  exit(1);
82  }
83 
84  printf("Found: %s\n",event_name);
85  strncpy(events[num_events],event_name,BUFSIZ);
86  sprintf(filenames[num_events],"results.%s",event_name);
87 
88 
89  /* Find additional event information: unit, data type */
90  retval = PAPI_get_event_info(code, &evinfo);
91  if (retval != PAPI_OK) {
92  printf("Error getting event info for %#x\n",code);
93  exit(1);
94  }
95 
96  strncpy(units[num_events],evinfo.units,sizeof(units[0])-1);
97  /* buffer must be null terminated to safely use strstr operation on it below */
98  units[num_events][sizeof(units[0])-1] = '\0';
99 
100  data_type[num_events] = evinfo.data_type;
101 
102  num_events++;
103 
104  if (num_events==MAX_EVENTS) {
105  printf("Too many events! %d\n",num_events);
106  exit(1);
107  }
108 
109  enum_retval = PAPI_enum_cmp_event( &code, PAPI_ENUM_EVENTS, cid );
110 
111  }
112 
113 
114 
115  if (num_events==0) {
116  printf("Error! No RAPL events found!\n");
117  exit(1);
118  }
119 
120  /* Open output files */
121  for(i=0;i<num_events;i++) {
122  fff[i]=fopen(filenames[i],"w");
123  if (fff[i]==NULL) {
124  fprintf(stderr,"Could not open %s\n",filenames[i]);
125  exit(1);
126  }
127  }
128 
129 
130  /* Create EventSet */
132  if (retval != PAPI_OK) {
133  fprintf(stderr,"Error creating eventset!\n");
134  }
135 
136  for(i=0;i<num_events;i++) {
137 
139  if (retval != PAPI_OK) {
140  fprintf(stderr,"Error adding event %s\n",events[i]);
141  }
142  }
143 
144 
145 
146  start_time=PAPI_get_real_nsec();
147 
148  while(1) {
149 
150  /* Start Counting */
151  before_time=PAPI_get_real_nsec();
153  if (retval != PAPI_OK) {
154  fprintf(stderr,"PAPI_start() failed\n");
155  exit(1);
156  }
157 
158 
159  usleep(100000);
160 
161  /* Stop Counting */
162  after_time=PAPI_get_real_nsec();
164  if (retval != PAPI_OK) {
165  fprintf(stderr, "PAPI_start() failed\n");
166  }
167 
168  total_time=((double)(after_time-start_time))/1.0e9;
169  elapsed_time=((double)(after_time-before_time))/1.0e9;
170 
171  for(i=0;i<num_events;i++) {
172 
173  /* Scaled energy measurements */
174  if (strstr(events[i],"ENERGY")) {
175  fprintf(fff[i],"%.4f %.3f %s %.3f %s (* Average Power for %s *)\n",
176  total_time,
177  ((double)values[i]/1.0e6), "J",
178  ((double)values[i]/1.0e6)/elapsed_time, "W",
179  events[i] );
180  }
181  else if (strstr(events[i],"POWER")) {
182  fprintf(fff[i],"%.4f %.3f %s (* %s *)\n",
183  total_time,
184  ((double)values[i]/1.0e6), "W",
185  events[i] );
186  }
187  else if (strstr(events[i],"TIME")) {
188  fprintf(fff[i],"%.4f %.3f %s (* %s *)\n",
189  total_time,
190  ((double)values[i]/1.0e6), "S",
191  events[i] );
192  }
193  else {
194  fprintf(fff[i],"%.4f %lld (* %s *)\n",
195  total_time,
196  values[i],
197  events[i] );
198  }
199 
200  fflush(fff[i]);
201  }
202  }
203 
204  return 0;
205 }
206 
char event_name[2][PAPI_MAX_STR_LEN]
Definition: data_range.c:29
#define PAPI_OK
Definition: fpapi.h:105
int PAPI_stop(int EventSet, long long *values)
Definition: papi.c:2314
#define PAPI_NATIVE_MASK
char disabled_reason[PAPI_MAX_STR_LEN]
Definition: papi.h:637
const PAPI_component_info_t * PAPI_get_component_info(int cidx)
Definition: papi.c:796
#define MAX_EVENTS
Definition: powercap_plot.c:12
char units[PAPI_MIN_STR_LEN]
Definition: papi.h:976
char events[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:14
int PAPI_num_components(void)
Definition: papi.c:4387
#define PAPI_VER_CURRENT
Definition: fpapi.h:14
int EventSet
FILE * fff[MAX_EVENTS]
Definition: powercap_plot.c:19
int retval
Definition: zero_fork.c:53
char units[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:15
Return codes and api definitions.
int PAPI_get_event_info(int EventCode, PAPI_event_info_t *info)
Definition: papi.c:835
int PAPI_add_named_event(int EventSet, const char *EventName)
Definition: papi.c:1876
char filenames[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:17
int PAPI_library_init(int version)
Definition: papi.c:500
#define PAPI_NULL
Definition: fpapi.h:13
char name[PAPI_MAX_STR_LEN]
Definition: papi.h:630
int PAPI_enum_cmp_event(int *EventCode, int modifier, int cidx)
Definition: papi.c:1357
int PAPI_create_eventset(int *EventSet)
Definition: papi.c:1464
int PAPI_event_code_to_name(int EventCode, char *out)
Definition: papi.c:915
long long PAPI_get_real_nsec(void)
Definition: papi.c:6237
int data_type[MAX_EVENTS]
Definition: powercap_plot.c:16
static int num_events
Definition: powercap_plot.c:21
int PAPI_start(int EventSet)
Definition: papi.c:2096
static long long values[NUM_EVENTS]
Definition: init_fini.c:10
void exit()
int i
Definition: fileop.c:140
double total_time
Definition: iozone.c:1268
int main(int argc, char **argv)
Definition: powercap_plot.c:23