Blame src/validation_tests/papi_l2_dcm.c

Packit 577717
/* This code attempts to test the L2 Data Cache Missses		*/
Packit 577717
/* performance counter PAPI_L2_DCM				*/
Packit 577717
Packit 577717
/* by Vince Weaver, vincent.weaver@maine.edu			*/
Packit 577717
Packit 577717
Packit 577717
/* Due to prefetching it is hard to create a testcase short of */
Packit 577717
/* just having random accesses. */
Packit 577717
/* In addition, due to context switching the cache might be */
Packit 577717
/* affected by other processes on a busy system. */
Packit 577717
Packit 577717
/* Other tests to attempt */
Packit 577717
/* Repeatedly reading same cache line should give very small error */
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
/* How much should we allow? */
Packit 577717
#define ALLOWED_ERROR	5.0
Packit 577717
Packit 577717
#define NUM_RUNS	100
Packit 577717
Packit 577717
#define ITERATIONS	1000000
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;
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_DCM 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_DCM");
Packit 577717
	if (retval!=PAPI_OK) {
Packit 577717
		test_skip( __FILE__, __LINE__, "adding PAPI_L2_DCM", 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))*8;
Packit 577717
Packit 577717
	if (arraysize==0) {
Packit 577717
		if (!quiet) printf("Could not detect cache size\n");
Packit 577717
		test_skip(__FILE__,__LINE__,"Could not detect cache size",0);
Packit 577717
	}
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: Writing an array of %d doubles %d random times:\n",
Packit 577717
			arraysize,ITERATIONS);
Packit 577717
		printf("\tPrefetch and shared nature of L2s make this hard.\n");
Packit 577717
		printf("\tExpected 7/8 of accesses to be miss.\n");
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_random_write_test(array,arraysize,ITERATIONS);
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_DCM", 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=(ITERATIONS*7)/8;
Packit 577717
Packit 577717
//	expected=arraysize/(l1_linesize);
Packit 577717
Packit 577717
	error=display_error(average,high,low,expected,quiet);
Packit 577717
Packit 577717
	if ((error > ALLOWED_ERROR) || (error<-ALLOWED_ERROR)) {
Packit 577717
		if (!quiet) {
Packit 577717
			printf("Instruction count off by more "
Packit 577717
				"than %.2lf%%\n",ALLOWED_ERROR);
Packit 577717
		}
Packit 577717
		errors++;
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 %d random doubles from array "
Packit 577717
			"of size %d:\n",ITERATIONS,arraysize);
Packit 577717
		printf("\tExpected 7/8 of accesses to be miss.\n");
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_random_read_test(array,arraysize,ITERATIONS);
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_DCM", 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=(ITERATIONS*7)/8;
Packit 577717
Packit 577717
//	expected=arraysize/(l1_linesize/sizeof(double));
Packit 577717
Packit 577717
	error=display_error(average,high,low,expected,quiet);
Packit 577717
Packit 577717
	if ((error > ALLOWED_ERROR) || (error<-ALLOWED_ERROR)) {
Packit 577717
		if (!quiet) {
Packit 577717
			printf("Instruction count off by more "
Packit 577717
				"than %.2lf%%\n",ALLOWED_ERROR);
Packit 577717
		}
Packit 577717
		errors++;
Packit 577717
	}
Packit 577717
Packit 577717
	if (!quiet) {
Packit 577717
		printf("\n");
Packit 577717
	}
Packit 577717
Packit 577717
	/* FIXME: Warn, as we fail on broadwell and more recent chips */
Packit 577717
	if (errors) {
Packit 577717
		test_warn( __FILE__, __LINE__, "Error too high", 1 );
Packit 577717
	}
Packit 577717
Packit 577717
Packit 577717
Packit 577717
	test_pass(__FILE__);
Packit 577717
Packit 577717
	return 0;
Packit 577717
}