/* example program calling a high level PAPI function */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <memory.h>
#include <malloc.h>
#include "papi.h"
double comp(void);
int factorial(int);
#define INDEX 100
static void test_fail(char *file, int line, char *call, int retval);
int main(int argc, char **argv) {
float real_time[5], proc_time[5], mflops[5];
long long flpins[5];
unsigned long long fac=0;
int retval;
int i,j,k , n, post;
double c;
/* Setup PAPI library and begin collecting data from the counters */
post=0;
retval=PAPI_flops( &real_time[post], &proc_time[post], &flpins[post], &mflops[post]);
if (retval != PAPI_OK) { printf("PAPI error, site 0 !\n"); exit(1); }
printf("\n \treal_time,\tproc_time,\tflpins,\t\tmflops\td flpins/d t_real\td flpins/d t_proc\n");
printf("post %i: \t%5.6f \t%5.6f \t%7ld \t%5.6f\n", post, real_time[post], proc_time[post], flpins[post], mflops[post]);
/*** Here follows the original code section to be analyzed ***/
post=1;
retval=PAPI_flops( &real_time[post], &proc_time[post], &flpins[post], &mflops[post]);
if (retval != PAPI_OK) { printf("PAPI error, site 0 !\n"); exit(1); }
printf("post %i: \t%5.6f \t%5.6f \t%7ld \t%5.6f \t%5.6f \t%5.6f\n", post, real_time[post], proc_time[post], flpins[post], mflops[post],
(flpins[post]-flpins[post-1])/(real_time[post]-real_time[post-1])/1e6,
(flpins[post]-flpins[post-1])/(proc_time[post]-proc_time[post-1])/1e6);
n=10; fac=factorial(n);
post=2;
retval=PAPI_flops( &real_time[post], &proc_time[post], &flpins[post], &mflops[post]);
if (retval != PAPI_OK) { printf("PAPI error, site 0 !\n"); exit(1); }
printf("post %i: \t%5.6f \t%5.6f \t%7ld \t%5.6f \t%5.6f \t%5.6f\tafter n!\n", post, real_time[post], proc_time[post], flpins[post], mflops[post],
(flpins[post]-flpins[post-1])/(real_time[post]-real_time[post-1])/1e6,
(flpins[post]-flpins[post-1])/(proc_time[post]-proc_time[post-1])/1e6);
c = comp() ;
post=3;
retval=PAPI_flops( &real_time[post], &proc_time[post], &flpins[post], &mflops[post]);
if (retval != PAPI_OK) { printf("PAPI error, site 0 !\n"); exit(1); }
printf("post %i: \t%5.6f \t%5.6f \t%7ld \t%5.6f \t%5.6f \t%5.6f\tafter comp()\n", post, real_time[post], proc_time[post], flpins[post], mflops[post],
(flpins[post]-flpins[post-1])/(real_time[post]-real_time[post-1])/1e6,
(flpins[post]-flpins[post-1])/(proc_time[post]-proc_time[post-1])/1e6);
/*** Here ends the original code section to be analyzed ***/
/* Collect the data into the variables passed in */
post=4;
retval=PAPI_flops( &real_time[post], &proc_time[post], &flpins[post], &mflops[post]);
if (retval != PAPI_OK) { printf("PAPI error, site 0 !\n"); exit(1); }
printf("post %i: \t%5.6f \t%5.6f \t%7ld \t%5.6f \t%5.6f \t%5.6f\n", post, real_time[post], proc_time[post], flpins[post], mflops[post],
(flpins[post]-flpins[post-1])/(real_time[post]-real_time[post-1])/1e6,
(flpins[post]-flpins[post-1])/(proc_time[post]-proc_time[post-1])/1e6);
printf("\n%s\tPASSED\n\n", __FILE__);
PAPI_shutdown();
exit(0);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static void test_fail(char *file, int line, char *call, int retval){
printf("%s\tFAILED\nLine # %d\n", file, line);
if ( retval == PAPI_ESYS ) {
char buf[128];
memset( buf, '\0', sizeof(buf) );
sprintf(buf, "System error in %s:", call );
perror(buf);
}
else if ( retval > 0 ) {
printf("Error calculating: %s\n", call );
}
else {
printf("Error in %s: %s\n", call, PAPI_strerror(retval) );
}
printf("\n");
exit(1);
}
int factorial(int n)
{
unsigned long long f, fac = 1;
for(f=1; f<=n; f++)
{
fac *= f;
}
return fac;
}
double comp(void)
{
int i;
double a, b;
a = (double) 3.14159;
b = (double) 0;
for (i=0; i<1000000; i++) {
b += a;
}
return(b);
}