PAPI 7.1.0.0
Loading...
Searching...
No Matches
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
14char events[MAX_EVENTS][BUFSIZ];
15char units[MAX_EVENTS][BUFSIZ];
17char filenames[MAX_EVENTS][BUFSIZ];
18
20
21static int num_events=0;
22
23int 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
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 */
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 */
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
int i
add PAPI preset or native hardware event by name to an EventSet
Create a new empty PAPI EventSet.
Enumerate PAPI preset or native events for a given component.
Convert a numeric hardware event code to a name.
get information about a specific software component
Get the event's name and description info.
Get real time counter value in nanoseconds.
initialize the PAPI library.
Get the number of components available on the system.
Start counting hardware events in an event set.
Stop counting hardware events in an event set.
char event_name[2][PAPI_MAX_STR_LEN]
Definition: data_range.c:29
#define PAPI_VER_CURRENT
Definition: f90papi.h:54
#define PAPI_ENUM_EVENTS
Definition: f90papi.h:224
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_ENUM_FIRST
Definition: f90papi.h:85
#define PAPI_NULL
Definition: f90papi.h:78
static int EventSet
Definition: init_fini.c:8
static long long values[NUM_EVENTS]
Definition: init_fini.c:10
#define PAPI_NATIVE_MASK
Return codes and api definitions.
FILE * stderr
int main()
Definition: pernode.c:20
FILE * fff[MAX_EVENTS]
Definition: powercap_plot.c:19
static int num_events
Definition: powercap_plot.c:21
char events[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:14
int data_type[MAX_EVENTS]
Definition: powercap_plot.c:16
char filenames[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:17
#define MAX_EVENTS
Definition: powercap_plot.c:12
char units[MAX_EVENTS][BUFSIZ]
Definition: powercap_plot.c:15
static long long after_time
Definition: rapl_overflow.c:15
static long long before_time
Definition: rapl_overflow.c:15
char name[PAPI_MAX_STR_LEN]
Definition: papi.h:627
char disabled_reason[PAPI_HUGE_STR_LEN]
Definition: papi.h:634
char units[PAPI_MIN_STR_LEN]
Definition: papi.h:969
int retval
Definition: zero_fork.c:53