|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* File: solaris-memory.c
|
|
Packit |
577717 |
* Author: Kevin London
|
|
Packit |
577717 |
* london@cs.utk.edu
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Mods: Philip J. Mucci
|
|
Packit |
577717 |
* mucci@cs.utk.edu
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Mods: Vince Weaver
|
|
Packit |
577717 |
* vweaver1@eecs.utk.edu
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Mods: Fabian Gorsler
|
|
Packit |
577717 |
* fabian.gorsler@smail.inf.h-bonn-rhein-sieg.de
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
#include "papi_internal.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_solaris_get_memory_info( PAPI_hw_info_t * hw, int id )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
FILE *pipe;
|
|
Packit |
577717 |
char line[BUFSIZ];
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_mh_level_t *mem = hw->mem_hierarchy.level;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pipe=popen("prtconf -pv","r");
|
|
Packit |
577717 |
if (pipe==NULL) {
|
|
Packit |
577717 |
return PAPI_ESYS;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
while(1) {
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (fgets(line,BUFSIZ,pipe)==NULL) break;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (strstr(line,"icache-size:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].cache[0].size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (strstr(line,"icache-line-size:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].cache[0].line_size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (strstr(line,"icache-associativity:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].cache[0].associativity);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (strstr(line,"dcache-size:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].cache[1].size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (strstr(line,"dcache-line-size:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].cache[1].line_size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (strstr(line,"dcache-associativity:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].cache[1].associativity);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (strstr(line,"ecache-size:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[1].cache[0].size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (strstr(line,"ecache-line-size:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[1].cache[0].line_size);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (strstr(line,"ecache-associativity:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[1].cache[0].associativity);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if (strstr(line,"#itlb-entries:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].tlb[0].num_entries);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if (strstr(line,"#dtlb-entries:")) {
|
|
Packit |
577717 |
sscanf(line,"%*s %#x",&mem[0].tlb[1].num_entries);
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
pclose(pipe);
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* I-Cache -> L1$ instruction */
|
|
Packit |
577717 |
mem[0].cache[0].type = PAPI_MH_TYPE_INST;
|
|
Packit |
577717 |
if (mem[0].cache[0].line_size!=0) mem[0].cache[0].num_lines =
|
|
Packit |
577717 |
mem[0].cache[0].size / mem[0].cache[0].line_size;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* D-Cache -> L1$ data */
|
|
Packit |
577717 |
mem[0].cache[1].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_WT | PAPI_MH_TYPE_LRU;
|
|
Packit |
577717 |
if (mem[0].cache[1].line_size!=0) mem[0].cache[1].num_lines =
|
|
Packit |
577717 |
mem[0].cache[1].size / mem[0].cache[1].line_size;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* ITLB -> TLB instruction */
|
|
Packit |
577717 |
mem[0].tlb[0].type = PAPI_MH_TYPE_INST | PAPI_MH_TYPE_PSEUDO_LRU;
|
|
Packit |
577717 |
/* assume fully associative */
|
|
Packit |
577717 |
mem[0].tlb[0].associativity = mem[0].tlb[0].num_entries;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* DTLB -> TLB data */
|
|
Packit |
577717 |
mem[0].tlb[1].type = PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_PSEUDO_LRU;
|
|
Packit |
577717 |
/* assume fully associative */
|
|
Packit |
577717 |
mem[0].tlb[1].associativity = mem[0].tlb[1].num_entries;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* L2$ unified */
|
|
Packit |
577717 |
mem[1].cache[0].type = PAPI_MH_TYPE_UNIFIED | PAPI_MH_TYPE_WB
|
|
Packit |
577717 |
| PAPI_MH_TYPE_PSEUDO_LRU;
|
|
Packit |
577717 |
if (mem[1].cache[0].line_size!=0) mem[1].cache[0].num_lines =
|
|
Packit |
577717 |
mem[1].cache[0].size / mem[1].cache[0].line_size;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Indicate we have two levels filled in the hierarchy */
|
|
Packit |
577717 |
hw->mem_hierarchy.levels = 2;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_solaris_get_dmem_info( PAPI_dmem_info_t * d )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
|
|
Packit |
577717 |
FILE *fd;
|
|
Packit |
577717 |
struct psinfo psi;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( ( fd = fopen( "/proc/self/psinfo", "r" ) ) == NULL ) {
|
|
Packit |
577717 |
SUBDBG( "fopen(/proc/self) errno %d", errno );
|
|
Packit |
577717 |
return ( PAPI_ESYS );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
fread( ( void * ) &psi, sizeof ( struct psinfo ), 1, fd );
|
|
Packit |
577717 |
fclose( fd );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
d->pagesize = sysconf( _SC_PAGESIZE );
|
|
Packit |
577717 |
d->size = d->pagesize * sysconf( _SC_PHYS_PAGES );
|
|
Packit |
577717 |
d->resident = ( ( 1024 * psi.pr_size ) / d->pagesize );
|
|
Packit |
577717 |
d->high_water_mark = PAPI_EINVAL;
|
|
Packit |
577717 |
d->shared = PAPI_EINVAL;
|
|
Packit |
577717 |
d->text = PAPI_EINVAL;
|
|
Packit |
577717 |
d->library = PAPI_EINVAL;
|
|
Packit |
577717 |
d->heap = PAPI_EINVAL;
|
|
Packit |
577717 |
d->locked = PAPI_EINVAL;
|
|
Packit |
577717 |
d->stack = PAPI_EINVAL;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
int
|
|
Packit |
577717 |
_niagara2_get_memory_info( PAPI_hw_info_t * hw, int id )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
PAPI_mh_level_t *mem = hw->mem_hierarchy.level;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* I-Cache -> L1$ instruction */
|
|
Packit |
577717 |
/* FIXME: The policy used at this cache is unknown to PAPI. LSFR with random
|
|
Packit |
577717 |
replacement. */
|
|
Packit |
577717 |
mem[0].cache[0].type = PAPI_MH_TYPE_INST;
|
|
Packit |
577717 |
mem[0].cache[0].size = 16 * 1024; // 16 Kb
|
|
Packit |
577717 |
mem[0].cache[0].line_size = 32;
|
|
Packit |
577717 |
mem[0].cache[0].num_lines =
|
|
Packit |
577717 |
mem[0].cache[0].size / mem[0].cache[0].line_size;
|
|
Packit |
577717 |
mem[0].cache[0].associativity = 8;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* D-Cache -> L1$ data */
|
|
Packit |
577717 |
mem[0].cache[1].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_WT | PAPI_MH_TYPE_LRU;
|
|
Packit |
577717 |
mem[0].cache[1].size = 8 * 1024; // 8 Kb
|
|
Packit |
577717 |
mem[0].cache[1].line_size = 16;
|
|
Packit |
577717 |
mem[0].cache[1].num_lines =
|
|
Packit |
577717 |
mem[0].cache[1].size / mem[0].cache[1].line_size;
|
|
Packit |
577717 |
mem[0].cache[1].associativity = 4;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* ITLB -> TLB instruction */
|
|
Packit |
577717 |
mem[0].tlb[0].type = PAPI_MH_TYPE_INST | PAPI_MH_TYPE_PSEUDO_LRU;
|
|
Packit |
577717 |
mem[0].tlb[0].num_entries = 64;
|
|
Packit |
577717 |
mem[0].tlb[0].associativity = 64;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* DTLB -> TLB data */
|
|
Packit |
577717 |
mem[0].tlb[1].type = PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_PSEUDO_LRU;
|
|
Packit |
577717 |
mem[0].tlb[1].num_entries = 128;
|
|
Packit |
577717 |
mem[0].tlb[1].associativity = 128;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* L2$ unified */
|
|
Packit |
577717 |
mem[1].cache[0].type = PAPI_MH_TYPE_UNIFIED | PAPI_MH_TYPE_WB
|
|
Packit |
577717 |
| PAPI_MH_TYPE_PSEUDO_LRU;
|
|
Packit |
577717 |
mem[1].cache[0].size = 4 * 1024 * 1024; // 4 Mb
|
|
Packit |
577717 |
mem[1].cache[0].line_size = 64;
|
|
Packit |
577717 |
mem[1].cache[0].num_lines =
|
|
Packit |
577717 |
mem[1].cache[0].size / mem[1].cache[0].line_size;
|
|
Packit |
577717 |
mem[1].cache[0].associativity = 16;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Indicate we have two levels filled in the hierarchy */
|
|
Packit |
577717 |
hw->mem_hierarchy.levels = 2;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return PAPI_OK;
|
|
Packit |
577717 |
}
|