PAPI  5.7.0.0
profile.c
Go to the documentation of this file.
1 /*
2 * File: profile.c
3 * Author: Philip Mucci
4 * mucci@cs.utk.edu
5 * Mods: Dan Terpstra
6 * terpstra@cs.utk.edu
7 * Mods: Maynard Johnson
8 * maynardj@us.ibm.com
9 */
10 
11 /* This file performs the following test:
12  profiling and program info option call
13 
14  - This tests the SVR4 profiling interface of PAPI. These are counted
15  in the default counting domain and default granularity, depending on
16  the platform. Usually this is the user domain (PAPI_DOM_USER) and
17  thread context (PAPI_GRN_THR).
18 
19  The Eventset contains:
20  + PAPI_FP_INS (to profile)
21  + PAPI_TOT_CYC
22 
23  - Set up profile
24  - Start eventset 1
25  - Do both (flops and reads)
26  - Stop eventset 1
27 */
28 
29 #include <stdio.h>
30 #include <stdlib.h>
31 
32 #include "papi.h"
33 #include "papi_test.h"
34 #include "prof_utils.h"
35 
36 #include "do_loops.h"
37 
38 #define PROFILE_ALL
39 
40 static int
41 do_profile( caddr_t start, unsigned long plength, unsigned scale, int thresh,
42  int bucket )
43 {
44  int i, retval;
45  unsigned long blength;
46  int num_buckets;
47 
48  const char *profstr[5] = { "PAPI_PROFIL_POSIX",
49  "PAPI_PROFIL_RANDOM",
50  "PAPI_PROFIL_WEIGHTED",
51  "PAPI_PROFIL_COMPRESS",
52  "PAPI_PROFIL_<all>"
53  };
54 
55  int profflags[5] = { PAPI_PROFIL_POSIX,
61  };
62 
64  blength = prof_size( plength, scale, bucket, &num_buckets );
65  prof_alloc( 5, blength );
66 
67  for ( i = 0; i < 5; i++ ) {
68  if ( !TESTS_QUIET ) {
69  printf( "Test type : \t%s\n", profstr[i] );
70  }
71 
72 #ifndef SWPROFILE
73  if ( ( retval =
74  PAPI_profil( profbuf[i], ( unsigned int ) blength, start, scale,
75  EventSet, PAPI_event, thresh,
76  profflags[i] | bucket ) ) != PAPI_OK ) {
77  if (retval==PAPI_ENOSUPP) {
78  char warning[BUFSIZ];
79 
80  sprintf(warning,"PAPI_profil %s not supported",
81  profstr[i]);
82  test_warn( __FILE__, __LINE__, warning, 1 );
83  }
84  else {
85  test_fail( __FILE__, __LINE__, "PAPI_profil", retval );
86  }
87  }
88 #else
89  if ( ( retval =
90  PAPI_profil( profbuf[i], ( unsigned int ) blength, start, scale,
91  EventSet, PAPI_event, thresh,
92  profflags[i] | bucket | PAPI_PROFIL_FORCE_SW ) ) !=
93  PAPI_OK ) {
94  test_fail( __FILE__, __LINE__, "PAPI_profil", retval );
95  }
96 #endif
97 
98  if ( retval != PAPI_OK )
99  break;
100 
101  if ( ( retval = PAPI_start( EventSet ) ) != PAPI_OK )
102  test_fail( __FILE__, __LINE__, "PAPI_start", retval );
103 
104  do_flops( getenv( "NUM_FLOPS" ) ? atoi( getenv( "NUM_FLOPS" ) ) :
105  NUM_FLOPS );
106 
107  if ( ( retval = PAPI_stop( EventSet, values[1] ) ) != PAPI_OK )
108  test_fail( __FILE__, __LINE__, "PAPI_stop", retval );
109 
110  if ( !TESTS_QUIET ) {
111  printf( TAB1, event_name, ( values[1] )[0] );
112  printf( TAB1, "PAPI_TOT_CYC", ( values[1] )[1] );
113  }
114  retval = PAPI_profil( profbuf[i], ( unsigned int ) blength, start, scale,
115  EventSet, PAPI_event, 0,
116  profflags[i] );
117  if (retval != PAPI_OK ) {
118  test_fail( __FILE__, __LINE__, "PAPI_profil", retval );
119  }
120  }
121 
122  if ( retval == PAPI_OK ) {
123  if (!TESTS_QUIET) prof_head( blength, bucket, num_buckets,
124  "address\t\t\tflat\trandom\tweight\tcomprs\tall\n" );
125  if (!TESTS_QUIET) prof_out( start, 5, bucket, num_buckets, scale );
126  retval = prof_check( 5, bucket, num_buckets );
127  }
128 
129  for ( i = 0; i < 5; i++ ) {
130  free( profbuf[i] );
131  }
132 
133  return retval;
134 }
135 
136 
137 int
138 main( int argc, char **argv )
139 {
140  int num_tests = 6;
141  long length;
142  int mask;
143  int retval;
144  int mythreshold = THRESHOLD;
145  const PAPI_exe_info_t *prginfo;
146  caddr_t start, end;
147  int quiet;
148 
149  /* Set TESTS_QUIET variable */
150  quiet = tests_quiet( argc, argv );
151 
153  if (retval != PAPI_VER_CURRENT ) {
154  test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
155  }
156 
157  if ( ( prginfo = PAPI_get_executable_info( ) ) == NULL ) {
158  test_fail( __FILE__, __LINE__, "PAPI_get_executable_info", 1 );
159  }
160 
162  if (retval!=PAPI_OK) {
163  if (!quiet) printf("No events found\n");
164  test_skip(__FILE__, __LINE__,"No events found",1);
165  }
166 
167  mask = prof_events( num_tests );
168 
169 #ifdef PROFILE_ALL
170 /* use these lines to profile entire code address space */
171  start = prginfo->address_info.text_start;
172  end = prginfo->address_info.text_end;
173 #else
174 /* use these lines to profile only do_flops address space */
175  start = ( caddr_t ) do_flops;
176  end = ( caddr_t ) fdo_flops;
177 /* Itanium and ppc64 processors return function descriptors instead of function addresses.
178  You must dereference the descriptor to get the address.
179 */
180 #if defined(ITANIUM1) || defined(ITANIUM2) || defined(__powerpc64__)
181  start = ( caddr_t ) ( ( ( struct fdesc * ) start )->ip );
182  end = ( caddr_t ) ( ( ( struct fdesc * ) end )->ip );
183 #endif
184 #endif
185 
186 #if defined(linux)
187  {
188  char *tmp = getenv( "THRESHOLD" );
189  if ( tmp )
190  mythreshold = atoi( tmp );
191  }
192 #endif
193 
194  length = end - start;
195  if ( length < 0 ) {
196  test_fail( __FILE__, __LINE__, "Profile length < 0!", ( int ) length );
197  }
198 
199  if (!quiet) {
200  prof_print_address( "Test case profile: "
201  "POSIX compatible profiling with hardware counters.\n",
202  prginfo );
204  }
205 
206  retval = do_profile( start, ( unsigned long ) length, FULL_SCALE,
208  if ( retval == PAPI_OK ) {
209  retval = do_profile( start, ( unsigned long ) length,
212  }
213  if ( retval == PAPI_OK ) {
214  retval = do_profile( start, ( unsigned long ) length,
217  }
218 
219  remove_test_events( &EventSet, mask );
220 
221  test_pass( __FILE__ );
222 
223  return 0;
224 }
225 
char event_name[2][PAPI_MAX_STR_LEN]
Definition: data_range.c:29
#define PAPI_OK
Definition: fpapi.h:105
int atoi()
int PAPI_stop(int EventSet, long long *values)
Definition: papi.c:2314
int PAPI_event[2]
Definition: data_range.c:30
char * getenv()
void test_pass(const char *filename)
Definition: test_utils.c:432
int main(int argc, char **argv)
Definition: profile.c:138
caddr_t text_end
Definition: papi.h:699
#define PAPI_ENOSUPP
Definition: fpapi.h:123
#define PAPI_PROFIL_BUCKET_16
Definition: fpapi.h:79
#define TAB1
Definition: papi_test.h:88
#define PAPI_PROFIL_BUCKET_32
Definition: fpapi.h:80
#define PAPI_VER_CURRENT
Definition: fpapi.h:14
int EventSet
get the executable's info
Definition: papi.h:708
#define PAPI_PROFIL_COMPRESS
Definition: fpapi.h:78
#define PAPI_PROFIL_POSIX
Definition: fpapi.h:75
int retval
Definition: zero_fork.c:53
static struct timeval start
#define NUM_FLOPS
Definition: sdsc-mpx.c:24
void test_warn(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:524
double tmp
Return codes and api definitions.
static int do_profile(caddr_t start, unsigned long plength, unsigned scale, int thresh, int bucket)
Definition: profile.c:41
void test_skip(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:561
unsigned long prof_size(unsigned long plength, unsigned scale, int bucket, int *num_buckets)
Definition: prof_utils.c:310
int PAPI_library_init(int version)
Definition: papi.c:500
int PAPI_profil(void *buf, unsigned bufsiz, caddr_t offset, unsigned scale, int EventSet, int EventCode, int threshold, int flags)
Definition: papi.c:5438
void prof_out(caddr_t start, int n, int bucket, int num_buckets, unsigned int scale)
Definition: prof_utils.c:202
#define FULL_SCALE
Definition: prof_utils.h:20
int quiet
Definition: rapl_overflow.c:18
const PAPI_exe_info_t * PAPI_get_executable_info(void)
Definition: papi.c:6114
caddr_t text_start
Definition: papi.h:698
PAPI_address_map_t address_info
Definition: papi.h:710
void * profbuf[5]
Definition: prof_utils.c:33
unsigned int length
int num_tests
Definition: zero_fork.c:53
void do_flops(int n)
Definition: multiplex.c:23
int PAPI_query_event(int EventCode)
Definition: papi.c:684
#define PAPI_PROFIL_RANDOM
Definition: fpapi.h:76
void prof_head(unsigned long blength, int bucket, int num_buckets, const char *header)
Definition: prof_utils.c:183
int TESTS_QUIET
Definition: test_utils.c:18
int tests_quiet(int argc, char **argv)
Definition: test_utils.c:376
void test_fail(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:468
void prof_print_address(const char *title, const PAPI_exe_info_t *prginfo)
Definition: prof_utils.c:69
void prof_print_prof_info(caddr_t start, caddr_t end, int threshold, char *event_name)
Definition: prof_utils.c:93
void do_no_profile(int quiet)
Definition: prof_utils.c:113
int prof_check(int n, int bucket, int num_buckets)
Definition: prof_utils.c:272
#define PAPI_PROFIL_FORCE_SW
Definition: papi.h:404
int prof_events(int num_tests)
Definition: prof_utils.c:42
#define PAPI_PROFIL_WEIGHTED
Definition: fpapi.h:77
char * caddr_t
static long long mythreshold
int PAPI_start(int EventSet)
Definition: papi.c:2096
#define THRESHOLD
Definition: earprofile.c:37
#define PAPI_TOT_CYC
Definition: fpapi.h:195
#define PAPI_PROFIL_BUCKET_64
Definition: fpapi.h:81
static long long values[NUM_EVENTS]
Definition: init_fini.c:10
void fdo_flops(int *n)
Definition: do_loops.c:90
int remove_test_events(int *EventSet, int mask)
Definition: test_utils.c:201
void prof_alloc(int num, unsigned long blength)
Definition: prof_utils.c:140
int i
Definition: fileop.c:140