Wiki

Clone wiki

papi / PAPI-Options

Getting and Setting Options

The options of the PAPI library or a specific event set can be obtained and set by calling the following low-level functions, respectively:

C:

PAPI_get_opt(option, ptr)
PAPI_set_opt(option, ptr)

Fortran:

PAPIF_get_clockrate(clockrate)
PAPIF_get_domain(EventSet, domain, mode, check)
PAPIF_get_granularity(EventSet, granularity, mode, check)
PAPIF_get_preload(preload, check)

Arguments

  • option -- is an input parameter describing the course of action. The Fortran calls are implementations of specific options. Possible values are defined in papi.h and briefly described below:
Option name Explanation
General information requests
PAPI_CLOCKRATE Get clockrate in MHz.
PAPI_MAX_CPUS Get number of CPUs.
PAPI_MAX_HWCTRS Get number of counters.
PAPI_EXEINFO Get Executable addresses for text/data/bss.
PAPI_HWINFO Get information about the hardware.
PAPI_SHLIBINFO Get shared library information used by the program.
PAPI_SUBSTRATEINFO Get the PAPI features the substrate supports.
PAPI_LIB_VERSION Get the full PAPI version of the library.
PAPI_PRELOAD Get ‘‘LD_PRELOAD’’ environment equivalent.
Defaults for the global library
PAPI_DEFDOM Get/Set the default counting domain for newly created event sets.
PAPI_DEFGRN Get/Set the default counting granularity.
PAPI_DEBUG Get/Set the PAPI debug state and the debug handler. The available debug states are defined in papi.h. The debug state is available in ptr->debug.level. The debug handler is available in ptr->debug.handler. For information regarding the behavior of the handler, please see the man page for PAPI_set_debug.
Multiplexing control
PAPI_MULTIPLEX Get/Set options for multiplexing.
PAPI_MAX_MPX_CTRS Get maximum number of multiplexing counters.
PAPI_DEF_MPX_USEC Get/Set the sampling time slice in microseconds for multiplexing.
Manipulating individual event sets
PAPI_ATTACH Get thread or process id to which event set is attached. Returns TRUE if currently attached. Set event set specified in ptr->ptr->attach.eventset to be attached to thread or process id specified in in ptr->attach.tid.
PAPI_DETACH Get thread or process id to which event set is attached. Returns TRUE if currently detached. Set event set specified in ptr->ptr->attach.eventset to be detached from any thread or process id.
PAPI_DOMAIN Get/Set domain for a single event set. The event set is specified in ptr->domain.eventset
PAPI_GRANUL Get/Set granularity for a single event set. The event set is specified in ptr->granularity.eventset. Currently unimplemented.
Platform Specific Options
PAPI_DATA_ADDRESS Set data address range to restrict event counting for event set specified in ptr->addr.eventset. Starting and ending addresses are specified in ptr->addr.start and ptr->addr.end, respectively. If exact addresses cannot be instantiated, offsets are returned in ptr->addr.start_off and ptr->addr.end_off. Currently implemented on Itanium only.
PAPI_INSTR_ADDRESS Set instruction address range as described above. Itanium only.
  • ptr -- is a pointer to a structure that acts as both an input and output parameter. It is defined in papi.h and below.
  • EventSet -- input; a reference to an EventSetInfo structure
  • clockrate -- output; cycle time of this CPU in MHz; may be an estimate generated at init time with a quick timing routine
  • domain -- output; execution domain for which events are counted
  • granularity -- output; execution granularity for which events are counted
  • mode -- input; determines if domain or granularity are default or for the current event set
  • preload -- output; environment variable string for preloading libraries

PAPI_get_opt and PAPI_set_opt query or change the options of the PAPI library or a specific event set created by PAPI_create_eventset. In the C interface, these functions pass a pointer to the PAPI_option_t structure. Not all options require or return information in this structure. The Fortran interface is a series of calls implementing various subsets of the C interface. Not all options in C are available in Fortran.

Note that a number of options are available as separate entry points in both C and Fortran. This can make calling sequences simpler. Calls that are simply wrappers to PAPI_get_opt and PAPI_set_opt are listed below:

PAPI_get_executable_info Get the executable’s address space information. PAPI_get_hardware_info Get information about the system hardware. PAPI_get_multiplex Get the multiplexing status of specified event set. PAPI_get_shared_lib_info Get information about the shared libraries used by the process. PAPI_get_substrate_info Get information about the substrate features. PAPI_set_debug Set the current debug level for PAPI. PAPI_set_domain Set the default execution domain for new event sets. PAPI_set_granularity Get/Set the default granularity for new event sets. PAPI_set_multiplex Convert a standard event set to a multiplexed event set.

The PAPI_option_t structure is actually a union of structures that provide specific information for each of the options defined in the table above. This union is defined as shown below:

typedef union {
    PAPI_preload_info_t preload;
    PAPI_debug_option_t debug;
    PAPI_granularity_option_t granularity;
    PAPI_granularity_option_t defgranularity;
    PAPI_domain_option_t domain;
    PAPI_domain_option_t defdomain;
    PAPI_attach_option_t attach;
    PAPI_multiplex_option_t multiplex;
    PAPI_hw_info_t *hw_info;
    PAPI_shlib_info_t *shlib_info;
    PAPI_exe_info_t *exe_info;
    PAPI_substrate_info_t *sub_info;
    PAPI_addr_range_option_t addr;
} PAPI_option_t;

Each of these individual structures, as defined in papi.h, is shown below:

For PAPI_PRELOAD:

typedef struct _papi_preload_option {
    char lib_preload_env[PAPI_MAX_STR_LEN];   
    char lib_preload_sep;
    char lib_dir_env[PAPI_MAX_STR_LEN];
    char lib_dir_sep;
} PAPI_preload_info_t;

For PAPI_DEBUG:

typedef int (*PAPI_debug_handler_t) (int code);

    typedef struct _papi_debug_option {
    int level;
    PAPI_debug_handler_t handler;
} PAPI_debug_option_t;

For PAPI_DEFGRN and PAPI_GRANUL:

typedef struct _papi_granularity_option {
    int eventset;
    int granularity;
} PAPI_granularity_option_t;

For PAPI_DEFDOM and PAPI_DOMAIN:

typedef struct _papi_domain_option {
    int eventset;
    int domain;
} PAPI_domain_option_t;

For PAPI_ATTACH and PAPI_DETACH:

typedef struct _papi_attach_option {
    int eventset;
    unsigned long tid;
} PAPI_attach_option_t;

For PAPI_MULTIPLEX and PAPI_DEF_MPX_USEC:

typedef struct _papi_multiplex_option {
    int eventset;
    int us;
    int flags;
} PAPI_multiplex_option_t;

For PAPI_HWINFO:

typedef struct _papi_hw_info {
    int ncpu;                 /* Number of CPU's in an SMP Node */
    int nnodes;               /* Number of Nodes in the entire system */
    int totalcpus;            /* Total number of CPU's in the entire system */
    int vendor;               /* Vendor number of CPU */
    char vendor_string[PAPI_MAX_STR_LEN];     /* Vendor string of CPU */
    int model;                /* Model number of CPU */
    char model_string[PAPI_MAX_STR_LEN];      /* Model string of CPU */
    float revision;           /* Revision of CPU */
    float mhz;                /* Cycle time of this CPU */
    PAPI_mh_info_t mem_hierarchy;  /* PAPI memory heirarchy description */
} PAPI_hw_info_t;

For PAPI_SHLIBINFO:

typedef struct _papi_shared_lib_info {
    PAPI_address_map_t *map;
    int count;
} PAPI_shlib_info_t;

For PAPI_EXEINFO:

typedef struct _papi_program_info {
    char fullname[PAPI_HUGE_STR_LEN];  /* path+name */
    PAPI_address_map_t address_info;
} PAPI_exe_info_t;

For both PAPI_SHLIBINFO and PAPI_EXEINFO:

typedef struct _papi_address_map {
    char name[PAPI_HUGE_STR_LEN];
    caddr_t text_start;       /* Start address of program text segment */
    caddr_t text_end;         /* End address of program text segment */
    caddr_t data_start;       /* Start address of program data segment */
    caddr_t data_end;         /* End address of program data segment */
    caddr_t bss_start;        /* Start address of program bss segment */
    caddr_t bss_end;          /* End address of program bss segment */
} PAPI_address_map_t;

For PAPI_SUBSTRATEINFO:

typedef struct _papi_substrate_option {
    char name[PAPI_MAX_STR_LEN];    /* Name of the substrate we're using,
                                    usually CVS RCS Id */
    char version[PAPI_MIN_STR_LEN]; /* Version of this substrate,
                                    usually CVS Revision */
    char support_version[PAPI_MIN_STR_LEN]; /* Version of the support library */
    char kernel_version[PAPI_MIN_STR_LEN];  /* Version of the kernel PMC
                                            support driver */
    int num_cntrs;          /* Number of hardware counters substrate supports */
    int num_mpx_cntrs;      /* Number of multiplexed counters the substrate or
                            PAPI supports */
    int num_preset_events;   /* Number of preset events the substrate supports */
    int num_native_events;   /* Number of native events the substrate supports */
    int default_domain;      /* The default domain when this substrate is used */
    int available_domains;   /* Available domains */ 
    int default_granularity; /* Default granularity when this substrate is used */
    int available_granularities; /* Available granularities */
    int multiplex_timer_sig;     /* Signal number used by the multiplex timer,
                                 0 if not */
    int multiplex_timer_num;     /* Number of the itimer or POSIX 1 timer used
                                 by the multiplex timer */
    int multiplex_timer_us;      /* uS between switching of sets */
    int hardware_intr_sig;     /* Signal used by hardware to deliver PMC events */
    int opcode_match_width;    /* Width of opcode matcher if exists, 0 if not */
    int reserved_ints[4];
    unsigned int hardware_intr:1; /* hw overflow intr, does not need to be
                                  emulated in software*/
    unsigned int precise_intr:1;  /* Performance interrupts happen precisely */
    unsigned int posix1b_timers:1;  /* Using POSIX 1b interval timers
                                   (timer_create) instead of setitimer */
    unsigned int kernel_profile:1;   /* Has kernel profiling support (buffered
                                    interrupts or sprofil-like) */
    unsigned int kernel_multiplex:1; /* In kernel multiplexing */
    unsigned int data_address_range:1; /* Supports data address range limiting */
    unsigned int instr_address_range:1; /* Supports instruction address range
                                        limiting */
    unsigned int fast_counter_read:1;   /* Supports user level PMC read
                                        instruction */
    unsigned int fast_real_timer:1;     /* Supports a fast real timer */
    unsigned int fast_virtual_timer:1;  /* Supports a fast virtual timer */
    unsigned int attach:1;           /* Supports attach */
    unsigned int attach_must_ptrace:1;  /* Attach must first ptrace and 
                                        stop the thread/process*/
    unsigned int edge_detect:1;         /* Supports edge detection on events */
    unsigned int invert:1;              /* Supports invert detection on events */
    unsigned int profile_ear:1;         /* Supports data/instr/tlb miss
                                        address sampling */
    unsigned int grouped_cntrs:1;   /* Underlying hardware uses counter groups */
    unsigned int reserved_bits:16;
} PAPI_substrate_info_t;

For PAPI_DATA_ADDRESS and PAPI_INSTR_ADDRESS:

/* address range specification for range restricted counting */
typedef struct _papi_addr_range_option { /* if both are zero, range disabled */
    int eventset;           /* eventset to restrict */
    caddr_t start;          /* user requested start address of address range */
    caddr_t end;            /* user requested end address of an address range */
    int start_off;          /* hardware specified offset from start address */
    int end_off;            /* hardware specified offset from end address */
} PAPI_addr_range_option_t;

The file, papi.h, contains current definitions for the structures unioned in the PAPI_option_t structure. Users should refer to papi.h for specifics on the use of fields in these structures.

In the following code example, PAPI_get_opt is used to acquire the option, PAPI_MAX_HWCTRS, of an event set and PAPI_set_opt is used to set the option, PAPI_DOMAIN, to the same event set:

#include <papi.h>
#include <stdio.h>

main()
{
int num, retval, EventSet = PAPI_NULL;
PAPI_option_t options;

/* Initialize the PAPI library */
retval = PAPI_library_init(PAPI_VER_CURRENT);

if (retval != PAPI_VER_CURRENT) {
  fprintf(stderr, "PAPI library init error!\n");
  exit(1);
}

if ((num = PAPI_get_opt(PAPI_MAX_HWCTRS,NULL)) <= 0)
  handle_error();

printf("This machine has %d counters.0,num);

if (PAPI_create_eventset(&EventSet) != PAPI_OK)
  handle_error();

/* Set the domain of this EventSet
   to counter user and kernel modes for this
   process */

memset(&options,0x0,sizeof(options));

options.domain.eventset = EventSet;
options.domain.domain = PAPI_DOM_ALL;
if (PAPI_set_opt(PAPI_DOMAIN, &options) != PAPI_OK)
  handle_error();
}

Possible output (varies on different platforms):

This machine has 4 counters.

On success, these functions return PAPI_OK and on error, a non-zero error code is returned.

For more code examples, see src/ctests/second.c in the PAPI source distribution, or search the ctests codebase for PAPI_set_opt or PAPI_get_opt.

Updated