Blame src/utils/papi_mem_info.c

Packit 577717
/*
Packit 577717
 * This file perfoms the following test:  memory info
Packit 577717
 *
Packit 577717
 * Author: Kevin London
Packit 577717
 *         london@cs.utk.edu
Packit 577717
 */
Packit 577717
/** file papi_mem_info.c
Packit 577717
  * @brief papi_mem_info utility.
Packit 577717
  *	@page papi_mem_info
Packit 577717
  *	@section NAME
Packit 577717
  *		papi_mem_info - provides information on the memory architecture of the current processor. 
Packit 577717
  *
Packit 577717
  *	@section Synopsis
Packit 577717
  *
Packit 577717
  *	@section Description
Packit 577717
  *		papi_mem_info is a PAPI utility program that reports information about 
Packit 577717
  *		the cache memory architecture of the current processor, including number, 
Packit 577717
  *		types, sizes and associativities of instruction and data caches and 
Packit 577717
  *		Translation Lookaside Buffers.
Packit 577717
  *
Packit 577717
  *	@section Options
Packit 577717
  *		This utility has no command line options.
Packit 577717
  *
Packit 577717
  *	@section Bugs
Packit 577717
  *		There are no known bugs in this utility.
Packit 577717
  *		If you find a bug, it should be reported to the
Packit 577717
  *		PAPI Mailing List at <ptools-perfapi@icl.utk.edu>.
Packit 577717
  */
Packit 577717
Packit 577717
#include <stdio.h>
Packit 577717
#include <stdlib.h>
Packit 577717
Packit 577717
#include "papi.h"
Packit 577717
Packit 577717
Packit 577717
int
Packit 577717
main( int argc, char **argv )
Packit 577717
{
Packit 577717
	const PAPI_hw_info_t *meminfo = NULL;
Packit 577717
	PAPI_mh_level_t *L;
Packit 577717
	int i, j, retval;
Packit 577717
Packit 577717
	(void)argc;
Packit 577717
	(void)argv;
Packit 577717
Packit 577717
	retval = PAPI_library_init( PAPI_VER_CURRENT );
Packit 577717
	if ( retval != PAPI_VER_CURRENT ) {
Packit 577717
		fprintf(stderr,"Error! PAPI_library_init\n");
Packit 577717
		return retval;
Packit 577717
	}
Packit 577717
Packit 577717
	meminfo = PAPI_get_hardware_info(  );
Packit 577717
	if (meminfo == NULL ) {
Packit 577717
		fprintf(stderr,"Error! PAPI_get_hardware_info");
Packit 577717
		return 2;
Packit 577717
	}
Packit 577717
Packit 577717
	printf( "Memory Cache and TLB Hierarchy Information.\n" );
Packit 577717
	printf( "------------------------------------------------------------------------\n" );
Packit 577717
Packit 577717
	/* Extract and report the tlb and cache information */
Packit 577717
	L = ( PAPI_mh_level_t * ) & ( meminfo->mem_hierarchy.level[0] );
Packit 577717
	printf( "TLB Information.\n  There may be multiple descriptors for each level of TLB\n" );
Packit 577717
	printf( "  if multiple page sizes are supported.\n\n" );
Packit 577717
	/* Scan the TLB structures */
Packit 577717
	for ( i = 0; i < meminfo->mem_hierarchy.levels; i++ ) {
Packit 577717
		for ( j = 0; j < PAPI_MH_MAX_LEVELS; j++ ) {
Packit 577717
			switch ( PAPI_MH_CACHE_TYPE( L[i].tlb[j].type ) ) {
Packit 577717
				case PAPI_MH_TYPE_UNIFIED:
Packit 577717
					printf( "L%d Unified TLB:\n", i + 1 );
Packit 577717
					break;
Packit 577717
				case PAPI_MH_TYPE_DATA:
Packit 577717
					printf( "L%d Data TLB:\n", i + 1 );
Packit 577717
					break;
Packit 577717
				case PAPI_MH_TYPE_INST:
Packit 577717
					printf( "L%d Instruction TLB:\n", i + 1 );
Packit 577717
					break;
Packit 577717
			}
Packit 577717
			if ( L[i].tlb[j].type ) {
Packit 577717
				if ( L[i].tlb[j].page_size )
Packit 577717
					printf( "  Page Size:         %6d KB\n",
Packit 577717
							L[i].tlb[j].page_size >> 10 );
Packit 577717
				printf( "  Number of Entries: %6d\n",
Packit 577717
						L[i].tlb[j].num_entries );
Packit 577717
				switch ( L[i].tlb[j].associativity ) {
Packit 577717
					case 0: /* undefined */
Packit 577717
						break;
Packit 577717
					case 1:
Packit 577717
						printf( "  Associativity:      Direct Mapped\n\n" );
Packit 577717
						break;
Packit 577717
					case SHRT_MAX:
Packit 577717
						printf( "  Associativity:       Full\n\n" );
Packit 577717
						break;
Packit 577717
					default:
Packit 577717
						printf( "  Associativity:     %6d\n\n",
Packit 577717
								L[i].tlb[j].associativity );
Packit 577717
						break;
Packit 577717
				}
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	/* Scan the Cache structures */
Packit 577717
	printf( "\nCache Information.\n\n" );
Packit 577717
	for ( i = 0; i < meminfo->mem_hierarchy.levels; i++ ) {
Packit 577717
		for ( j = 0; j < 2; j++ ) {
Packit 577717
			switch ( PAPI_MH_CACHE_TYPE( L[i].cache[j].type ) ) {
Packit 577717
				case PAPI_MH_TYPE_UNIFIED:
Packit 577717
					printf( "L%d Unified Cache:\n", i + 1 );
Packit 577717
					break;
Packit 577717
				case PAPI_MH_TYPE_DATA:
Packit 577717
					printf( "L%d Data Cache:\n", i + 1 );
Packit 577717
					break;
Packit 577717
				case PAPI_MH_TYPE_INST:
Packit 577717
					printf( "L%d Instruction Cache:\n", i + 1 );
Packit 577717
					break;
Packit 577717
				case PAPI_MH_TYPE_TRACE:
Packit 577717
					printf( "L%d Trace Buffer:\n", i + 1 );
Packit 577717
					break;
Packit 577717
				case PAPI_MH_TYPE_VECTOR:
Packit 577717
					printf( "L%d Vector Cache:\n", i + 1 );
Packit 577717
					break;
Packit 577717
			}
Packit 577717
			if ( L[i].cache[j].type ) {
Packit 577717
				printf( "  Total size:        %6d KB\n  Line size:         %6d B\n  Number of Lines:   %6d\n  Associativity:     %6d\n\n",
Packit 577717
						  ( L[i].cache[j].size ) >> 10, L[i].cache[j].line_size,
Packit 577717
						  L[i].cache[j].num_lines,
Packit 577717
						  L[i].cache[j].associativity );
Packit 577717
			}
Packit 577717
		}
Packit 577717
	}
Packit 577717
Packit 577717
	return 0;
Packit 577717
}