|
Packit |
577717 |
/* This code attempts to test the L2 Data Cache Writes */
|
|
Packit |
577717 |
/* performance counter PAPI_L2_DCW */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* by Vince Weaver, vincent.weaver@maine.edu */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include <stdio.h>
|
|
Packit |
577717 |
#include <stdlib.h>
|
|
Packit |
577717 |
#include <unistd.h>
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_test.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "cache_helper.h"
|
|
Packit |
577717 |
#include "display_error.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "testcode.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define NUM_RUNS 100
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int main(int argc, char **argv) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
int eventset=PAPI_NULL;
|
|
Packit |
577717 |
int num_runs=NUM_RUNS;
|
|
Packit |
577717 |
long long high,low,average,expected;
|
|
Packit |
577717 |
long long count,total;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
int l1_size,l2_size,l1_linesize,l2_linesize,l2_entries;
|
|
Packit |
577717 |
int arraysize;
|
|
Packit |
577717 |
int quiet,errors=0,warnings=0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
double error;
|
|
Packit |
577717 |
double *array;
|
|
Packit |
577717 |
double aSumm = 0.0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
quiet=tests_quiet(argc,argv);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("Testing the PAPI_L2_DCW event\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 |
retval=PAPI_create_eventset(&eventset);
|
|
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,"PAPI_L2_DCW");
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_skip( __FILE__, __LINE__, "adding PAPI_L2_DCW", retval );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
l1_size=get_cachesize(L1D_CACHE);
|
|
Packit |
577717 |
l1_linesize=get_linesize(L1D_CACHE);
|
|
Packit |
577717 |
l2_size=get_cachesize(L2_CACHE);
|
|
Packit |
577717 |
l2_linesize=get_linesize(L2_CACHE);
|
|
Packit |
577717 |
l2_entries=get_entries(L2_CACHE);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\tDetected %dk L1 DCache, %dB linesize\n",
|
|
Packit |
577717 |
l1_size/1024,l1_linesize);
|
|
Packit |
577717 |
printf("\tDetected %dk L2 DCache, %dB linesize, %d entries\n",
|
|
Packit |
577717 |
l2_size/1024,l2_linesize,l2_entries);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
arraysize=l2_size/sizeof(double);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\tAllocating %zu bytes of memory (%d doubles)\n",
|
|
Packit |
577717 |
arraysize*sizeof(double),arraysize);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
array=calloc(arraysize,sizeof(double));
|
|
Packit |
577717 |
if (array==NULL) {
|
|
Packit |
577717 |
test_fail(__FILE__,__LINE__,"Can't allocate memory",0);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/******************/
|
|
Packit |
577717 |
/* Testing Writes */
|
|
Packit |
577717 |
/******************/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\nWrite Test: Initializing an array of %d doubles:\n",
|
|
Packit |
577717 |
arraysize);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
high=0; low=0; total=0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for(i=0;i
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_reset(eventset);
|
|
Packit |
577717 |
PAPI_start(eventset);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
cache_write_test(array,arraysize);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval=PAPI_stop(eventset,&count);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,
|
|
Packit |
577717 |
"reading PAPI_L2_DCW", 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 |
expected=arraysize/(l1_linesize/sizeof(double));
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\tShould be roughly "
|
|
Packit |
577717 |
"arraysize/L1_linesize/double_size (%d/%d/%zu): "
|
|
Packit |
577717 |
"%lld\n\n",
|
|
Packit |
577717 |
arraysize,l1_linesize,sizeof(double),
|
|
Packit |
577717 |
expected);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
error=display_error(average,high,low,expected,quiet);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ((error > 10.0) || (error<-10.0)) {
|
|
Packit |
577717 |
if (!quiet) printf("Instruction count off by more than 1%%\n");
|
|
Packit |
577717 |
errors++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (low
|
|
Packit |
577717 |
if (!quiet) printf("WARNING: Average OK but low value seems suspicious\n");
|
|
Packit |
577717 |
warnings++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) printf("\n");
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/******************/
|
|
Packit |
577717 |
/* Testing Reads */
|
|
Packit |
577717 |
/******************/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\nRead Test: Summing an array of %d doubles:\n",
|
|
Packit |
577717 |
arraysize);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
high=0; low=0; total=0;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
for(i=0;i
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_reset(eventset);
|
|
Packit |
577717 |
PAPI_start(eventset);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
aSumm+=cache_read_test(array,arraysize);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
retval=PAPI_stop(eventset,&count);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (retval!=PAPI_OK) {
|
|
Packit |
577717 |
test_fail( __FILE__, __LINE__,
|
|
Packit |
577717 |
"reading PAPI_L2_DCW", 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 |
expected=(arraysize/(l1_linesize/sizeof(double)))/10;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\tShould be very low as we are measuring writes\n");
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("Average writes: %lld\n",average);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (average>expected) {
|
|
Packit |
577717 |
if (!quiet) printf("ERROR: Write count unexpectedly high\n");
|
|
Packit |
577717 |
errors++;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (!quiet) {
|
|
Packit |
577717 |
printf("\n");
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* FIXME: warn for now, as fail on broadwell and more recent */
|
|
Packit |
577717 |
if (errors) {
|
|
Packit |
577717 |
test_warn( __FILE__, __LINE__, "Error too high", 1 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (warnings) {
|
|
Packit |
577717 |
test_warn(__FILE__, __LINE__, "Average results OK but some measurements low",1);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
test_pass(__FILE__);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return 0;
|
|
Packit |
577717 |
}
|