|
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 |
}
|