Blame src/validation_tests/cache_helper.c

Packit 577717
#include <stdio.h>
Packit 577717
Packit 577717
#include "cache_helper.h"
Packit 577717
Packit 577717
#include "papi.h"
Packit 577717
#include "papi_test.h"
Packit 577717
Packit 577717
const PAPI_hw_info_t *hw_info=NULL;
Packit 577717
Packit 577717
struct cache_info_t {
Packit 577717
	int wpolicy;
Packit 577717
	int replace;
Packit 577717
	int size;
Packit 577717
	int entries;
Packit 577717
	int ways;
Packit 577717
	int linesize;
Packit 577717
};
Packit 577717
Packit 577717
static struct cache_info_t cache_info[MAX_CACHE];
Packit 577717
Packit 577717
static int check_if_cache_info_available(void) {
Packit 577717
Packit 577717
	int cache_type,level,j;
Packit 577717
Packit 577717
	/* Get PAPI Hardware Info */
Packit 577717
	hw_info=PAPI_get_hardware_info();
Packit 577717
	if (hw_info==NULL) {
Packit 577717
		return -1;
Packit 577717
	}
Packit 577717
Packit 577717
	/* Iterate down the levels (L1, L2, L3) */
Packit 577717
	for(level=0;level<hw_info->mem_hierarchy.levels;level++) {
Packit 577717
		for(j=0;j<2;j++) {
Packit 577717
			cache_type=PAPI_MH_CACHE_TYPE(
Packit 577717
				hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
			if (cache_type==PAPI_MH_TYPE_EMPTY) continue;
Packit 577717
Packit 577717
			if (level==0) {
Packit 577717
				if (cache_type==PAPI_MH_TYPE_DATA) {
Packit 577717
					cache_info[L1D_CACHE].size=hw_info->mem_hierarchy.level[level].cache[j].size;
Packit 577717
					cache_info[L1D_CACHE].linesize=hw_info->mem_hierarchy.level[level].cache[j].line_size;
Packit 577717
					cache_info[L1D_CACHE].ways=hw_info->mem_hierarchy.level[level].cache[j].associativity;
Packit 577717
					cache_info[L1D_CACHE].entries=cache_info[L1D_CACHE].size/cache_info[L1D_CACHE].linesize;
Packit 577717
					cache_info[L1D_CACHE].wpolicy=PAPI_MH_CACHE_WRITE_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
					cache_info[L1D_CACHE].replace=PAPI_MH_CACHE_REPLACEMENT_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
				}
Packit 577717
				else if (cache_type==PAPI_MH_TYPE_INST) {
Packit 577717
					cache_info[L1I_CACHE].size=hw_info->mem_hierarchy.level[level].cache[j].size;
Packit 577717
					cache_info[L1I_CACHE].linesize=hw_info->mem_hierarchy.level[level].cache[j].line_size;
Packit 577717
					cache_info[L1I_CACHE].ways=hw_info->mem_hierarchy.level[level].cache[j].associativity;
Packit 577717
					cache_info[L1I_CACHE].entries=cache_info[L1I_CACHE].size/cache_info[L1I_CACHE].linesize;
Packit 577717
					cache_info[L1I_CACHE].wpolicy=PAPI_MH_CACHE_WRITE_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
					cache_info[L1I_CACHE].replace=PAPI_MH_CACHE_REPLACEMENT_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
				}
Packit 577717
			}
Packit 577717
			else if (level==1) {
Packit 577717
				cache_info[L2_CACHE].size=hw_info->mem_hierarchy.level[level].cache[j].size;
Packit 577717
				cache_info[L2_CACHE].linesize=hw_info->mem_hierarchy.level[level].cache[j].line_size;
Packit 577717
				cache_info[L2_CACHE].ways=hw_info->mem_hierarchy.level[level].cache[j].associativity;
Packit 577717
				cache_info[L2_CACHE].entries=cache_info[L2_CACHE].size/cache_info[L2_CACHE].linesize;
Packit 577717
				cache_info[L2_CACHE].wpolicy=PAPI_MH_CACHE_WRITE_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
				cache_info[L2_CACHE].replace=PAPI_MH_CACHE_REPLACEMENT_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
			}
Packit 577717
			else if (level==2) {
Packit 577717
				cache_info[L3_CACHE].size=hw_info->mem_hierarchy.level[level].cache[j].size;
Packit 577717
				cache_info[L3_CACHE].linesize=hw_info->mem_hierarchy.level[level].cache[j].line_size;
Packit 577717
				cache_info[L3_CACHE].ways=hw_info->mem_hierarchy.level[level].cache[j].associativity;
Packit 577717
				cache_info[L3_CACHE].entries=cache_info[L3_CACHE].size/cache_info[L3_CACHE].linesize;
Packit 577717
				cache_info[L3_CACHE].wpolicy=PAPI_MH_CACHE_WRITE_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
				cache_info[L3_CACHE].replace=PAPI_MH_CACHE_REPLACEMENT_POLICY(hw_info->mem_hierarchy.level[level].cache[j].type);
Packit 577717
			}
Packit 577717
Packit 577717
		}
Packit 577717
	}
Packit 577717
	return 0;
Packit 577717
}
Packit 577717
Packit 577717
long long get_cachesize(int type) {
Packit 577717
Packit 577717
	int result;
Packit 577717
Packit 577717
	result=check_if_cache_info_available();
Packit 577717
	if (result<0) return result;
Packit 577717
Packit 577717
	if (type>=MAX_CACHE) {
Packit 577717
		printf("Errror!\n");
Packit 577717
		return -1;
Packit 577717
	}
Packit 577717
Packit 577717
	return cache_info[type].size;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
long long get_entries(int type) {
Packit 577717
Packit 577717
	int result;
Packit 577717
Packit 577717
	result=check_if_cache_info_available();
Packit 577717
	if (result<0) return result;
Packit 577717
Packit 577717
	if (type>=MAX_CACHE) {
Packit 577717
		printf("Errror!\n");
Packit 577717
		return -1;
Packit 577717
	}
Packit 577717
Packit 577717
	return cache_info[type].entries;
Packit 577717
}
Packit 577717
Packit 577717
Packit 577717
long long get_linesize(int type) {
Packit 577717
Packit 577717
	int result;
Packit 577717
Packit 577717
	result=check_if_cache_info_available();
Packit 577717
	if (result<0) return result;
Packit 577717
Packit 577717
	if (type>=MAX_CACHE) {
Packit 577717
		printf("Errror!\n");
Packit 577717
		return -1;
Packit 577717
	}
Packit 577717
Packit 577717
	return cache_info[type].linesize;
Packit 577717
}