|
Packit |
577717 |
/****************************/
|
|
Packit |
577717 |
/* THIS IS OPEN SOURCE CODE */
|
|
Packit |
577717 |
/****************************/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* File: papivi.h
|
|
Packit |
577717 |
* CVS: $Id$
|
|
Packit |
577717 |
* Author: dan terpstra
|
|
Packit |
577717 |
* terpstra@cs.utk.edu
|
|
Packit |
577717 |
* Mods: your name here
|
|
Packit |
577717 |
* yourname@cs.esu.edu
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Include this file INSTEAD OF "papi.h" in your application code
|
|
Packit |
577717 |
* to provide semitransparent version independent PAPI support.
|
|
Packit |
577717 |
* Follow the rules described below and elsewhere to facilitate
|
|
Packit |
577717 |
* this support.
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#ifndef _PAPIVI
|
|
Packit |
577717 |
#define _PAPIVI
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#include "papi.h"
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/***************************************************************************
|
|
Packit |
577717 |
* If PAPI_VERSION is not defined, then papi.h is for PAPI 2.
|
|
Packit |
577717 |
* The preprocessor block below contains the definitions, data structures,
|
|
Packit |
577717 |
* macros and code needed to emulate much of the PAPI 3 interface in code
|
|
Packit |
577717 |
* linking to the PAPI 2 library.
|
|
Packit |
577717 |
****************************************************************************/
|
|
Packit |
577717 |
#ifndef PAPI_VERSION
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_VERSION_NUMBER(maj,min,rev) (((maj)<<16) | ((min)<<8) | (rev))
|
|
Packit |
577717 |
#define PAPI_VERSION_MAJOR(x) (((x)>>16) & 0xffff)
|
|
Packit |
577717 |
#define PAPI_VERSION_MINOR(x) (((x)>>8) & 0xff)
|
|
Packit |
577717 |
#define PAPI_VERSION_REVISION(x) ((x) & 0xff)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This is the PAPI version on which we are running */
|
|
Packit |
577717 |
#define PAPI_VERSION PAPI_VERSION_NUMBER(2,3,4)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* This is the PAPI 3 version with which we are compatible */
|
|
Packit |
577717 |
#define PAPI_VI_VERSION PAPI_VERSION_NUMBER(3,0,6)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* PAPI 3 has an error code not defined for PAPI 2 */
|
|
Packit |
577717 |
#define PAPI_EPERM PAPI_EMISC /* You lack the necessary permissions */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* These are defined in papi_internal.h for PAPI 2.
|
|
Packit |
577717 |
* They need to be exposed for version independent PAPI code to work.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
//#define PRESET_MASK 0x80000000
|
|
Packit |
577717 |
#define PAPI_PRESET_MASK 0x80000000
|
|
Packit |
577717 |
//#define PRESET_AND_MASK 0x7FFFFFFF
|
|
Packit |
577717 |
#define PAPI_PRESET_AND_MASK 0x7FFFFFFF
|
|
Packit |
577717 |
#define PAPI_NATIVE_MASK 0x40000000
|
|
Packit |
577717 |
#define PAPI_NATIVE_AND_MASK 0x3FFFFFFF
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Some PAPI 3 definitions for PAPI_{set,get}_opt() map
|
|
Packit |
577717 |
* onto single definitions in PAPI 2. The new definitions
|
|
Packit |
577717 |
* (shown below) should be used to guarantee PAPI 3 compatibility.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PAPI_CLOCKRATE PAPI_GET_CLOCKRATE
|
|
Packit |
577717 |
#define PAPI_MAX_HWCTRS PAPI_GET_MAX_HWCTRS
|
|
Packit |
577717 |
#define PAPI_HWINFO PAPI_GET_HWINFO
|
|
Packit |
577717 |
#define PAPI_EXEINFO PAPI_GET_EXEINFO
|
|
Packit |
577717 |
#define PAPI_MAX_CPUS PAPI_GET_MAX_CPUS
|
|
Packit |
577717 |
#define PAPI_CPUS PAPI_GET_CPUS
|
|
Packit |
577717 |
#define PAPI_THREADS PAPI_GET_THREADS
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* PAPI 2 defined only one string length.
|
|
Packit |
577717 |
* PAPI 3 defines three. This insures limited compatibility.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PAPI_MIN_STR_LEN PAPI_MAX_STR_LEN
|
|
Packit |
577717 |
#define PAPI_HUGE_STR_LEN PAPI_MAX_STR_LEN
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* PAPI 2 always profiles into 16-bit buckets.
|
|
Packit |
577717 |
* PAPI 3 supports multiple bucket sizes.
|
|
Packit |
577717 |
* Exercise caution if these defines appear in your code.
|
|
Packit |
577717 |
* There is a potential for data overflow in PAPI 2.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PAPI_PROFIL_BUCKET_16 0
|
|
Packit |
577717 |
#define PAPI_PROFIL_BUCKET_32 0
|
|
Packit |
577717 |
#define PAPI_PROFIL_BUCKET_64 0
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* PAPI 3 defines a new eventcode that can often be emulated
|
|
Packit |
577717 |
* successfully on PAPI 2. PAPI 3 also deprecates two eventcodes
|
|
Packit |
577717 |
* found in PAPI 2:
|
|
Packit |
577717 |
* PAPI_IPS (instructions per second)
|
|
Packit |
577717 |
* PAPI_FLOPS (floating point instructions per second)
|
|
Packit |
577717 |
* Don't use these eventcodes in version independent code
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PAPI_FP_OPS PAPI_FP_INS
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Two new data structures are introduced in PAPI 3 that are
|
|
Packit |
577717 |
* required to support the functionality of:
|
|
Packit |
577717 |
* PAPI_get_event_info() and
|
|
Packit |
577717 |
* PAPI_get_executable_info()
|
|
Packit |
577717 |
* These structures are reproduced below.
|
|
Packit |
577717 |
* They MUST stay synchronized with their counterparts in papi.h
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PAPI_MAX_INFO_TERMS 8
|
|
Packit |
577717 |
typedef struct event_info
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
unsigned int event_code;
|
|
Packit |
577717 |
unsigned int count;
|
|
Packit |
577717 |
char symbol[PAPI_MAX_STR_LEN + 3];
|
|
Packit |
577717 |
char short_descr[PAPI_MIN_STR_LEN];
|
|
Packit |
577717 |
char long_descr[PAPI_HUGE_STR_LEN];
|
|
Packit |
577717 |
char derived[PAPI_MIN_STR_LEN];
|
|
Packit |
577717 |
char postfix[PAPI_MIN_STR_LEN];
|
|
Packit |
577717 |
unsigned int code[PAPI_MAX_INFO_TERMS];
|
|
Packit |
577717 |
char name[PAPI_MAX_INFO_TERMS]
|
|
Packit |
577717 |
[PAPI_MIN_STR_LEN];
|
|
Packit |
577717 |
char note[PAPI_HUGE_STR_LEN];
|
|
Packit |
577717 |
} PAPI_event_info_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Possible values for the 'modifier' parameter of the PAPI_enum_event call.
|
|
Packit |
577717 |
This enumeration is new in PAPI 3. It will act as a nop in PAPI 2, but
|
|
Packit |
577717 |
must be defined for code compatibility.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
enum
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
PAPI_ENUM_ALL = 0, /* Always enumerate all events */
|
|
Packit |
577717 |
PAPI_PRESET_ENUM_AVAIL, /* Enumerate events that exist here */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* PAPI PRESET section */
|
|
Packit |
577717 |
PAPI_PRESET_ENUM_INS, /* Instruction related preset events */
|
|
Packit |
577717 |
PAPI_PRESET_ENUM_BR, /* branch related preset events */
|
|
Packit |
577717 |
PAPI_PRESET_ENUM_MEM, /* memory related preset events */
|
|
Packit |
577717 |
PAPI_PRESET_ENUM_TLB, /* Translation Lookaside Buffer events */
|
|
Packit |
577717 |
PAPI_PRESET_ENUM_FP, /* Floating Point related preset events */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Pentium 4 specific section */
|
|
Packit |
577717 |
PAPI_PENT4_ENUM_GROUPS = 0x100, /* 45 groups + custom + user */
|
|
Packit |
577717 |
PAPI_PENT4_ENUM_COMBOS, /* all combinations of mask bits for given group */
|
|
Packit |
577717 |
PAPI_PENT4_ENUM_BITS, /* all individual bits for given group */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* POWER 4 specific section */
|
|
Packit |
577717 |
PAPI_PWR4_ENUM_GROUPS = 0x200 /* Enumerate groups an event belongs to */
|
|
Packit |
577717 |
};
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct _papi_address_map
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
char mapname[PAPI_HUGE_STR_LEN];
|
|
Packit |
577717 |
caddr_t text_start; /* Start address of program text segment */
|
|
Packit |
577717 |
caddr_t text_end; /* End address of program text segment */
|
|
Packit |
577717 |
caddr_t data_start; /* Start address of program data segment */
|
|
Packit |
577717 |
caddr_t data_end; /* End address of program data segment */
|
|
Packit |
577717 |
caddr_t bss_start; /* Start address of program bss segment */
|
|
Packit |
577717 |
caddr_t bss_end; /* End address of program bss segment */
|
|
Packit |
577717 |
} PAPI_address_map_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* PAPI 3 beta 3 introduces new structures for static memory description.
|
|
Packit |
577717 |
* These include structures for tlb and cache description, a structure
|
|
Packit |
577717 |
* to describe a level in the memory hierarchy, and a structure
|
|
Packit |
577717 |
* to describe all levels of the hierarchy.
|
|
Packit |
577717 |
* These structures, and the requisite data types are defined below.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* All sizes are in BYTES */
|
|
Packit |
577717 |
/* Except tlb size, which is in entries */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_MAX_MEM_HIERARCHY_LEVELS 3
|
|
Packit |
577717 |
#define PAPI_MH_TYPE_EMPTY 0x0
|
|
Packit |
577717 |
#define PAPI_MH_TYPE_INST 0x1
|
|
Packit |
577717 |
#define PAPI_MH_TYPE_DATA 0x2
|
|
Packit |
577717 |
#define PAPI_MH_TYPE_UNIFIED PAPI_MH_TYPE_INST|PAPI_MH_TYPE_DATA
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct _papi_mh_tlb_info
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int type; /* Empty, unified, data, instr */
|
|
Packit |
577717 |
int num_entries;
|
|
Packit |
577717 |
int associativity;
|
|
Packit |
577717 |
} PAPI_mh_tlb_info_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct _papi_mh_cache_info
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int type; /* Empty, unified, data, instr */
|
|
Packit |
577717 |
int size;
|
|
Packit |
577717 |
int line_size;
|
|
Packit |
577717 |
int num_lines;
|
|
Packit |
577717 |
int associativity;
|
|
Packit |
577717 |
} PAPI_mh_cache_info_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct _papi_mh_level_info
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
PAPI_mh_tlb_info_t tlb[2];
|
|
Packit |
577717 |
PAPI_mh_cache_info_t cache[2];
|
|
Packit |
577717 |
} PAPI_mh_level_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct _papi_mh_info
|
|
Packit |
577717 |
{ /* mh for mem hierarchy maybe? */
|
|
Packit |
577717 |
int levels;
|
|
Packit |
577717 |
PAPI_mh_level_t level[PAPI_MAX_MEM_HIERARCHY_LEVELS];
|
|
Packit |
577717 |
} PAPI_mh_info_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Three data structures are modified in PAPI 3
|
|
Packit |
577717 |
* These modifications are
|
|
Packit |
577717 |
* required to support the functionality of:
|
|
Packit |
577717 |
* PAPI_get_hardware_info() and
|
|
Packit |
577717 |
* PAPI_get_executable_info()
|
|
Packit |
577717 |
* These structures are reproduced below.
|
|
Packit |
577717 |
* They MUST stay synchronized with their counterparts in papi.h
|
|
Packit |
577717 |
* To avoid namespace collisions, these structures have been renamed
|
|
Packit |
577717 |
* to PAPIvi_xxx, and must also be renamed in your code.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
typedef struct _papi3_hw_info
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int ncpu; /* Number of CPUs in an SMP Node */
|
|
Packit |
577717 |
int nnodes; /* Number of Nodes in the entire system */
|
|
Packit |
577717 |
int totalcpus; /* Total number of CPUs in the entire system */
|
|
Packit |
577717 |
int vendor; /* Vendor number of CPU */
|
|
Packit |
577717 |
char vendor_string[PAPI_MAX_STR_LEN]; /* Vendor string of CPU */
|
|
Packit |
577717 |
int model; /* Model number of CPU */
|
|
Packit |
577717 |
char model_string[PAPI_MAX_STR_LEN]; /* Model string of CPU */
|
|
Packit |
577717 |
float revision; /* Revision of CPU */
|
|
Packit |
577717 |
float mhz; /* Cycle time of this CPU, *may* be estimated at
|
|
Packit |
577717 |
init time with a quick timing routine */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
PAPI_mh_info_t mem_hierarchy;
|
|
Packit |
577717 |
} PAPIvi_hw_info_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct _papi3_preload_option
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
char lib_preload_env[PAPI_MAX_STR_LEN]; /* Model string of CPU */
|
|
Packit |
577717 |
char lib_preload_sep;
|
|
Packit |
577717 |
char lib_dir_env[PAPI_MAX_STR_LEN];
|
|
Packit |
577717 |
char lib_dir_sep;
|
|
Packit |
577717 |
} PAPIvi_preload_option_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
typedef struct _papi3_program_info
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
char fullname[PAPI_MAX_STR_LEN]; /* path+name */
|
|
Packit |
577717 |
char name[PAPI_MAX_STR_LEN]; /* name */
|
|
Packit |
577717 |
PAPI_address_map_t address_info;
|
|
Packit |
577717 |
PAPIvi_preload_option_t preload_info;
|
|
Packit |
577717 |
} PAPIvi_exe_info_t;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* The Low Level API
|
|
Packit |
577717 |
* Functions in this API are classified in 4 basic categories:
|
|
Packit |
577717 |
* Modified: 13 functions
|
|
Packit |
577717 |
* New: 8 functions
|
|
Packit |
577717 |
* Unchanged: 32 functions
|
|
Packit |
577717 |
* Deprecated: 9 functions
|
|
Packit |
577717 |
*
|
|
Packit |
577717 |
* Each of these categories is discussed further below.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Modified functions are further divided into 4 subcategories:
|
|
Packit |
577717 |
* Dereferencing changes: 6 functions
|
|
Packit |
577717 |
* These functions simply substitute an EventSet value for
|
|
Packit |
577717 |
* a pointer to an EventSet. In the case of PAPI_remove_event{s}()
|
|
Packit |
577717 |
* there is also a name change.
|
|
Packit |
577717 |
* Name changes: 1 function
|
|
Packit |
577717 |
* This is a simple name change with no change in functionality.
|
|
Packit |
577717 |
* Parameter changes: 4 functions
|
|
Packit |
577717 |
* Several functions have changed functionality reflected in changed
|
|
Packit |
577717 |
* parameters:
|
|
Packit |
577717 |
* PAPI_{un}lock() supports multiple locks in PAPI 3
|
|
Packit |
577717 |
* PAPI_profil() supports multiple bucket sizes in PAPI 3
|
|
Packit |
577717 |
* PAPI_thread_init() removes an unused parameter in PAPI 3
|
|
Packit |
577717 |
* New functionality: 2 functions
|
|
Packit |
577717 |
* These functions support new data in revised data structures
|
|
Packit |
577717 |
* The code implemented here maps the old structures to the new
|
|
Packit |
577717 |
* where possible.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Modified Functons: Dereferencing changes */
|
|
Packit |
577717 |
#define PAPIvi_add_event(EventSet, Event) \
|
|
Packit |
577717 |
PAPI_add_event(&EventSet, Event)
|
|
Packit |
577717 |
#define PAPIvi_add_events(EventSet, Events, number) \
|
|
Packit |
577717 |
PAPI_add_events(&EventSet, Events, number)
|
|
Packit |
577717 |
#define PAPIvi_cleanup_eventset(EventSet) \
|
|
Packit |
577717 |
PAPI_cleanup_eventset(&EventSet)
|
|
Packit |
577717 |
#define PAPIvi_remove_event(EventSet, EventCode) \
|
|
Packit |
577717 |
PAPI_rem_event(&EventSet, EventCode)
|
|
Packit |
577717 |
#define PAPIvi_remove_events(EventSet, Events, number) \
|
|
Packit |
577717 |
PAPI_rem_events(&EventSet, Events, number)
|
|
Packit |
577717 |
#define PAPIvi_set_multiplex(EventSet) \
|
|
Packit |
577717 |
PAPI_set_multiplex(&EventSet)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Modified Functons: Name changes */
|
|
Packit |
577717 |
#define PAPIvi_is_initialized \
|
|
Packit |
577717 |
PAPI_initialized
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Modified Functons: Parameter changes */
|
|
Packit |
577717 |
#define PAPIvi_lock(lck) \
|
|
Packit |
577717 |
PAPI_lock()
|
|
Packit |
577717 |
#define PAPIvi_profil(buf, bufsiz, offset, scale, EventSet, EventCode, threshold, flags) \
|
|
Packit |
577717 |
PAPI_profil((unsigned short *)buf, bufsiz, (unsigned long)offset, scale, EventSet, EventCode, threshold, flags)
|
|
Packit |
577717 |
#define PAPIvi_thread_init(id_fn) \
|
|
Packit |
577717 |
PAPI_thread_init(id_fn, 0)
|
|
Packit |
577717 |
#define PAPIvi_unlock(lck) \
|
|
Packit |
577717 |
PAPI_unlock()
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Modified Functons: New functionality */
|
|
Packit |
577717 |
static const PAPIvi_exe_info_t *
|
|
Packit |
577717 |
PAPIvi_get_executable_info( void )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
static PAPIvi_exe_info_t prginfo3;
|
|
Packit |
577717 |
const PAPI_exe_info_t *prginfo2 = PAPI_get_executable_info( );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
if ( prginfo2 == NULL )
|
|
Packit |
577717 |
return ( NULL );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
strcpy( prginfo3.fullname, prginfo2->fullname );
|
|
Packit |
577717 |
strcpy( prginfo3.name, prginfo2->name );
|
|
Packit |
577717 |
prginfo3.address_info.mapname[0] = 0;
|
|
Packit |
577717 |
prginfo3.address_info.text_start = prginfo2->text_start;
|
|
Packit |
577717 |
prginfo3.address_info.text_end = prginfo2->text_end;
|
|
Packit |
577717 |
prginfo3.address_info.data_start = prginfo2->data_start;
|
|
Packit |
577717 |
prginfo3.address_info.data_end = prginfo2->data_end;
|
|
Packit |
577717 |
prginfo3.address_info.bss_start = prginfo2->bss_start;
|
|
Packit |
577717 |
prginfo3.address_info.bss_end = prginfo2->bss_end;
|
|
Packit |
577717 |
strcpy( prginfo3.preload_info.lib_preload_env, prginfo2->lib_preload_env );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return ( &prginfo3 );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static const PAPIvi_hw_info_t *
|
|
Packit |
577717 |
PAPIvi_get_hardware_info( void )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
static PAPIvi_hw_info_t papi3_hw_info;
|
|
Packit |
577717 |
const PAPI_hw_info_t *papi2_hw_info = PAPI_get_hardware_info( );
|
|
Packit |
577717 |
const PAPI_mem_info_t *papi2_mem_info = PAPI_get_memory_info( );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Copy the basic hardware info (same in both structures */
|
|
Packit |
577717 |
memcpy( &papi3_hw_info, papi2_hw_info, sizeof ( PAPI_hw_info_t ) );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
memset( &papi3_hw_info.mem_hierarchy, 0, sizeof ( PAPI_mh_info_t ) );
|
|
Packit |
577717 |
/* check for a unified tlb */
|
|
Packit |
577717 |
if ( papi2_mem_info->total_tlb_size &&
|
|
Packit |
577717 |
papi2_mem_info->itlb_size == 0 && papi2_mem_info->dtlb_size == 0 ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[0].type = PAPI_MH_TYPE_UNIFIED;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[0].num_entries =
|
|
Packit |
577717 |
papi2_mem_info->total_tlb_size;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
if ( papi2_mem_info->itlb_size ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[0].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_INST;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[0].num_entries =
|
|
Packit |
577717 |
papi2_mem_info->itlb_size;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[0].associativity =
|
|
Packit |
577717 |
papi2_mem_info->itlb_assoc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( papi2_mem_info->dtlb_size ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[1].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_DATA;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[1].num_entries =
|
|
Packit |
577717 |
papi2_mem_info->dtlb_size;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].tlb[1].associativity =
|
|
Packit |
577717 |
papi2_mem_info->dtlb_assoc;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
/* check for a unified level 1 cache */
|
|
Packit |
577717 |
if ( papi2_mem_info->total_L1_size )
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.levels = 1;
|
|
Packit |
577717 |
if ( papi2_mem_info->total_L1_size &&
|
|
Packit |
577717 |
papi2_mem_info->L1_icache_size == 0 &&
|
|
Packit |
577717 |
papi2_mem_info->L1_dcache_size == 0 ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[0].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_UNIFIED;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[0].size =
|
|
Packit |
577717 |
papi2_mem_info->total_L1_size << 10;
|
|
Packit |
577717 |
} else {
|
|
Packit |
577717 |
if ( papi2_mem_info->L1_icache_size ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[0].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_INST;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[0].size =
|
|
Packit |
577717 |
papi2_mem_info->L1_icache_size << 10;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[0].associativity =
|
|
Packit |
577717 |
papi2_mem_info->L1_icache_assoc;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[0].num_lines =
|
|
Packit |
577717 |
papi2_mem_info->L1_icache_lines;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[0].line_size =
|
|
Packit |
577717 |
papi2_mem_info->L1_icache_linesize;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( papi2_mem_info->L1_dcache_size ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[1].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_DATA;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[1].size =
|
|
Packit |
577717 |
papi2_mem_info->L1_dcache_size << 10;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[1].associativity =
|
|
Packit |
577717 |
papi2_mem_info->L1_dcache_assoc;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[1].num_lines =
|
|
Packit |
577717 |
papi2_mem_info->L1_dcache_lines;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[0].cache[1].line_size =
|
|
Packit |
577717 |
papi2_mem_info->L1_dcache_linesize;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* check for level 2 cache info */
|
|
Packit |
577717 |
if ( papi2_mem_info->L2_cache_size ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.levels = 2;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[1].cache[0].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_UNIFIED;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[1].cache[0].size =
|
|
Packit |
577717 |
papi2_mem_info->L2_cache_size << 10;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[1].cache[0].associativity =
|
|
Packit |
577717 |
papi2_mem_info->L2_cache_assoc;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[1].cache[0].num_lines =
|
|
Packit |
577717 |
papi2_mem_info->L2_cache_lines;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[1].cache[0].line_size =
|
|
Packit |
577717 |
papi2_mem_info->L2_cache_linesize;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* check for level 3 cache info */
|
|
Packit |
577717 |
if ( papi2_mem_info->L3_cache_size ) {
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.levels = 3;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[2].cache[0].type =
|
|
Packit |
577717 |
PAPI_MH_TYPE_UNIFIED;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[2].cache[0].size =
|
|
Packit |
577717 |
papi2_mem_info->L3_cache_size << 10;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[2].cache[0].associativity =
|
|
Packit |
577717 |
papi2_mem_info->L3_cache_assoc;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[2].cache[0].num_lines =
|
|
Packit |
577717 |
papi2_mem_info->L3_cache_lines;
|
|
Packit |
577717 |
papi3_hw_info.mem_hierarchy.level[2].cache[0].line_size =
|
|
Packit |
577717 |
papi2_mem_info->L3_cache_linesize;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
return ( &papi3_hw_info );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* New functions are either supported or unsupported.
|
|
Packit |
577717 |
* Of the three supported functions, two replaced deprecated functions
|
|
Packit |
577717 |
* to describe events, and one is simply a convenience function.
|
|
Packit |
577717 |
* The five unsupported new functions include three related to thread
|
|
Packit |
577717 |
* functionality, a convenience function to return the number of events
|
|
Packit |
577717 |
* in an event set, and a function to query information about shared libraries.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* New Supported Functions */
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
PAPIvi_enum_event( int *EventCode, int modifier )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i = *EventCode;
|
|
Packit |
577717 |
const PAPI_preset_info_t *presets = PAPI_query_all_events_verbose( );
|
|
Packit |
577717 |
i &= PAPI_PRESET_AND_MASK;
|
|
Packit |
577717 |
while ( ++i < PAPI_MAX_PRESET_EVENTS ) {
|
|
Packit |
577717 |
if ( ( !modifier ) || ( presets[i].avail ) ) {
|
|
Packit |
577717 |
*EventCode = i | PAPI_PRESET_MASK;
|
|
Packit |
577717 |
if ( presets[i].event_name != NULL )
|
|
Packit |
577717 |
return ( PAPI_OK );
|
|
Packit |
577717 |
else
|
|
Packit |
577717 |
return ( PAPI_ENOEVNT );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
return ( PAPI_ENOEVNT );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
static int
|
|
Packit |
577717 |
PAPIvi_get_event_info( int EventCode, PAPI_event_info_t * info )
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
int i;
|
|
Packit |
577717 |
const PAPI_preset_info_t *info2 = PAPI_query_all_events_verbose( );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
i = EventCode & PAPI_PRESET_AND_MASK;
|
|
Packit |
577717 |
if ( ( i >= PAPI_MAX_PRESET_EVENTS ) || ( info2[i].event_name == NULL ) )
|
|
Packit |
577717 |
return ( PAPI_ENOTPRESET );
|
|
Packit |
577717 |
|
|
Packit |
577717 |
info->event_code = info2[i].event_code;
|
|
Packit |
577717 |
info->count = info2[i].avail;
|
|
Packit |
577717 |
if ( info2[i].flags & PAPI_DERIVED ) {
|
|
Packit |
577717 |
info->count++;
|
|
Packit |
577717 |
strcpy( info->derived, "DERIVED" );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
if ( info2[i].event_name == NULL )
|
|
Packit |
577717 |
info->symbol[0] = 0;
|
|
Packit |
577717 |
else
|
|
Packit |
577717 |
strcpy( info->symbol, info2[i].event_name );
|
|
Packit |
577717 |
if ( info2[i].event_label == NULL )
|
|
Packit |
577717 |
info->short_descr[0] = 0;
|
|
Packit |
577717 |
else
|
|
Packit |
577717 |
strcpy( info->short_descr, info2[i].event_label );
|
|
Packit |
577717 |
if ( info2[i].event_descr == NULL )
|
|
Packit |
577717 |
info->long_descr[0] = 0;
|
|
Packit |
577717 |
else
|
|
Packit |
577717 |
strcpy( info->long_descr, info2[i].event_descr );
|
|
Packit |
577717 |
if ( info2[i].event_note == NULL )
|
|
Packit |
577717 |
info->note[0] = 0;
|
|
Packit |
577717 |
else
|
|
Packit |
577717 |
strcpy( info->note, info2[i].event_note );
|
|
Packit |
577717 |
return ( PAPI_OK );
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
static int PAPI_get_multiplex(int EventSet)
|
|
Packit |
577717 |
{
|
|
Packit |
577717 |
PAPI_option_t popt;
|
|
Packit |
577717 |
int retval;
|
|
Packit |
577717 |
|
|
Packit |
577717 |
popt.multiplex.eventset = EventSet;
|
|
Packit |
577717 |
retval = PAPI_get_opt(PAPI_GET_MULTIPLEX, &popt;;
|
|
Packit |
577717 |
if (retval < 0)
|
|
Packit |
577717 |
retval = 0;
|
|
Packit |
577717 |
return retval;
|
|
Packit |
577717 |
}
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* New Unsupported Functions */
|
|
Packit |
577717 |
#define PAPIvi_get_shared_lib_info \
|
|
Packit |
577717 |
PAPI_get_shared_lib_info
|
|
Packit |
577717 |
#define PAPIvi_get_thr_specific(tag, ptr) \
|
|
Packit |
577717 |
PAPI_get_thr_specific(tag, ptr)
|
|
Packit |
577717 |
#define PAPIvi_num_events(EventSet) \
|
|
Packit |
577717 |
PAPI_num_events(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_register_thread \
|
|
Packit |
577717 |
PAPI_register_thread
|
|
Packit |
577717 |
#define PAPIvi_set_thr_specific(tag, ptr) \
|
|
Packit |
577717 |
PAPI_set_thr_specific(tag, ptr)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Over half of the functions in the Low Level API remain unchanged
|
|
Packit |
577717 |
* These are included in the macro list in case they do change in future
|
|
Packit |
577717 |
* revisions, and to simplify the naming conventions for writing
|
|
Packit |
577717 |
* version independent PAPI code.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPIvi_accum(EventSet, values) \
|
|
Packit |
577717 |
PAPI_accum(EventSet, values)
|
|
Packit |
577717 |
#define PAPIvi_create_eventset(EventSet) \
|
|
Packit |
577717 |
PAPI_create_eventset(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_destroy_eventset(EventSet) \
|
|
Packit |
577717 |
PAPI_destroy_eventset(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_event_code_to_name(EventCode, out) \
|
|
Packit |
577717 |
PAPI_event_code_to_name(EventCode, out)
|
|
Packit |
577717 |
#define PAPIvi_event_name_to_code(in, out) \
|
|
Packit |
577717 |
PAPI_event_name_to_code(in, out)
|
|
Packit |
577717 |
#define PAPIvi_get_dmem_info(option) \
|
|
Packit |
577717 |
PAPI_get_dmem_info(option)
|
|
Packit |
577717 |
#define PAPIvi_get_opt(option, ptr) \
|
|
Packit |
577717 |
PAPI_get_opt(option, ptr)
|
|
Packit |
577717 |
#define PAPIvi_get_real_cyc \
|
|
Packit |
577717 |
PAPI_get_real_cyc
|
|
Packit |
577717 |
#define PAPIvi_get_real_usec \
|
|
Packit |
577717 |
PAPI_get_real_usec
|
|
Packit |
577717 |
#define PAPIvi_get_virt_cyc \
|
|
Packit |
577717 |
PAPI_get_virt_cyc
|
|
Packit |
577717 |
#define PAPIvi_get_virt_usec \
|
|
Packit |
577717 |
PAPI_get_virt_usec
|
|
Packit |
577717 |
#define PAPIvi_library_init(version) \
|
|
Packit |
577717 |
PAPI_library_init(version)
|
|
Packit |
577717 |
#define PAPIvi_list_events(EventSet, Events, number) \
|
|
Packit |
577717 |
PAPI_list_events(EventSet, Events, number)
|
|
Packit |
577717 |
#define PAPIvi_multiplex_init \
|
|
Packit |
577717 |
PAPI_multiplex_init
|
|
Packit |
577717 |
#define PAPIvi_num_hwctrs \
|
|
Packit |
577717 |
PAPI_num_hwctrs
|
|
Packit |
577717 |
#define PAPIvi_overflow(EventSet, EventCode, threshold, flags, handler) \
|
|
Packit |
577717 |
PAPI_overflow(EventSet, EventCode, threshold, flags, handler)
|
|
Packit |
577717 |
#define PAPIvi_perror( s ) \
|
|
Packit |
577717 |
PAPI_perror( s )
|
|
Packit |
577717 |
#define PAPIvi_query_event(EventCode) \
|
|
Packit |
577717 |
PAPI_query_event(EventCode)
|
|
Packit |
577717 |
#define PAPIvi_read(EventSet, values) \
|
|
Packit |
577717 |
PAPI_read(EventSet, values)
|
|
Packit |
577717 |
#define PAPIvi_reset(EventSet) \
|
|
Packit |
577717 |
PAPI_reset(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_set_debug(level) \
|
|
Packit |
577717 |
PAPI_set_debug(level)
|
|
Packit |
577717 |
#define PAPIvi_set_domain(domain) \
|
|
Packit |
577717 |
PAPI_set_domain(domain)
|
|
Packit |
577717 |
#define PAPIvi_set_granularity(granularity) \
|
|
Packit |
577717 |
PAPI_set_granularity(granularity)
|
|
Packit |
577717 |
#define PAPIvi_set_opt(option, ptr) \
|
|
Packit |
577717 |
PAPI_set_opt(option, ptr)
|
|
Packit |
577717 |
#define PAPIvi_shutdown \
|
|
Packit |
577717 |
PAPI_shutdown
|
|
Packit |
577717 |
#define PAPIvi_sprofil(prof, profcnt, EventSet, EventCode, threshold, flags) \
|
|
Packit |
577717 |
PAPI_sprofil(prof, profcnt, EventSet, EventCode, threshold, flags)
|
|
Packit |
577717 |
#define PAPIvi_start(EventSet) \
|
|
Packit |
577717 |
PAPI_start(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_state(EventSet, status) \
|
|
Packit |
577717 |
PAPI_state(EventSet, status)
|
|
Packit |
577717 |
#define PAPIvi_stop(EventSet, values) \
|
|
Packit |
577717 |
PAPI_stop(EventSet, values)
|
|
Packit |
577717 |
#define PAPIvi_strerror(err) \
|
|
Packit |
577717 |
PAPI_strerror(err)
|
|
Packit |
577717 |
#define PAPIvi_thread_id \
|
|
Packit |
577717 |
PAPI_thread_id
|
|
Packit |
577717 |
#define PAPIvi_write(EventSet, values) \
|
|
Packit |
577717 |
PAPI_write(EventSet, values)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* Of the nine functions deprecated from PAPI 2 to PAPI 3,
|
|
Packit |
577717 |
* three (PAPI_add_pevent, PAPI_restore, and PAPI_save) were
|
|
Packit |
577717 |
* never implemented, and four dealt with describing events.
|
|
Packit |
577717 |
* Two remain:
|
|
Packit |
577717 |
* PAPI_get_overflow_address() must still be used in version specific overflow handlers
|
|
Packit |
577717 |
* PAPI_profil_hw() was rarely used, and only on platforms supporting hardware overflow.
|
|
Packit |
577717 |
* The prototypes of these functions are shown below for completeness.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
int PAPI_add_pevent(int *EventSet, int code, void *inout);
|
|
Packit |
577717 |
void *PAPI_get_overflow_address(void *context);
|
|
Packit |
577717 |
int PAPI_profil_hw(unsigned short *buf, unsigned bufsiz, unsigned long offset, \
|
|
Packit |
577717 |
unsigned scale, int EventSet, int EventCode, int threshold, int flags);
|
|
Packit |
577717 |
const PAPI_preset_info_t *PAPI_query_all_events_verbose(void);
|
|
Packit |
577717 |
int PAPI_describe_event(char *name, int *EventCode, char *description);
|
|
Packit |
577717 |
int PAPI_label_event(int EventCode, char *label);
|
|
Packit |
577717 |
int PAPI_query_event_verbose(int EventCode, PAPI_preset_info_t *info);
|
|
Packit |
577717 |
int PAPI_restore(void);
|
|
Packit |
577717 |
int PAPI_save(void);
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* The High Level API
|
|
Packit |
577717 |
* There are 8 functions in this API.
|
|
Packit |
577717 |
* 6 are unchanged, and 2 are new.
|
|
Packit |
577717 |
* Of the new functions, one is emulated and one is unsupported.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* Unchanged Functions */
|
|
Packit |
577717 |
#define PAPIvi_accum_counters(values, array_len) \
|
|
Packit |
577717 |
PAPI_accum_counters(values, array_len)
|
|
Packit |
577717 |
#define PAPIvi_num_counters \
|
|
Packit |
577717 |
PAPI_num_counters
|
|
Packit |
577717 |
#define PAPIvi_read_counters(values, array_len) \
|
|
Packit |
577717 |
PAPI_read_counters(values, array_len)
|
|
Packit |
577717 |
#define PAPIvi_start_counters(Events, array_len) \
|
|
Packit |
577717 |
PAPI_start_counters(Events, array_len)
|
|
Packit |
577717 |
#define PAPIvi_stop_counters(values, array_len) \
|
|
Packit |
577717 |
PAPI_stop_counters(values, array_len)
|
|
Packit |
577717 |
#define PAPIvi_flops(rtime, ptime, flpops, mflops) \
|
|
Packit |
577717 |
PAPI_flops(rtime, ptime, flpops, mflops)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* New Supported Functions */
|
|
Packit |
577717 |
#define PAPIvi_flips(rtime, ptime, flpins, mflips) \
|
|
Packit |
577717 |
PAPI_flops(rtime, ptime, flpins, mflips)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* New Unupported Functions */
|
|
Packit |
577717 |
#define PAPIvi_ipc(rtime, ptime, ins, ipc) \
|
|
Packit |
577717 |
PAPI_ipc(rtime, ptime, ins, ipc)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*******************************************************************************
|
|
Packit |
577717 |
* If PAPI_VERSION is defined, and the MAJOR version number is 3,
|
|
Packit |
577717 |
* then papi.h is for PAPI 3.
|
|
Packit |
577717 |
* The preprocessor block below contains definitions and macros needed to
|
|
Packit |
577717 |
* allow version independent linking to the PAPI 3 library.
|
|
Packit |
577717 |
* Other than a handful of definitions to support calls to PAPI_{get,set}_opt(),
|
|
Packit |
577717 |
* this layer simply converts version independent names to PAPI 3 library calls.
|
|
Packit |
577717 |
********************************************************************************/
|
|
Packit |
577717 |
#elif (PAPI_VERSION_MAJOR(PAPI_VERSION) == 3)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* The following option definitions reflect the fact that PAPI 2 had separate
|
|
Packit |
577717 |
* definitions for options to PAPI_set_opt and PAPI_get_opt, while PAPI 3 has
|
|
Packit |
577717 |
* only a single set for both. By using the older naming convention, you can
|
|
Packit |
577717 |
* create platform independent code for these calls.
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_DEBUG PAPI_DEBUG
|
|
Packit |
577717 |
#define PAPI_GET_DEBUG PAPI_DEBUG
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_MULTIPLEX PAPI_MULTIPLEX
|
|
Packit |
577717 |
#define PAPI_GET_MULTIPLEX PAPI_MULTIPLEX
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_DEFDOM PAPI_DEFDOM
|
|
Packit |
577717 |
#define PAPI_GET_DEFDOM PAPI_DEFDOM
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_DOMAIN PAPI_DOMAIN
|
|
Packit |
577717 |
#define PAPI_GET_DOMAIN PAPI_DOMAIN
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_DEFGRN PAPI_DEFGRN
|
|
Packit |
577717 |
#define PAPI_GET_DEFGRN PAPI_DEFGRN
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_GRANUL PAPI_GRANUL
|
|
Packit |
577717 |
#define PAPI_GET_GRANUL PAPI_GRANUL
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_INHERIT PAPI_INHERIT
|
|
Packit |
577717 |
#define PAPI_GET_INHERIT PAPI_INHERIT
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_GET_NUMCTRS PAPI_NUMCTRS
|
|
Packit |
577717 |
#define PAPI_SET_NUMCTRS PAPI_NUMCTRS
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPI_SET_PROFIL PAPI_PROFIL
|
|
Packit |
577717 |
#define PAPI_GET_PROFIL PAPI_PROFIL
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* These macros are simple pass-throughs to PAPI 3 structures
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
#define PAPIvi_hw_info_t PAPI_hw_info_t
|
|
Packit |
577717 |
#define PAPIvi_exe_info_t PAPI_exe_info_t
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*
|
|
Packit |
577717 |
* The following macros are simple pass-throughs to PAPI 3 library calls
|
|
Packit |
577717 |
*/
|
|
Packit |
577717 |
/* The Low Level API */
|
|
Packit |
577717 |
#define PAPIvi_accum(EventSet, values) \
|
|
Packit |
577717 |
PAPI_accum(EventSet, values)
|
|
Packit |
577717 |
#define PAPIvi_add_event(EventSet, Event) \
|
|
Packit |
577717 |
PAPI_add_event(EventSet, Event)
|
|
Packit |
577717 |
#define PAPIvi_add_events(EventSet, Events, number) \
|
|
Packit |
577717 |
PAPI_add_events(EventSet, Events, number)
|
|
Packit |
577717 |
#define PAPIvi_cleanup_eventset(EventSet) \
|
|
Packit |
577717 |
PAPI_cleanup_eventset(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_create_eventset(EventSet) \
|
|
Packit |
577717 |
PAPI_create_eventset(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_destroy_eventset(EventSet) \
|
|
Packit |
577717 |
PAPI_destroy_eventset(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_enum_event(EventCode, modifier) \
|
|
Packit |
577717 |
PAPI_enum_event(EventCode, modifier)
|
|
Packit |
577717 |
#define PAPIvi_event_code_to_name(EventCode, out) \
|
|
Packit |
577717 |
PAPI_event_code_to_name(EventCode, out)
|
|
Packit |
577717 |
#define PAPIvi_event_name_to_code(in, out) \
|
|
Packit |
577717 |
PAPI_event_name_to_code(in, out)
|
|
Packit |
577717 |
#define PAPIvi_get_dmem_info(option) \
|
|
Packit |
577717 |
PAPI_get_dmem_info(option)
|
|
Packit |
577717 |
#define PAPIvi_get_event_info(EventCode, info) \
|
|
Packit |
577717 |
PAPI_get_event_info(EventCode, info)
|
|
Packit |
577717 |
#define PAPIvi_get_executable_info \
|
|
Packit |
577717 |
PAPI_get_executable_info
|
|
Packit |
577717 |
#define PAPIvi_get_hardware_info \
|
|
Packit |
577717 |
PAPI_get_hardware_info
|
|
Packit |
577717 |
#define PAPIvi_get_multiplex(EventSet) \
|
|
Packit |
577717 |
PAPI_get_multiplex(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_get_opt(option, ptr) \
|
|
Packit |
577717 |
PAPI_get_opt(option, ptr)
|
|
Packit |
577717 |
#define PAPIvi_get_real_cyc \
|
|
Packit |
577717 |
PAPI_get_real_cyc
|
|
Packit |
577717 |
#define PAPIvi_get_real_usec \
|
|
Packit |
577717 |
PAPI_get_real_usec
|
|
Packit |
577717 |
#define PAPIvi_get_shared_lib_info \
|
|
Packit |
577717 |
PAPI_get_shared_lib_info
|
|
Packit |
577717 |
#define PAPIvi_get_thr_specific(tag, ptr) \
|
|
Packit |
577717 |
PAPI_get_thr_specific(tag, ptr)
|
|
Packit |
577717 |
#define PAPIvi_get_virt_cyc \
|
|
Packit |
577717 |
PAPI_get_virt_cyc
|
|
Packit |
577717 |
#define PAPIvi_get_virt_usec \
|
|
Packit |
577717 |
PAPI_get_virt_usec
|
|
Packit |
577717 |
#define PAPIvi_is_initialized \
|
|
Packit |
577717 |
PAPI_is_initialized
|
|
Packit |
577717 |
#define PAPIvi_library_init(version) \
|
|
Packit |
577717 |
PAPI_library_init(version)
|
|
Packit |
577717 |
#define PAPIvi_list_events(EventSet, Events, number) \
|
|
Packit |
577717 |
PAPI_list_events(EventSet, Events, number)
|
|
Packit |
577717 |
#define PAPIvi_lock(lck) \
|
|
Packit |
577717 |
PAPI_lock(lck)
|
|
Packit |
577717 |
#define PAPIvi_multiplex_init \
|
|
Packit |
577717 |
PAPI_multiplex_init
|
|
Packit |
577717 |
#define PAPIvi_num_hwctrs \
|
|
Packit |
577717 |
PAPI_num_hwctrs
|
|
Packit |
577717 |
#define PAPIvi_num_events(EventSet) \
|
|
Packit |
577717 |
PAPI_num_events(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_overflow(EventSet, EventCode, threshold, flags, handler) \
|
|
Packit |
577717 |
PAPI_overflow(EventSet, EventCode, threshold, flags, handler)
|
|
Packit |
577717 |
#define PAPIvi_perror( s ) \
|
|
Packit |
577717 |
PAPI_perror( s )
|
|
Packit |
577717 |
#define PAPIvi_profil(buf, bufsiz, offset, scale, EventSet, EventCode, threshold, flags) \
|
|
Packit |
577717 |
PAPI_profil(buf, bufsiz, offset, scale, EventSet, EventCode, threshold, flags)
|
|
Packit |
577717 |
#define PAPIvi_query_event(EventCode) \
|
|
Packit |
577717 |
PAPI_query_event(EventCode)
|
|
Packit |
577717 |
#define PAPIvi_read(EventSet, values) \
|
|
Packit |
577717 |
PAPI_read(EventSet, values)
|
|
Packit |
577717 |
#define PAPIvi_register_thread \
|
|
Packit |
577717 |
PAPI_register_thread
|
|
Packit |
577717 |
#define PAPIvi_remove_event(EventSet, EventCode) \
|
|
Packit |
577717 |
PAPI_remove_event(EventSet, EventCode)
|
|
Packit |
577717 |
#define PAPIvi_remove_events(EventSet, Events, number) \
|
|
Packit |
577717 |
PAPI_remove_events(EventSet, Events, number)
|
|
Packit |
577717 |
#define PAPIvi_reset(EventSet) \
|
|
Packit |
577717 |
PAPI_reset(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_set_debug(level) \
|
|
Packit |
577717 |
PAPI_set_debug(level)
|
|
Packit |
577717 |
#define PAPIvi_set_domain(domain) \
|
|
Packit |
577717 |
PAPI_set_domain(domain)
|
|
Packit |
577717 |
#define PAPIvi_set_granularity(granularity) \
|
|
Packit |
577717 |
PAPI_set_granularity(granularity)
|
|
Packit |
577717 |
#define PAPIvi_set_multiplex(EventSet) \
|
|
Packit |
577717 |
PAPI_set_multiplex(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_set_opt(option, ptr) \
|
|
Packit |
577717 |
PAPI_set_opt(option, ptr)
|
|
Packit |
577717 |
#define PAPIvi_set_thr_specific(tag, ptr) \
|
|
Packit |
577717 |
PAPI_set_thr_specific(tag, ptr)
|
|
Packit |
577717 |
#define PAPIvi_shutdown \
|
|
Packit |
577717 |
PAPI_shutdown
|
|
Packit |
577717 |
#define PAPIvi_sprofil(prof, profcnt, EventSet, EventCode, threshold, flags) \
|
|
Packit |
577717 |
PAPI_sprofil(prof, profcnt, EventSet, EventCode, threshold, flags)
|
|
Packit |
577717 |
#define PAPIvi_start(EventSet) \
|
|
Packit |
577717 |
PAPI_start(EventSet)
|
|
Packit |
577717 |
#define PAPIvi_state(EventSet, status) \
|
|
Packit |
577717 |
PAPI_state(EventSet, status)
|
|
Packit |
577717 |
#define PAPIvi_stop(EventSet, values) \
|
|
Packit |
577717 |
PAPI_stop(EventSet, values)
|
|
Packit |
577717 |
#define PAPIvi_strerror(err) \
|
|
Packit |
577717 |
PAPI_strerror(err)
|
|
Packit |
577717 |
#define PAPIvi_thread_id \
|
|
Packit |
577717 |
PAPI_thread_id
|
|
Packit |
577717 |
#define PAPIvi_thread_init(id_fn) \
|
|
Packit |
577717 |
PAPI_thread_init(id_fn)
|
|
Packit |
577717 |
#define PAPIvi_unlock(lck) \
|
|
Packit |
577717 |
PAPI_unlock(lck)
|
|
Packit |
577717 |
#define PAPIvi_write(EventSet, values) \
|
|
Packit |
577717 |
PAPI_write(EventSet, values)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/* The High Level API */
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#define PAPIvi_accum_counters(values, array_len) \
|
|
Packit |
577717 |
PAPI_accum_counters(values, array_len)
|
|
Packit |
577717 |
#define PAPIvi_num_counters \
|
|
Packit |
577717 |
PAPI_num_counters
|
|
Packit |
577717 |
#define PAPIvi_read_counters(values, array_len) \
|
|
Packit |
577717 |
PAPI_read_counters(values, array_len)
|
|
Packit |
577717 |
#define PAPIvi_start_counters(Events, array_len) \
|
|
Packit |
577717 |
PAPI_start_counters(Events, array_len)
|
|
Packit |
577717 |
#define PAPIvi_stop_counters(values, array_len) \
|
|
Packit |
577717 |
PAPI_stop_counters(values, array_len)
|
|
Packit |
577717 |
#define PAPIvi_flips(rtime, ptime, flpins, mflips) \
|
|
Packit |
577717 |
PAPI_flips(rtime, ptime, flpins, mflips)
|
|
Packit |
577717 |
#define PAPIvi_flops(rtime, ptime, flpops, mflops) \
|
|
Packit |
577717 |
PAPI_flops(rtime, ptime, flpops, mflops)
|
|
Packit |
577717 |
#define PAPIvi_ipc(rtime, ptime, ins, ipc) \
|
|
Packit |
577717 |
PAPI_ipc(rtime, ptime, ins, ipc)
|
|
Packit |
577717 |
|
|
Packit |
577717 |
|
|
Packit |
577717 |
/*******************************************************************************
|
|
Packit |
577717 |
* If PAPI_VERSION is defined, and the MAJOR version number is not 3, then we
|
|
Packit |
577717 |
* generate an error message.
|
|
Packit |
577717 |
* This block allows us to support future version with a
|
|
Packit |
577717 |
* version independent syntax.
|
|
Packit |
577717 |
********************************************************************************/
|
|
Packit |
577717 |
#else
|
|
Packit |
577717 |
#error Compiling against a not yet released PAPI version
|
|
Packit |
577717 |
#endif
|
|
Packit |
577717 |
|
|
Packit |
577717 |
#endif /* _PAPIVI */
|