PAPI 7.1.0.0
Loading...
Searching...
No Matches
overflow3_pthreads.c
Go to the documentation of this file.
1/*
2* File: overflow3_pthreads.c
3* Author: Philip Mucci
4* mucci@cs.utk.edu
5*/
6
7/* This file tests the overflow functionality when there are
8 * threads in which the application isn't calling PAPI (and only
9 * one thread that is calling PAPI.)
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <pthread.h>
15
16#include "papi.h"
17#include "papi_test.h"
18
19#include "do_loops.h"
20
21int total = 0;
22
23void *
25{
26 ( void ) dummy;
27 while ( 1 ) {
28 do_stuff( );
29 }
30 return ( NULL );
31}
32
33void
34handler( int EventSet, void *address, long long overflow_vector, void *context )
35{
36 ( void ) overflow_vector;
37 ( void ) context;
38 if ( !TESTS_QUIET ) {
39 fprintf( stderr, "handler(%d ) Overflow at %p, thread %#lx!\n",
40 EventSet, address, PAPI_thread_id( ) );
41 }
42 total++;
43}
44
45void
46mainloop( int arg )
47{
48 int retval, num_tests = 1;
49 int EventSet1 = PAPI_NULL;
50 int mask1 = 0x0;
51 int num_events1;
52 long long **values;
53 int PAPI_event;
55
56 ( void ) arg;
57
59 if (retval != PAPI_VER_CURRENT ) {
60 test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
61 }
62
63 /* add PAPI_TOT_CYC and one of the events in PAPI_FP_INS, PAPI_FP_OPS or
64 PAPI_TOT_INS, depending on the availability of the event on the
65 platform */
67 &PAPI_event, &mask1 );
68
69 if (num_events1==0) {
70 if (!TESTS_QUIET) printf("Trouble creating events\n");
71 test_skip(__FILE__,__LINE__,"Creating events",0);
72 }
73
75
76 if ( ( retval =
78 handler ) ) != PAPI_OK )
79 test_fail( __FILE__, __LINE__, "PAPI_overflow", retval );
80
81 do_stuff( );
82
83 if ( ( retval = PAPI_start( EventSet1 ) ) != PAPI_OK )
84 test_fail( __FILE__, __LINE__, "PAPI_start", retval );
85
86 do_stuff( );
87
88 if ( ( retval = PAPI_stop( EventSet1, values[0] ) ) != PAPI_OK )
89 test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
90
91 /* clear the papi_overflow event */
92 if ( ( retval =
93 PAPI_overflow( EventSet1, PAPI_event, 0, 0, NULL ) ) != PAPI_OK )
94 test_fail( __FILE__, __LINE__, "PAPI_overflow", retval );
95
96 if ( ( retval =
98 test_fail( __FILE__, __LINE__, "PAPI_event_code_to_name", retval );
99
100 if ( !TESTS_QUIET ) {
101 printf( "Thread %#x %s : \t%lld\n", ( int ) pthread_self( ),
102 event_name, ( values[0] )[0] );
103 printf( "Thread %#x PAPI_TOT_CYC: \t%lld\n", ( int ) pthread_self( ),
104 ( values[0] )[1] );
105 }
106
108 if ( retval != PAPI_OK )
109 test_fail( __FILE__, __LINE__, "PAPI_cleanup_eventset", retval );
110
112 if ( retval != PAPI_OK )
113 test_fail( __FILE__, __LINE__, "PAPI_destroy_eventset", retval );
114
116 PAPI_shutdown( );
117}
118
119int
120main( int argc, char **argv )
121{
122 int i, rc, retval;
124 pthread_attr_t attr;
125 int quiet;
126
127 /* Set TESTS_QUIET variable */
128 quiet=tests_quiet( argc, argv );
129
130 if (!quiet) {
131 printf( "%s: Using %d threads\n\n", argv[0], NUM_THREADS );
132 printf( "Does non-threaded overflow work "
133 "with extraneous threads present?\n" );
134 }
135
136 pthread_attr_init( &attr );
137#ifdef PTHREAD_CREATE_UNDETACHED
138 pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_UNDETACHED );
139#endif
140#ifdef PTHREAD_SCOPE_SYSTEM
141 retval = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
142 if ( retval != 0 )
143 test_skip( __FILE__, __LINE__, "pthread_attr_setscope", retval );
144#endif
145
146 for ( i = 0; i < NUM_THREADS; i++ ) {
147 rc = pthread_create( &id[i], &attr, thread_fn, NULL );
148 if ( rc )
149 test_fail( __FILE__, __LINE__, "pthread_create", rc );
150 }
151 pthread_attr_destroy( &attr );
152
154
155 test_pass( __FILE__ );
156
157 return 0;
158}
int i
Empty and destroy an EventSet.
Empty and destroy an EventSet.
Convert a numeric hardware event code to a name.
initialize the PAPI library.
Set up an event set to begin registering overflows.
Finish using PAPI and free all related resources.
Start counting hardware events in an event set.
Stop counting hardware events in an event set.
Get the thread identifier of the current thread.
int PAPI_event[2]
Definition: data_range.c:30
char event_name[2][PAPI_MAX_STR_LEN]
Definition: data_range.c:29
void do_stuff(void)
Definition: do_loops.c:256
void dummy(void *array)
Definition: do_loops.c:306
#define THRESHOLD
Definition: earprofile.c:37
#define PAPI_VER_CURRENT
Definition: f90papi.h:54
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_NULL
Definition: f90papi.h:78
#define PAPI_MAX_STR_LEN
Definition: f90papi.h:77
static int EventSet
Definition: init_fini.c:8
static long long values[NUM_EVENTS]
Definition: init_fini.c:10
#define NUM_ITERS
Definition: multiplex.c:19
int TESTS_QUIET
Definition: test_utils.c:18
void * thread_fn(void *dummy)
int total
void handler(int EventSet, void *address, long long overflow_vector, void *context)
void mainloop(int arg)
Return codes and api definitions.
unsigned long int pthread_t
FILE * stderr
int tests_quiet(int argc, char **argv)
Definition: test_utils.c:376
int add_two_nonderived_events(int *num_events, int *papi_event, int *mask)
Definition: test_utils.c:671
void free_test_space(long long **values, int num_tests)
Definition: test_utils.c:70
void PAPI_NORETURN test_fail(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:491
long long ** allocate_test_space(int num_tests, int num_events)
Definition: test_utils.c:46
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
rc
Definition: pscanf.h:23
#define NUM_THREADS
Definition: pthread_hl.c:9
int quiet
Definition: rapl_overflow.c:19
int EventSet1
Definition: zero_fork.c:47
int num_events1
Definition: zero_fork.c:49
int mask1
Definition: zero_fork.c:48
int num_tests
Definition: zero_fork.c:53
int retval
Definition: zero_fork.c:53