PAPI 7.1.0.0
Loading...
Searching...
No Matches
fork_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#include "papi.h"
13#include "papi_test.h"
14
15#define MAX_EVENTS 3
16
17static int Event[MAX_EVENTS] = {
21};
22
23static int Threshold[MAX_EVENTS] = {
24 8000000,
25 4000000,
26 4000000,
27};
28
29static int num_events = 1;
30static int EventSet = PAPI_NULL;
31static const char *name = "unknown";
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
47static void
49{
50 gettimeofday( &start, NULL );
51 last = start;
52 count = 0;
53 total = 0;
54}
55
56static void
57print_here( const char *str) {
58
59 if (!TESTS_QUIET) printf("[%d] %s, %s\n", getpid(), name, str);
60}
61
62static void
63print_rate( const char *str )
64{
65 static int last_count = -1;
66 struct timeval now;
67 double st_secs, last_secs;
68
69 gettimeofday( &now, NULL );
70 st_secs = ( double ) ( now.tv_sec - start.tv_sec )
71 + ( ( double ) ( now.tv_usec - start.tv_usec ) ) / 1000000.0;
72 last_secs = ( double ) ( now.tv_sec - last.tv_sec )
73 + ( ( double ) ( now.tv_usec - last.tv_usec ) ) / 1000000.0;
74 if ( last_secs <= 0.001 )
75 last_secs = 0.001;
76
77 if (!TESTS_QUIET) {
78 printf( "[%d] %s, time = %.3f, total = %ld, last = %ld, rate = %.1f/sec\n",
79 getpid( ), str, st_secs, total, count,
80 ( ( double ) count ) / last_secs );
81 }
82
83 if ( last_count != -1 ) {
84 if ( count < .1 * last_count ) {
85 test_fail( name, __LINE__, "Interrupt rate changed!", 1 );
86 exit( 1 );
87 }
88 }
89 last_count = ( int ) count;
90 count = 0;
91 last = now;
92}
93
94static void
96{
97 struct timeval start, now;
98 double x, sum;
99
100 gettimeofday( &start, NULL );
101
102 for ( ;; ) {
103 sum = 1.0;
104 for ( x = 1.0; x < 250000.0; x += 1.0 )
105 sum += x;
106 if ( sum < 0.0 )
107 printf( "==>> SUM IS NEGATIVE !! <<==\n" );
108
109 gettimeofday( &now, NULL );
110 if ( now.tv_sec >= start.tv_sec + program_time )
111 break;
112 }
113}
114
115static void
117{
119 test_fail( name, __LINE__, "PAPI_library_init failed", 1 );
120}
121
122static void
124{
125 int ev;
126
128
130 test_fail( name, __LINE__, "PAPI_create_eventset failed", 1 );
131
132 for ( ev = 0; ev < num_events; ev++ ) {
133 if ( PAPI_add_event( EventSet, Event[ev] ) != PAPI_OK ) {
134 if (!TESTS_QUIET) printf("Trouble adding event\n");
135 test_skip( name, __LINE__, "PAPI_add_event failed", 1 );
136 }
137 }
138
139 for ( ev = 0; ev < num_events; ev++ ) {
140 if ( PAPI_overflow( EventSet, Event[ev], Threshold[ev], 0, my_handler )
141 != PAPI_OK ) {
142 test_fail( name, __LINE__, "PAPI_overflow failed", 1 );
143 }
144 }
145
146 if ( PAPI_start( EventSet ) != PAPI_OK )
147 test_fail( name, __LINE__, "PAPI_start failed", 1 );
148}
149
150static void
152{
153 if ( PAPI_stop( EventSet, NULL ) != PAPI_OK )
154 test_fail( name, __LINE__, "PAPI_stop failed", 1 );
155}
156
157static void
158run( const char *str, int len )
159{
160 int n;
161
162 for ( n = 1; n <= len; n++ ) {
163 do_cycles( 1 );
164 print_rate( str );
165 }
166}
167
168int
169main( int argc, char **argv )
170{
171 char buf[100];
172
173 int quiet,retval;
174
175 /* Used to be able to set this via command line */
176 num_events=1;
177
178 /* Set TESTS_QUIET variable */
179 quiet=tests_quiet( argc, argv );
180
181 do_cycles( 1 );
182
183 zero_count( );
184
187 test_fail( name, __LINE__, "PAPI_library_init failed", 1 );
188 }
189
190 name = argv[0];
191 if (!quiet) printf( "[%d] %s, num_events = %d\n", getpid( ), name, num_events );
192 sprintf( buf, "%d", num_events );
193 my_papi_start( );
194 run( name, 3 );
195
196 print_here( "fork" );
197 {
198 int ret = fork( );
199 if ( ret < 0 )
200 test_fail( name, __LINE__, "fork failed", 1 );
201 if ( ret == 0 ) {
202 /*
203 * Child process.
204 */
205 zero_count( );
206 my_papi_init( );
207 my_papi_start( );
208 run( "child", 5 );
209 print_here( "stop" );
210 my_papi_stop( );
211 sleep( 3 );
212 print_here( "end" );
213 exit( 0 );
214 }
215 run( "main", 14 );
216 my_papi_stop( );
217 {
218 int status;
219 wait( &status );
220 print_here( "end" );
221 if ( WEXITSTATUS( status ) != 0 )
222 test_fail( name, __LINE__, "child failed", 1 );
223 else
224 test_pass( name);
225 }
226 }
227
228 return 0;
229}
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.
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
Definition: do_loops.c:12
static void print_rate(const char *str)
Definition: fork_overflow.c:63
static struct timeval start last
Definition: fork_overflow.c:32
static void my_papi_init(void)
static long total
Definition: fork_overflow.c:33
static int num_events
Definition: fork_overflow.c:29
static int EventSet
Definition: fork_overflow.c:30
static void my_papi_start(void)
static void my_papi_stop(void)
static void run(const char *str, int len)
static long count
Definition: fork_overflow.c:33
static int Event[MAX_EVENTS]
Definition: fork_overflow.c:17
static const char * name
Definition: fork_overflow.c:31
static int Threshold[MAX_EVENTS]
Definition: fork_overflow.c:23
static void do_cycles(int program_time)
Definition: fork_overflow.c:95
static void print_here(const char *str)
Definition: fork_overflow.c:57
#define MAX_EVENTS
Definition: fork_overflow.c:15
static void my_handler(int EventSet, void *pc, long long ovec, void *context)
Definition: fork_overflow.c:36
static void zero_count(void)
Definition: fork_overflow.c:48
#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 program_time
static struct timeval start
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
int
Definition: sde_internal.h:89
__time_t tv_sec
__suseconds_t tv_usec
volatile double x
int retval
Definition: zero_fork.c:53