49#pragma weak pthread_once
60typedef struct _RateInfo
77 long long *
values,
long long *ins,
float *rate,
int mode );
89 fprintf(
stderr,
"PAPI Error: PAPI_library_init failed with return value %d.\n",
retval);
93 fprintf(
stderr,
"PAPI Error: PAPI_thread_init failed with return value %d.\n",
retval);
94 fprintf(
stderr,
"PAPI Error: PAPI could not be initiated!\n");
107 if ( pthread_once ) {
185PAPI_flips_rate(
int event,
float *rtime,
float *ptime,
long long *flpins,
float *mflips )
195 if ( rtime == NULL || ptime == NULL ||
196 flpins == NULL || mflips == NULL ) {
250PAPI_flops_rate(
int event,
float *rtime,
float *ptime,
long long *flpops,
float *mflops )
260 if ( rtime == NULL || ptime == NULL ||
261 flpops == NULL || mflops == NULL ) {
313PAPI_ipc(
float *rtime,
float *ptime,
long long *ins,
float *ipc )
315 long long values[2] = { 0, 0 };
319 if ( rtime == NULL || ptime == NULL || ins == NULL || ipc == NULL )
377PAPI_epc(
int event,
float *rtime,
float *ptime,
long long *ref,
long long *core,
long long *evt,
float *epc )
379 long long values[3] = { 0, 0, 0 };
383 if ( rtime == NULL || ptime == NULL || ref == NULL ||core == NULL || evt == NULL || epc == NULL )
387 if (event != 0 )
events[0] = event;
418 long long tmp_values[3];
468 long long *
values,
long long *ins,
float *rate,
int mode )
521 long long tmp_values[3];
563 *rate = (float) ((
float)
values[0] / (float) (
values[1]));
592#define papi_return(a) do { \
595 _papi_hwi_errno = b;\
597 APIDBG("EXIT: return: %d\n", b);\
598 return((_papi_hwi_debug_handler ? _papi_hwi_debug_handler(b) : b)); \
601#define papi_return(a) do { \
604 _papi_hwi_errno = b;\
606 APIDBG("EXIT: return: %d\n", b);\
836 if ( ( number == NULL ) || ( tids && ( *number <= 0 ) ) )
839 memset( &
tmp, 0x0,
sizeof (
tmp ) );
924 *ptr =
thread->thread_storage[tag];
993 thread->thread_storage[tag] = ptr;
1052 static int _in_papi_library_init_cnt = 0;
1061 ++_in_papi_library_init_cnt;
1062 while ( _in_papi_library_init_cnt > 1 ) {
1063 PAPIERROR(
"Multiple callers of PAPI_library_init" );
1071 APIDBG(
"Initializing library: current PID %d, old PID %d\n",
1081 if ( getenv(
"PAPI_ALLOW_STOLEN" ) ) {
1085 sprintf(
buf,
"%s=%s",
"PAPI_ALLOW_STOLEN",
"stolen" );
1094 _in_papi_library_init_cnt--;
1101 APIDBG(
"system_info was initialized, but init did not succeed\n" );
1104 var = (
char * ) getenv(
"PAPI_DEBUG" );
1107 if ( var != NULL ) {
1108 if ( strlen( var ) != 0 ) {
1109 if ( strstr( var,
"SUBSTRATE" ) )
1111 if ( strstr( var,
"API" ) )
1113 if ( strstr( var,
"INTERNAL" ) )
1115 if ( strstr( var,
"THREADS" ) )
1117 if ( strstr( var,
"MULTIPLEX" ) )
1119 if ( strstr( var,
"OVERFLOW" ) )
1121 if ( strstr( var,
"PROFILE" ) )
1123 if ( strstr( var,
"MEMORY" ) )
1125 if ( strstr( var,
"LEAK" ) )
1127 if ( strstr( var,
"HIGHLEVEL" ) )
1129 if ( strstr( var,
"ALL" ) )
1141 _in_papi_library_init_cnt--;
1150 _in_papi_library_init_cnt--;
1166 _in_papi_library_init_cnt--;
1176 _in_papi_library_init_cnt--;
1186 _in_papi_library_init_cnt--;
1191 _in_papi_library_init_cnt--;
1240 APIDBG(
"Entry: EventCode: %#x\n", EventCode);
1254 ( (
unsigned int ) EventCode ) );
1352 APIDBG(
"Entry: Component Index %d\n",
cidx);
1391 APIDBG(
"Entry: EventCode: 0x%x, info: %p\n", EventCode, info);
1406 ( (
unsigned int ) EventCode, info ) );
1471 APIDBG(
"Entry: EventCode: %#x, out: %p\n", EventCode, out);
1560 APIDBG(
"Entry: in: %p, name: %s, out: %p\n", in, in, out);
1563 if ( ( in == NULL ) || ( out == NULL ) )
1571 if (strncmp(in,
"PAPI_", 5) == 0) {
1583 APIDBG(
"&user_defined_events[%d]: %p, user_defined_events[%d].symbol: %s, user_defined_events[%d].count: %d\n",
1708 APIDBG(
"Entry: EventCode: %#x, modifier: %d\n", *EventCode, modifier);
1724 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
1730 APIDBG(
"EXIT: PAPI_ENOEVNT\n");
1738 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
1762 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
1768 APIDBG(
"EXIT: PAPI_ENOEVNT\n");
1773 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
1781 APIDBG(
"EXIT: PAPI_ENOEVNT\n");
1787 APIDBG(
"EXIT: PAPI_ENOEVNT\n");
1793 APIDBG(
"EXIT: PAPI_ENOEVNT\n");
1798 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
1913 APIDBG(
"Entry: EventCode: %#x, modifier: %d, cidx: %d\n", *EventCode, modifier,
cidx);
1931 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
1937 APIDBG(
"EXIT: PAPI_ENOEVNT\n");
1945 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
1968 APIDBG(
"EXIT: *EventCode: %#x\n", *EventCode);
2222 APIDBG(
"Entry: EventSet: %d, EventCode: %#x\n",
EventSet, EventCode);
2317 APIDBG(
"Entry: EventSet: %d, EventCode: %#x\n",
EventSet, EventCode);
2437 APIDBG(
"Entry: EventSet: %d, EventName: %s\n",
EventSet, EventName);
2443 APIDBG(
"EXIT: return: %d\n", ret);
2448 APIDBG(
"EXIT: return: %d\n", ret);
2522 APIDBG(
"Entry: EventSet: %d, EventName: %s\n",
EventSet, EventName);
2668 if ( ESI == NULL ) {
2672 APIDBG(
"EventSet: %p\n", ESI);
2690 APIDBG(
"Thread Running already (Only one active Eventset per component)\n");
3401 sizeof (
long long ) );
3618 if ( status == NULL )
3629 *status = ESI->
state;
3687 APIDBG(
"Entry: level: %d\n", level);
3690 memset( &option, 0x0,
sizeof ( option ) );
3700 APIDBG(
"Entry: option: %d, EventSet: %d, tid: %lu\n", option,
EventSet, tid);
3916 memset( &mpx, 0x0,
sizeof ( mpx ) );
4026 APIDBG(
"Entry: option: %d, ptr: %p\n", option, ptr);
4115 if ( internal.
cpu.
ESI == NULL )
4333 if ( grn & ~
_papi_hwd[
cidx]->cmp_info.available_granularities )
4337 if ( grn ^ ( 1 << ( ffs( grn ) - 1 ) ) )
4362 if ( grn & ~
_papi_hwd[
cidx]->cmp_info.available_granularities )
4366 if ( grn ^ ( 1 << ( ffs( grn ) - 1 ) ) )
4704 APIDBG(
"Entry: option: %d, ptr: %p\n", option, ptr);
4897 APIDBG(
"Entry: option: %d, ptr: %p, cidx: %d\n", option, ptr,
cidx);
5051 if ( ESI->
master == master ) {
5223 fprintf(
stderr,
"%s: ", msg );
5225 fprintf(
stderr,
"%s\n", foo );
5356 if ( ESI == NULL ) {
5363 OVFDBG(
"Component Error\n");
5368 OVFDBG(
"Already running\n");
5378 OVFDBG(
"CPU attached\n");
5383 (
unsigned int ) EventCode ) ) < 0 ) {
5388 OVFDBG(
"Threshold below zero\n");
5398 OVFDBG(
"Derived event in overflow\n");
5406 OVFDBG(
"NULL handler\n");
5410 OVFDBG(
"Zero threshold\n");
5427 while ( i < ESI->overflow.event_counter - 1 ) {
5488 APIDBG(
"Overflow using: %s\n",
5605 int EventCode,
int threshold,
int flags )
5607 APIDBG(
"Entry: prof: %p, profcnt: %d, EventSet: %d, EventCode: %#x, threshold: %d, flags: %#x\n", prof, profcnt,
EventSet, EventCode,
threshold, flags);
5609 int retval, index,
i, buckets;
5615 if ( ESI == NULL ) {
5642 (
unsigned int) EventCode ) ) < 0 ) {
5655 if ( prof == NULL ) {
5667 for(
i = 0;
i < profcnt;
i++ ) {
5668 if ( !( ( prof[
i].pr_scale == 131072 ) ||
5669 ( ( prof[
i].pr_scale <= 65536 && prof[
i].pr_scale > 1 ) ) ) ) {
5670 APIDBG(
"Improper scale factor: %d\n", prof[
i].pr_scale );
5706 while ( i < ESI->profile.event_counter - 1 ) {
6002 APIDBG(
"Entry: buf: %p, bufsiz: %d, offset: %p, scale: %u, EventSet: %d, EventCode: %#x, threshold: %d, flags: %#x\n",
buf, bufsiz, offset, scale,
EventSet, EventCode,
threshold, flags);
6186 memset( &ptr, 0,
sizeof ( ptr ) );
6322 memset( &ptr, 0,
sizeof ( ptr ) );
6405 APIDBG(
"Entry: EventSet: %d, Events: %p, number: %d\n",
EventSet, Events, number);
6408 if ( ( Events == NULL ) || ( number <= 0 ) )
6411 for (
i = 0;
i < number;
i++ ) {
6493 APIDBG(
"Entry: EventSet: %d, Events: %p, number: %d\n",
EventSet, Events, number);
6496 if ( ( Events == NULL ) || ( number <= 0 ) )
6499 for (
i = 0;
i < number;
i++ ) {
6563 APIDBG(
"Entry: EventSet: %d, Events: %p, number: %p\n",
EventSet, Events, number);
6570 if ( ( Events == NULL ) && ( *number > 0 ) )
6577 if ( ( Events == NULL ) || ( *number == 0 ) ) {
6679 memset( &ptr, 0,
sizeof ( ptr ) );
6709 memset( &ptr, 0,
sizeof ( ptr ) );
6750 memset( &ptr, 0,
sizeof ( ptr ) );
7078 int *
array,
int *number )
7080 APIDBG(
"Entry: EventSet: %d, overflow_vector: %lld, array: %p, number: %p\n",
EventSet, overflow_vector,
array, number);
7082 int set_bit, j, pos;
7085 if ( overflow_vector == (
long long ) 0 )
7088 if ( (
array == NULL ) || ( number == NULL ) )
7102 while ( ( set_bit = ffsll( overflow_vector ) ) ) {
7104 overflow_vector ^= (
long long ) 1 << set_bit;
7106 for ( k = 0, pos = 0; k < PAPI_EVENTS_IN_DERIVED_EVENT && pos >= 0; k++ ) {
7108 if ( ( set_bit == pos ) &&
7112 if (
count == *number )
7145 APIDBG(
"Entry: EventCode: %#x\n", EventCode);
7242 "Disabled by PAPI_disable_component()");
static papi_handle_t handle
int _papi_hwi_init_os(void)
PAPI_os_info_t _papi_os_info
papi_os_vector_t _papi_os_vector
Accumulate and reset counters in an EventSet.
add PAPI preset or native hardware event to an event set
add multiple PAPI presets or native hardware events to an event set
add PAPI preset or native hardware event by name to an EventSet
Assign a component index to an existing but empty EventSet.
Attach PAPI event set to the specified thread id.
Empty and destroy an EventSet.
Create a new empty PAPI EventSet.
Empty and destroy an EventSet.
Detach PAPI event set from previously specified thread id and restore to executing thread.
disables the named component
disables the specified component
Enumerate PAPI preset or native events for a given component.
returns handle of next device type
Enumerate PAPI preset or native events.
Simplified call to get arbitrary events per cycle, real and processor time.
Convert a numeric hardware event code to a name.
Convert a name to a numeric hardware event code.
Simplified call to get Mflips/s (floating point instruction rate), real and processor time.
Simplified call to get Mflops/s (floating point operation rate), real and processor time.
Get component specific PAPI options.
returns the component index for the named component
get information about a specific software component
returns device attributes
returns device type attributes
Get information about the dynamic memory usage of the current program.
return component an event belongs to
Get the event's name and description info.
return index for component an eventset is assigned to
Get the multiplexing status of specified event set.
Get PAPI library or event set options.
converts an overflow vector into an array of indexes to overflowing events
Retrieve a pointer to a thread specific data structure.
Stop a running high-level event set.
Simplified call to get instructions per cycle, real and processor time.
initialize the PAPI library.
list the events in an event set
List the registered thread ids.
Lock one of two mutex variables defined in papi.h.
Return the number of hardware counters for the specified component.
Return the number of events in an event set.
Set up an event set to begin registering overflows.
Produces a string on standard error, describing the last library error.
Generate a histogram of hardware counter overflows vs. PC addresses.
Query if PAPI event exists.
Query if a named PAPI event exists.
Read hardware counters with a timestamp.
Read hardware counters from an event set.
removes a hardware event from a PAPI event set.
Remove an array of hardware event codes from a PAPI event set.
removes a named hardware event from a PAPI event set.
Reset the hardware event counts in an event set.
Set the default counting domain for new event sets bound to the specified component.
Set the default counting granularity for eventsets bound to the specified component.
Set the current debug level for error output from PAPI.
Set the default counting domain for new event sets bound to the cpu component.
Set the default counting granularity for eventsets bound to the cpu component.
Convert a standard event set to a multiplexed event set.
Set PAPI library or event set options.
Store a pointer to a thread specific data structure.
Generate PC histogram data from multiple code regions where hardware counter overflow occurs.
Start counting hardware events in an event set.
Return the counting state of an EventSet.
Stop counting hardware events in an event set.
Returns a string describing the PAPI error code.
Initialize thread support in the PAPI library.
Unlock one of the mutex variables defined in papi.h.
Write counter values into counters.
struct papi_vectors * _papi_hwd[]
int _papi_hwi_lookup_or_create_cpu(CpuInfo_t **here, unsigned int cpu_num)
volatile int buf[CACHE_FLUSH_BUFFER_SIZE_INTS]
char * evt_name(evstock *stock, int index)
#define PAPI_MAX_MPX_CTRS
#define PAPI_INSTR_ADDRESS
#define PAPI_PROFIL_BUCKET_32
#define PAPI_LOW_LEVEL_INITED
#define PAPI_PROFIL_WEIGHTED
#define PAPI_THREAD_LEVEL_INITED
#define PAPI_PROFIL_POSIX
#define PAPI_PROFIL_BUCKET_16
#define PAPI_PROFIL_INST_EAR
#define PAPI_USER_EVENTS_FILE
#define PAPI_OVERFLOW_FORCE_SW
#define PAPI_MULTIPLEXING
#define PAPI_CPU_ATTACHED
#define PAPI_TLS_ALL_THREADS
#define PAPI_MULTIPLEX_FORCE_SW
#define PAPI_DATA_ADDRESS
#define PAPI_PROFIL_BUCKETS
#define PAPI_OVERFLOW_HARDWARE
#define PAPI_MULTIPLEX_DEFAULT
#define PAPI_PROFIL_FORCE_SW
#define PAPI_PROFIL_BUCKET_64
#define PAPI_COMPONENTINFO
#define PAPI_PROFIL_COMPRESS
#define PAPI_HUGE_STR_LEN
#define PAPI_PROFIL_RANDOM
#define PAPI_PROFIL_DATA_EAR
long long PAPI_get_virt_cyc(void)
long long PAPI_get_real_cyc(void)
int PAPI_register_thread(void)
int PAPI_num_components(void)
long long PAPI_get_virt_nsec(void)
int PAPI_is_initialized(void)
long long PAPI_get_real_nsec(void)
int PAPI_multiplex_init(void)
unsigned long PAPI_thread_id(void)
long long PAPI_get_virt_usec(void)
int PAPI_unregister_thread(void)
const PAPI_exe_info_t * PAPI_get_executable_info(void)
long long PAPI_get_real_usec(void)
const PAPI_shlib_info_t * PAPI_get_shared_lib_info(void)
const PAPI_hw_info_t * PAPI_get_hardware_info(void)
#define PAPI_DEF_ITIMER_NS
char events[MAX_EVENTS][BUFSIZ]
static long long values[NUM_EVENTS]
static double a[MATRIX_SIZE][MATRIX_SIZE]
static double b[MATRIX_SIZE][MATRIX_SIZE]
static double c[MATRIX_SIZE][MATRIX_SIZE]
#define PAPI_MAX_USER_EVENTS
#define PAPI_PRESET_AND_MASK
#define PAPI_MAX_PRESET_EVENTS
inline_static int _papi_set_attach(int option, int EventSet, unsigned long tid)
static int _rate_calls(float *real_time, float *proc_time, int *events, long long *values, long long *ins, float *rate, int mode)
THREAD_LOCAL_STORAGE_KEYWORD RateInfo * _rate_state
inline_static int valid_component(int cidx)
inline_static int valid_ESI_component(EventSetInfo_t *ESI)
bool _papi_rate_initiated
hwi_presets_t user_defined_events[PAPI_MAX_USER_EVENTS]
static int _start_new_rate_call(float *real_time, float *proc_time, int *events, int num_events, long long *ins, float *rate)
int PAPI_num_hwctrs(void)
static void _internal_papi_init(void)
int user_defined_events_count
static int _internal_check_rate_state()
static void _internal_onetime_papi_init(void)
Return codes and api definitions.
void(* PAPI_overflow_handler_t)(int EventSet, void *address, long long overflow_vector, void *context)
unsigned long PAPI_thread_id_t
#define IS_USER_DEFINED(EventCode)
#define IS_NATIVE(EventCode)
#define IS_PRESET(EventCode)
hwi_presets_t _papi_hwi_presets[PAPI_MAX_PRESET_EVENTS]
unsigned long int(* _papi_hwi_thread_id_fn)(void)
#define OVFDBG(format, args...)
#define APIDBG(format, args...)
int _papi_hwi_enum_dev_type(int enum_modifier, void **handle)
int _papi_hwi_get_user_event_info(int EventCode, PAPI_event_info_t *info)
int _papi_hwi_get_dev_type_attr(void *handle, PAPI_dev_type_attr_e attr, void *value)
int _papi_hwi_native_to_eventcode(int cidx, int event_code, int ntv_idx, const char *event_name)
int _papi_hwi_add_event(EventSetInfo_t *ESI, int EventCode)
void _papi_hwi_shutdown_global_internal(void)
int _papi_hwi_get_native_event_info(unsigned int EventCode, PAPI_event_info_t *info)
void _papi_hwi_free_EventSet(EventSetInfo_t *ESI)
void _papi_hwi_dummy_handler(int EventSet, void *address, long long overflow_vector, void *context)
void PAPIERROR(char *format,...)
THREAD_LOCAL_STORAGE_KEYWORD int _papi_hl_events_running
int _papi_hwi_is_sw_multiplex(EventSetInfo_t *ESI)
int _papi_hwi_native_code_to_name(unsigned int EventCode, char *hwi_name, int len)
void _papi_hwi_init_errors(void)
int _papi_hwi_eventcode_to_native(int event_code)
char * _papi_hwi_get_papi_event_string()
int _papi_hwi_error_level
void _papi_hwi_free_papi_event_string()
EventSetInfo_t * _papi_hwi_lookup_EventSet(int eventset)
int _papi_hwi_lookup_EventCodeIndex(const EventSetInfo_t *ESI, unsigned int EventCode)
int _papi_hwi_init_global(int PE_OR_PEU)
hwd_context_t * _papi_hwi_get_context(EventSetInfo_t *ESI, int *is_dirty)
int _papi_hwi_get_dev_attr(void *handle, int id, PAPI_dev_attr_e attr, void *value)
int _papi_hwi_init_global_internal(void)
PAPI_debug_handler_t _papi_hwi_debug_handler
int _papi_hwi_remove_EventSet(EventSetInfo_t *ESI)
int _papi_hwi_native_name_to_code(const char *in, int *out)
int _papi_hwi_create_eventset(int *EventSet, ThreadInfo_t *handle)
int _papi_hwi_component_index(int event_code)
int _papi_hwi_get_preset_event_info(int EventCode, PAPI_event_info_t *info)
int _papi_hwi_convert_eventset_to_multiplex(_papi_int_multiplex_t *mpx)
THREAD_LOCAL_STORAGE_KEYWORD int _papi_rate_events_running
int _papi_hwi_read(hwd_context_t *context, EventSetInfo_t *ESI, long long *values)
int _papi_hwi_assign_eventset(EventSetInfo_t *ESI, int cidx)
int _papi_hwi_remove_event(EventSetInfo_t *ESI, int EventCode)
int _papi_hwi_invalid_cmp(int cidx)
void _papi_hwi_set_papi_event_code(unsigned int event_code, int update_flag)
int _papi_hwi_cleanup_eventset(EventSetInfo_t *ESI)
int _papi_hwi_query_native_event(unsigned int EventCode)
void _papi_hwi_map_events_to_native(EventSetInfo_t *ESI)
#define PAPI_SHUTDOWN_SYNC_str
#define PAPI_SHUTDOWN_str
static double array[ARRAYSIZE]
void _papi_mem_cleanup_all()
papi_mdi_t _papi_hwi_system_info
static int attach(hwd_control_state_t *ctl, unsigned long tid)
void handler(int EventSet, void *address, long long overflow_vector, void *context)
EventSetInfo_t ** running_eventset
EventSetInfo_t ** dataSlotArray
int pos[PAPI_EVENTS_IN_DERIVED_EVENT]
EventSetInheritInfo_t inherit
EventSetMultiplexInfo_t multiplex
EventSetProfileInfo_t profile
struct _ThreadInfo * master
EventSetAttachInfo_t attach
struct _CpuInfo * CpuInfo
EventSetGranularityInfo_t granularity
EventInfo_t * EventInfoArray
hwd_control_state_t * ctl_state
NativeInfo_t * NativeInfoArray
EventSetOverflowInfo_t overflow
EventSetDomainInfo_t domain
PAPI_overflow_handler_t handler
char name[PAPI_MAX_STR_LEN]
PAPI_debug_handler_t handler
A pointer to the following is passed to PAPI_get_dmem_info()
get the executable's info
DynamicArray_t global_eventset_map
PAPI_preload_info_t preload_info
PAPI_shlib_info_t shlib_info
long long(* get_virt_nsec)(void)
long long(* get_real_nsec)(void)
long long(* get_virt_usec)(void)
int(* get_dmem_info)(PAPI_dmem_info_t *)
int(* update_shlib_info)(papi_mdi_t *mdi)
long long(* get_real_usec)(void)
long long(* get_virt_cycles)(void)
long long(* get_real_cycles)(void)
int mpx_check(int EventSet)
int MPX_read(MPX_EventSet *mpx_events, long long *values, int called_by_stop)
int mpx_init(int interval_ns)
int MPX_start(MPX_EventSet *mpx_events)
int MPX_reset(MPX_EventSet *mpx_events)
int MPX_stop(MPX_EventSet *mpx_events, long long *values)
int MPX_cleanup(MPX_EventSet **mpx_events)
int _papi_hwi_init_global_threads(void)
unsigned long _papi_gettid(void)
int _papi_hwi_shutdown_thread(ThreadInfo_t *thread, int force_shutdown)
int _papi_hwi_set_thread_id_fn(unsigned long(*id_fn)(void))
int _papi_hwi_gather_all_thrspec_data(int tag, PAPI_all_thr_spec_t *where)
int _papi_hwi_shutdown_global_threads(void)
inline_static int _papi_hwi_lookup_or_create_thread(ThreadInfo_t **here, int tid)
inline_static ThreadInfo_t * _papi_hwi_lookup_thread(int custom_tid)
inline_static int _papi_hwi_lock(int lck)
#define THREAD_LOCAL_STORAGE_KEYWORD
inline_static int _papi_hwi_unlock(int lck)
A pointer to the following is passed to PAPI_set/get_opt()
PAPI_preload_info_t preload
PAPI_granularity_option_t granularity
PAPI_shlib_info_t * shlib_info
PAPI_user_defined_events_file_t events_file
PAPI_domain_option_t defdomain
PAPI_domain_option_t domain
PAPI_inherit_option_t inherit
PAPI_component_info_t * cmp_info
PAPI_itimer_option_t itimer
PAPI_multiplex_option_t multiplex
PAPI_addr_range_option_t addr
PAPI_granularity_option_t defgranularity
PAPI_attach_option_t attach
PAPI_debug_option_t debug
PAPI_exe_info_t * exe_info
_papi_int_domain_t domain
_papi_int_multiplex_t multiplex
_papi_int_granularity_t granularity
_papi_int_attach_t attach
_papi_int_inherit_t inherit
_papi_int_itimer_t itimer
_papi_int_addr_range_t address_range