PAPI 7.1.0.0
Loading...
Searching...
No Matches
child_overflow.c
Go to the documentation of this file.
1/*
2 * Test PAPI with fork() and exec().
3 */
4
5#include <sys/time.h>
6#include <sys/types.h>
7#include <sys/wait.h>
8#include <errno.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <unistd.h>
12
13#include "papi.h"
14#include "papi_test.h"
15
16#include "testcode.h"
17
18#define MAX_EVENTS 3
19
20static int Event[MAX_EVENTS] = {
24};
25
26static int Threshold[MAX_EVENTS] = {
27 8000000,
28 4000000,
29 4000000,
30};
31
32static struct timeval start, last;
33static long count, total;
34
35static void
36my_handler( int EventSet, void *pc, long long ovec, void *context )
37{
38 ( void ) EventSet;
39 ( void ) pc;
40 ( void ) ovec;
41 ( void ) context;
42
43 count++;
44 total++;
45}
46
47
48
49
50
51static void
52print_rate( const char *str )
53{
54 static int last_count = -1;
55 struct timeval now;
56 double st_secs, last_secs;
57
58 gettimeofday( &now, NULL );
59 st_secs = ( double ) ( now.tv_sec - start.tv_sec )
60 + ( ( double ) ( now.tv_usec - start.tv_usec ) ) / 1000000.0;
61 last_secs = ( double ) ( now.tv_sec - last.tv_sec )
62 + ( ( double ) ( now.tv_usec - last.tv_usec ) ) / 1000000.0;
63 if ( last_secs <= 0.001 )
64 last_secs = 0.001;
65
66 if (!TESTS_QUIET) {
67 printf( "[%d] %s, time = %.3f, total = %ld, last = %ld, rate = %.1f/sec\n",
68 getpid( ), str, st_secs, total, count,
69 ( ( double ) count ) / last_secs );
70 }
71
72 if ( last_count != -1 ) {
73 if ( count < .1 * last_count ) {
74 test_fail( __FILE__, __LINE__, "Interrupt rate changed!", 1 );
75 exit( 1 );
76 }
77 }
78 last_count = ( int ) count;
79 count = 0;
80 last = now;
81}
82
83static void
84run( const char *str, int len )
85{
86 int n;
87
88 for ( n = 1; n <= len; n++ ) {
89 do_cycles( 1 );
90 print_rate( str );
91 }
92}
93
94int
95main( int argc, char **argv )
96{
97 int quiet,retval;
98 int ev, EventSet = PAPI_NULL;
99 int num_events;
100 const char *name = "unknown";
101
102 /* Used to be able to set this via command line */
103 num_events=1;
104
105 /* Set TESTS_QUIET variable */
106 quiet=tests_quiet( argc, argv );
107
108 do_cycles( 1 );
109
110 /* zero out the count fields */
111 gettimeofday( &start, NULL );
112 last = start;
113 count = 0;
114 total = 0;
115
116 /* Initialize PAPI */
119 test_fail( name, __LINE__, "PAPI_library_init failed", 1 );
120 }
121
122 name = argv[0];
123 if (!quiet) {
124 printf( "[%d] %s, num_events = %d\n", getpid(),
125 name, num_events );
126 }
127
128 /* Set up eventset */
130 test_fail( name, __LINE__, "PAPI_create_eventset failed", 1 );
131 }
132
133 /* Add events */
134 for ( ev = 0; ev < num_events; ev++ ) {
135 if ( PAPI_add_event( EventSet, Event[ev] ) != PAPI_OK ) {
136 if (!quiet) printf("Trouble adding event.\n");
137 test_skip( name, __LINE__, "PAPI_add_event failed", 1 );
138 }
139 }
140
141 /* Set up overflow handler */
142 for ( ev = 0; ev < num_events; ev++ ) {
143 if ( PAPI_overflow( EventSet, Event[ev],
144 Threshold[ev], 0, my_handler )
145 != PAPI_OK ) {
146 test_fail( name, __LINE__, "PAPI_overflow failed", 1 );
147 }
148 }
149
150 /* Start the eventset */
151 if ( PAPI_start( EventSet ) != PAPI_OK ) {
152 test_fail( name, __LINE__, "PAPI_start failed", 1 );
153 }
154
155 /* Generate some workload */
156 run( name, 3 );
157
158 if (!quiet) {
159 printf("[%d] %s, %s\n", getpid(), name, "stop");
160 }
161
162 /* Stop measuring */
163 if ( PAPI_stop( EventSet, NULL ) != PAPI_OK ) {
164 test_fail( name, __LINE__, "PAPI_stop failed", 1 );
165 }
166
167 if (!quiet) {
168 printf("[%d] %s, %s\n", getpid(), name, "end");
169 }
170
171 test_pass(__FILE__);
172
173 return 0;
174}
static void print_rate(const char *str)
static struct timeval start last
static long total
static void run(const char *str, int len)
static long count
static int Event[MAX_EVENTS]
static int Threshold[MAX_EVENTS]
#define MAX_EVENTS
static void my_handler(int EventSet, void *pc, long long ovec, void *context)
add PAPI preset or native hardware event to an event set
Create a new empty PAPI EventSet.
initialize the PAPI library.
Set up an event set to begin registering overflows.
Start counting hardware events in an event set.
Stop counting hardware events in an event set.
static void do_cycles(int program_time)
Definition: fork_overflow.c:95
#define PAPI_VER_CURRENT
Definition: f90papi.h:54
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_NULL
Definition: f90papi.h:78
#define PAPI_TOT_CYC
Definition: f90papi.h:308
#define PAPI_FAD_INS
Definition: f90papi.h:340
#define PAPI_FP_INS
Definition: f90papi.h:366
static int EventSet
Definition: init_fini.c:8
static struct timeval start
static int num_events
int TESTS_QUIET
Definition: test_utils.c:18
Return codes and api definitions.
int tests_quiet(int argc, char **argv)
Definition: test_utils.c:376
void PAPI_NORETURN test_fail(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:491
void PAPI_NORETURN test_pass(const char *filename)
Definition: test_utils.c:432
void PAPI_NORETURN test_skip(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:584
int main()
Definition: pernode.c:20
int quiet
Definition: rapl_overflow.c:19
const char * name
Definition: rocs.c:225
int
Definition: sde_internal.h:89
__time_t tv_sec
__suseconds_t tv_usec
int retval
Definition: zero_fork.c:53