|
Packit |
577717 |
/* This file attempts to test the retired branches taken */
|
|
Packit |
577717 |
/* performance counter PAPI_BR_TKN */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This measures taken *conditional* branches */
|
|
Packit |
577717 |
/* Though this may fall back to total if not available. */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* by Vince Weaver, <vincent.weaver@maine.edu> */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
#include <string.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "display_error.h"
|
|
Packit |
577717 |
#include "testcode.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int main(int argc, char **argv) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int num_runs=100,i;
|
|
Packit |
577717 |
long long high=0,low=0,average=0;
|
|
Packit |
577717 |
long long expected_cond=500000,expected_total=1000000;
|
|
Packit |
577717 |
double error;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
long long count,total=0;
|
|
Packit |
577717 |
int quiet=0,retval,ins_result;
|
|
Packit |
577717 |
int eventset_total=PAPI_NULL;
|
|
Packit |
577717 |
int eventset_conditional=PAPI_NULL;
|
|
Packit |
577717 |
int eventset_taken=PAPI_NULL;
|
|
Packit |
577717 |
int eventset_nottaken=PAPI_NULL;
|
|
Packit |
577717 |
long long count_total,count_conditional,count_taken,count_nottaken;
|
|
Packit |
577717 |
int cond_avail=1,nottaken_avail=1;
|
|
Packit |
577717 |
int not_expected=0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
quiet=tests_quiet(argc,argv);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\nTesting the PAPI_BR_TKN event.\n");
|
|
Packit |
577717 |
printf("\tIt measures total number of conditional branches not taken\n");
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Init the PAPI library */
|
|
Packit |
577717 |
retval = PAPI_library_init( PAPI_VER_CURRENT );
|
|
Packit |
577717 |
if ( retval != PAPI_VER_CURRENT ) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_library_init", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Create Total Eventset */
|
|
Packit |
577717 |
retval=PAPI_create_eventset(&eventset_total);
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval=PAPI_add_named_event(eventset_total,"PAPI_BR_INS");
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "adding PAPI_BR_INS", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Create Total Eventset */
|
|
Packit |
577717 |
retval=PAPI_create_eventset(&eventset_conditional);
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval=PAPI_add_named_event(eventset_conditional,"PAPI_BR_CN");
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
if (!quiet) printf("Could not add PAPI_BR_CN\n");
|
|
Packit |
577717 |
cond_avail=0;
|
|
Packit |
577717 |
//test_skip( __FILE__, __LINE__, "adding PAPI_BR_CN", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Create Taken Eventset */
|
|
Packit |
577717 |
retval=PAPI_create_eventset(&eventset_taken);
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval=PAPI_add_named_event(eventset_taken,"PAPI_BR_TKN");
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
if (!quiet) printf("Could not add PAPI_BR_TKN\n");
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "adding PAPI_BR_TKN", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Create Not-Taken Eventset */
|
|
Packit |
577717 |
retval=PAPI_create_eventset(&eventset_nottaken);
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval=PAPI_add_named_event(eventset_taken,"PAPI_BR_NTK");
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
if (!quiet) printf("Could not add PAPI_BR_NTK\n");
|
|
Packit |
577717 |
nottaken_avail=0;
|
|
Packit |
577717 |
//test_skip( __FILE__, __LINE__, "adding PAPI_BR_NTK", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Get total count */
|
|
Packit |
577717 |
PAPI_reset(eventset_total);
|
|
Packit |
577717 |
PAPI_start(eventset_total);
|
|
Packit |
577717 |
ins_result=branches_testcode();
|
|
Packit |
577717 |
retval=PAPI_stop(eventset_total,&count_total);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Get conditional count */
|
|
Packit |
577717 |
if (cond_avail) {
|
|
Packit |
577717 |
PAPI_reset(eventset_conditional);
|
|
Packit |
577717 |
PAPI_start(eventset_conditional);
|
|
Packit |
577717 |
ins_result=branches_testcode();
|
|
Packit |
577717 |
retval=PAPI_stop(eventset_conditional,&count_conditional);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Get taken count */
|
|
Packit |
577717 |
PAPI_reset(eventset_taken);
|
|
Packit |
577717 |
PAPI_start(eventset_taken);
|
|
Packit |
577717 |
ins_result=branches_testcode();
|
|
Packit |
577717 |
retval=PAPI_stop(eventset_taken,&count_taken);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Get not-taken count */
|
|
Packit |
577717 |
if (nottaken_avail) {
|
|
Packit |
577717 |
PAPI_reset(eventset_nottaken);
|
|
Packit |
577717 |
PAPI_start(eventset_nottaken);
|
|
Packit |
577717 |
ins_result=branches_testcode();
|
|
Packit |
577717 |
retval=PAPI_stop(eventset_nottaken,&count_nottaken);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("The test code has:\n");
|
|
Packit |
577717 |
printf("\t%lld total branches\n",count_total);
|
|
Packit |
577717 |
if (cond_avail) {
|
|
Packit |
577717 |
printf("\t%lld conditional branches\n",count_conditional);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
printf("\t%lld taken branches\n",count_taken);
|
|
Packit |
577717 |
if (nottaken_avail) {
|
|
Packit |
577717 |
printf("\t%lld not-taken branches\n",count_nottaken);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("Testing a loop with %lld conditional taken branches (%d times):\n",
|
|
Packit |
577717 |
expected_cond,num_runs);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for(i=0;i
|
|
Packit |
577717 |
PAPI_reset(eventset_taken);
|
|
Packit |
577717 |
PAPI_start(eventset_taken);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
ins_result=branches_testcode();
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval=PAPI_stop(eventset_taken,&count);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (ins_result==CODE_UNIMPLEMENTED) {
|
|
Packit |
577717 |
fprintf(stderr,"\tCode unimplemented\n");
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "unimplemented", 0);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,
|
|
Packit |
577717 |
"reading PAPI_BR_TKN", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (count>high) high=count;
|
|
Packit |
577717 |
if ((low==0) || (count
|
|
Packit |
577717 |
total+=count;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
average=(total/num_runs);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
error=display_error(average,high,low,expected_cond,quiet);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ((error > 1.0) || (error<-1.0)) {
|
|
Packit |
577717 |
if (!quiet) printf("Instruction count off by more than 1%%\n");
|
|
Packit |
577717 |
not_expected=1;
|
|
Packit |
577717 |
//test_fail( __FILE__, __LINE__, "Error too high", 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) printf("\n");
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Check if using TOTAL instead of CONDITIONAL */
|
|
Packit |
577717 |
if (not_expected) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
error=display_error(average,high,low,expected_total,quiet);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ((error > 1.0) || (error<-1.0)) {
|
|
Packit |
577717 |
if (!quiet) printf("Instruction count off by more than 1%%\n");
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__, "Error too high", 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
else {
|
|
Packit |
577717 |
test_warn(__FILE__,__LINE__,"Using TOTAL BRANCHES as base rather than CONDITIONAL BRANCHES\n",0);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass( __FILE__ );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_shutdown();
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|