PAPI  5.0.1.0
solaris-memory.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int _solaris_get_memory_info (PAPI_hw_info_t *hw, int id)
int _solaris_get_dmem_info (PAPI_dmem_info_t *d)
int _niagara2_get_memory_info (PAPI_hw_info_t *hw, int id)

Function Documentation

int _niagara2_get_memory_info ( PAPI_hw_info_t hw,
int  id 
)

< No error

Definition at line 147 of file solaris-memory.c.

{
    PAPI_mh_level_t *mem = hw->mem_hierarchy.level;


    /* I-Cache -> L1$ instruction */
    /* FIXME: The policy used at this cache is unknown to PAPI. LSFR with random
       replacement. */
    mem[0].cache[0].type = PAPI_MH_TYPE_INST;
    mem[0].cache[0].size = 16 * 1024;   // 16 Kb
    mem[0].cache[0].line_size = 32;
    mem[0].cache[0].num_lines =
        mem[0].cache[0].size / mem[0].cache[0].line_size;
    mem[0].cache[0].associativity = 8;

    /* D-Cache -> L1$ data */
    mem[0].cache[1].type =
        PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_WT | PAPI_MH_TYPE_LRU;
    mem[0].cache[1].size = 8 * 1024;    // 8 Kb
    mem[0].cache[1].line_size = 16;
    mem[0].cache[1].num_lines =
        mem[0].cache[1].size / mem[0].cache[1].line_size;
    mem[0].cache[1].associativity = 4;

    /* ITLB -> TLB instruction */
    mem[0].tlb[0].type = PAPI_MH_TYPE_INST | PAPI_MH_TYPE_PSEUDO_LRU;
    mem[0].tlb[0].num_entries = 64;
    mem[0].tlb[0].associativity = 64;

    /* DTLB -> TLB data */
    mem[0].tlb[1].type = PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_PSEUDO_LRU;
    mem[0].tlb[1].num_entries = 128;
    mem[0].tlb[1].associativity = 128;

    /* L2$ unified */
    mem[1].cache[0].type = PAPI_MH_TYPE_UNIFIED | PAPI_MH_TYPE_WB
        | PAPI_MH_TYPE_PSEUDO_LRU;
    mem[1].cache[0].size = 4 * 1024 * 1024; // 4 Mb
    mem[1].cache[0].line_size = 64;
    mem[1].cache[0].num_lines =
        mem[1].cache[0].size / mem[1].cache[0].line_size;
    mem[1].cache[0].associativity = 16;

    /* Indicate we have two levels filled in the hierarchy */
    hw->mem_hierarchy.levels = 2;

    return PAPI_OK;
}

< A System/C library call failed

< Invalid argument

< Invalid argument

< Invalid argument

< Invalid argument

< Invalid argument

< Invalid argument

< Invalid argument

< No error

Definition at line 117 of file solaris-memory.c.

{

    FILE *fd;
    struct psinfo psi;

    if ( ( fd = fopen( "/proc/self/psinfo", "r" ) ) == NULL ) {
        SUBDBG( "fopen(/proc/self) errno %d", errno );
        return ( PAPI_ESYS );
    }

    fread( ( void * ) &psi, sizeof ( struct psinfo ), 1, fd );
    fclose( fd );

    d->pagesize = sysconf( _SC_PAGESIZE );
    d->size = d->pagesize * sysconf( _SC_PHYS_PAGES );
    d->resident = ( ( 1024 * psi.pr_size ) / d->pagesize );
    d->high_water_mark = PAPI_EINVAL;
    d->shared = PAPI_EINVAL;
    d->text = PAPI_EINVAL;
    d->library = PAPI_EINVAL;
    d->heap = PAPI_EINVAL;
    d->locked = PAPI_EINVAL;
    d->stack = PAPI_EINVAL;

    return PAPI_OK;

}

Here is the call graph for this function:

int _solaris_get_memory_info ( PAPI_hw_info_t hw,
int  id 
)

< A System/C library call failed

< No error

Definition at line 21 of file solaris-memory.c.

{
        FILE *pipe;
        char line[BUFSIZ];

    PAPI_mh_level_t *mem = hw->mem_hierarchy.level;

    pipe=popen("prtconf -pv","r");
        if (pipe==NULL) {
       return PAPI_ESYS;
    }

    while(1) {

       if (fgets(line,BUFSIZ,pipe)==NULL) break;

           if (strstr(line,"icache-size:")) {
          sscanf(line,"%*s %x",&mem[0].cache[0].size);
       }
           if (strstr(line,"icache-line-size:")) {
          sscanf(line,"%*s %x",&mem[0].cache[0].line_size);
       }
           if (strstr(line,"icache-associativity:")) {
          sscanf(line,"%*s %x",&mem[0].cache[0].associativity);
       }

           if (strstr(line,"dcache-size:")) {
          sscanf(line,"%*s %x",&mem[0].cache[1].size);
       }
           if (strstr(line,"dcache-line-size:")) {
          sscanf(line,"%*s %x",&mem[0].cache[1].line_size);
       }
           if (strstr(line,"dcache-associativity:")) {
          sscanf(line,"%*s %x",&mem[0].cache[1].associativity);
       }

           if (strstr(line,"ecache-size:")) {
          sscanf(line,"%*s %x",&mem[1].cache[0].size);
       }
           if (strstr(line,"ecache-line-size:")) {
          sscanf(line,"%*s %x",&mem[1].cache[0].line_size);
       }
           if (strstr(line,"ecache-associativity:")) {
          sscanf(line,"%*s %x",&mem[1].cache[0].associativity);
       }

           if (strstr(line,"#itlb-entries:")) {
          sscanf(line,"%*s %x",&mem[0].tlb[0].num_entries);
       }
           if (strstr(line,"#dtlb-entries:")) {
          sscanf(line,"%*s %x",&mem[0].tlb[1].num_entries);
       }

    }
       

        pclose(pipe);

    /* I-Cache -> L1$ instruction */
    mem[0].cache[0].type = PAPI_MH_TYPE_INST;
    if (mem[0].cache[0].line_size!=0) mem[0].cache[0].num_lines =
        mem[0].cache[0].size / mem[0].cache[0].line_size;

    /* D-Cache -> L1$ data */
    mem[0].cache[1].type =
        PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_WT | PAPI_MH_TYPE_LRU;
    if (mem[0].cache[1].line_size!=0) mem[0].cache[1].num_lines =
        mem[0].cache[1].size / mem[0].cache[1].line_size;


    /* ITLB -> TLB instruction */
    mem[0].tlb[0].type = PAPI_MH_TYPE_INST | PAPI_MH_TYPE_PSEUDO_LRU;
        /* assume fully associative */
    mem[0].tlb[0].associativity = mem[0].tlb[0].num_entries;

    /* DTLB -> TLB data */
    mem[0].tlb[1].type = PAPI_MH_TYPE_DATA | PAPI_MH_TYPE_PSEUDO_LRU;
        /* assume fully associative */
    mem[0].tlb[1].associativity = mem[0].tlb[1].num_entries;

    /* L2$ unified */
    mem[1].cache[0].type = PAPI_MH_TYPE_UNIFIED | PAPI_MH_TYPE_WB
        | PAPI_MH_TYPE_PSEUDO_LRU;
    if (mem[1].cache[0].line_size!=0) mem[1].cache[0].num_lines =
        mem[1].cache[0].size / mem[1].cache[0].line_size;

    /* Indicate we have two levels filled in the hierarchy */
    hw->mem_hierarchy.levels = 2;

    return PAPI_OK;
}
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines