Profiling data is collected by recording profile events at regular intervals. The interval is either a time interval obtained by using the system clock or a number of hardware events of a specific type. When the interval expires, a signal is delivered to the system and the data is recorded at the next opportunity.
Tracing data is collected by interposing a wrapper function on various system functions and library functions so that calls to the functions can be intercepted and data recorded about the calls.
Sample data is collected by calling various system routines to obtain global information.
Function and instruction count data is collected for the executable and for any shared objects that are dynamically opened or statically linked to the executable and instrumented. The number of times functions and instructions were executed is recorded.
Thread analysis data is collected to support the Thread Analyzer.
Both profiling data and tracing data contain information about specific events, and both types of data are converted into performance metrics. Sample data is not converted into metrics, but is used to provide markers that can be used to divide the program execution into time segments. The sample data gives an overview of the program execution during that time segment.
The data packets collected at each profiling event or tracing event include the following information:
A header identifying the data.
A high-resolution timestamp.
A thread ID.
A lightweight process (LWP) ID.
A processor (CPU) ID, when available from the operating system.
A copy of the call stack. For Java programs, two call stacks are recorded: the machine call stack and the Java call stack.
For OpenMP programs, an identifier for the current parallel region and the OpenMP state are also collected.
For more information on threads and lightweight processes, see Chapter 6, Understanding Performance Analyzer and Its Data.