timemory  3.2.1
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
tim::component::papi_common Struct Reference

#include "timemory/components/papi/papi_common.hpp"

+ Collaboration diagram for tim::component::papi_common:

Classes

struct  common_data
 
struct  state_data
 

Public Types

template<typename Tp >
using vector_t = std::vector< Tp >
 
template<typename Tp , size_t N>
using array_t = std::array< Tp, N >
 
using size_type = size_t
 
using event_list = vector_t< int >
 
using value_type = vector_t< long long >
 
using entry_type = typename value_type::value_type
 
using get_initializer_t = std::function< event_list()>
 

Static Public Member Functions

static state_datastate ()
 
template<typename Tp >
static common_datadata ()
 
template<typename Tp >
static int & event_set ()
 
template<typename Tp >
static bool & is_configured ()
 
template<typename Tp >
static bool & is_fixed ()
 
template<typename Tp >
static vector_t< int > & get_events ()
 
static void overflow_handler (int evt_set, void *address, long long overflow_vector, void *context)
 
static void add_event (int evt)
 
static bool initialize_papi ()
 
static bool finalize_papi ()
 
template<typename Tp >
static get_initializer_tget_initializer ()
 
template<typename Tp >
static void initialize ()
 
template<typename Tp >
static void finalize ()
 

Static Protected Member Functions

static vector_t< int > & private_events ()
 

Protected Attributes

event_list events {}
 

Detailed Description

Definition at line 53 of file papi_common.hpp.


Class Documentation

◆ tim::component::papi_common::common_data

struct tim::component::papi_common::common_data

Definition at line 81 of file papi_common.hpp.

+ Collaboration diagram for tim::component::papi_common::common_data:
Class Members
int event_set
vector_t< int > events
bool is_configured
bool is_fixed

◆ tim::component::papi_common::state_data

struct tim::component::papi_common::state_data

Definition at line 70 of file papi_common.hpp.

+ Collaboration diagram for tim::component::papi_common::state_data:
Class Members
bool is_finalized
bool is_initialized
bool is_working

Member Typedef Documentation

◆ array_t

template<typename Tp , size_t N>
using tim::component::papi_common::array_t = std::array<Tp, N>

Definition at line 60 of file papi_common.hpp.

◆ entry_type

using tim::component::papi_common::entry_type = typename value_type::value_type

Definition at line 65 of file papi_common.hpp.

◆ event_list

Definition at line 63 of file papi_common.hpp.

◆ get_initializer_t

Definition at line 66 of file papi_common.hpp.

◆ size_type

Definition at line 62 of file papi_common.hpp.

◆ value_type

Definition at line 64 of file papi_common.hpp.

◆ vector_t

template<typename Tp >
using tim::component::papi_common::vector_t = std::vector<Tp>

Definition at line 57 of file papi_common.hpp.

Member Function Documentation

◆ add_event()

static void tim::component::papi_common::add_event ( int  evt)
inlinestatic

Definition at line 145 of file papi_common.hpp.

146  {
147  auto& pevents = private_events();
148  auto fitr = std::find(pevents.begin(), pevents.end(), evt);
149  if(fitr == pevents.end())
150  pevents.push_back(evt);
151  }
static vector_t< int > & private_events()

References private_events().

Referenced by tim::component::cpu_roofline< Types >::configure().

◆ data()

template<typename Tp >
static common_data& tim::component::papi_common::data ( )
inlinestatic

Definition at line 100 of file papi_common.hpp.

101  {
102  static thread_local common_data _instance{};
103  return _instance;
104  }

Referenced by tim::component::papi_tuple< EventTypes >::record().

◆ event_set()

template<typename Tp >
static int& tim::component::papi_common::event_set ( )
inlinestatic

Definition at line 107 of file papi_common.hpp.

108  {
109  return data<Tp>().event_set;
110  }

◆ finalize()

template<typename Tp >
static void tim::component::papi_common::finalize ( )
inlinestatic

Definition at line 329 of file papi_common.hpp.

330  {
331  if(!initialize_papi())
332  return;
333  auto& _event_set = event_set<Tp>();
334  auto& _events = get_events<Tp>();
335  if(!_events.empty() && _event_set != PAPI_NULL && _event_set >= 0)
336  {
337  value_type values(_events.size(), 0);
338  papi::stop(_event_set, values.data());
339  papi::remove_events(_event_set, _events.data(), _events.size());
340  papi::destroy_event_set(_event_set);
341  _event_set = PAPI_NULL;
342  _events.clear();
343  }
344  }
void stop(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:368
vector_t< long long > value_type
Definition: papi_common.hpp:64

References initialize_papi(), and tim::invoke::stop().

◆ finalize_papi()

static bool tim::component::papi_common::finalize_papi ( )
inlinestatic

Definition at line 190 of file papi_common.hpp.

191  {
192  if(!state().is_finalized && state().is_working)
193  {
194  papi::unregister_thread();
195  state().is_working = papi::working();
196  if(state().is_working)
197  state().is_finalized = true;
198  }
199  return state().is_finalized && state().is_working;
200  }
static state_data & state()
Definition: papi_common.hpp:93

References tim::component::papi_common::state_data::is_finalized, tim::component::papi_common::state_data::is_working, and state().

Referenced by tim::component::papi_array< MaxNumEvents >::thread_finalize(), tim::component::papi_tuple< EventTypes >::thread_finalize(), and tim::component::papi_vector::thread_finalize().

◆ get_events()

template<typename Tp >
static vector_t<int>& tim::component::papi_common::get_events ( )
inlinestatic

Definition at line 125 of file papi_common.hpp.

126  {
127  auto& _ret = data<Tp>().events;
128  if(!is_fixed<Tp>() && _ret.empty())
129  _ret = get_initializer<Tp>()();
130  return _ret;
131  }

◆ get_initializer()

template<typename Tp >
static get_initializer_t& tim::component::papi_common::get_initializer ( )
inlinestatic

Definition at line 205 of file papi_common.hpp.

206  {
207  static get_initializer_t _instance = []() {
209  {
210  fprintf(stderr, "[papi_common]> PAPI could not be initialized\n");
211  return vector_t<int>{};
212  }
213 
214  auto events_str = settings::papi_events();
215 
216  if(settings::verbose() > 1 || settings::debug())
217  {
218  printf("[papi_common]> TIMEMORY_PAPI_EVENTS: '%s'...\n",
219  events_str.c_str());
220  }
221 
222  // don't delimit colons!
223  vector_t<string_t> events_str_list = delimit(events_str, "\"',; ");
224  vector_t<int> events_list;
225 
226  auto& pevents = private_events();
227  for(int& pevent : pevents)
228  {
229  auto fitr = std::find(events_list.begin(), events_list.end(), pevent);
230  if(fitr == events_list.end())
231  events_list.push_back(pevent);
232  }
233 
234  for(const auto& itr : events_str_list)
235  {
236  if(itr.length() == 0)
237  continue;
238 
239  if(settings::debug())
240  {
241  printf("[papi_common]> Getting event code from '%s'...\n",
242  itr.c_str());
243  }
244 
245  int evt_code = papi::get_event_code(itr);
246  if(evt_code == PAPI_NOT_INITED) // defined as zero
247  {
248  std::stringstream ss;
249  ss << "[papi_common] Error creating event with ID: " << itr;
251  {
252  TIMEMORY_EXCEPTION(ss.str());
253  }
254  else
255  {
256  fprintf(stderr, "%s\n", ss.str().c_str());
257  }
258  }
259  else
260  {
261  auto fitr =
262  std::find(events_list.begin(), events_list.end(), evt_code);
263  if(fitr == events_list.end())
264  {
265  if(settings::debug() || settings::verbose() > 1)
266  {
267  printf("[papi_common] Successfully created event '%s' with "
268  "code '%i'...\n",
269  itr.c_str(), evt_code);
270  }
271  events_list.push_back(evt_code);
272  }
273  else
274  {
275  if(settings::debug() || settings::verbose() > 1)
276  {
277  printf("[papi_common] Event '%s' with code '%i' already "
278  "exists...\n",
279  itr.c_str(), evt_code);
280  }
281  }
282  }
283  }
284 
285  return events_list;
286  };
287  return _instance;
288  }
papi_events
Definition: settings.cpp:1410
papi_fail_on_error
Definition: settings.cpp:1407
ContainerT delimit(const std::string &line, const std::string &delimiters="\"',;: ", PredicateT &&predicate=[](const std::string &s) -> std::string { return s;})
Definition: utility.hpp:666
std::function< event_list()> get_initializer_t
Definition: papi_common.hpp:66
#define TIMEMORY_EXCEPTION(...)
Definition: types.hpp:137

References tim::debug, tim::delimit(), initialize_papi(), tim::papi_events, tim::papi_fail_on_error, private_events(), TIMEMORY_EXCEPTION, and tim::verbose.

◆ initialize()

template<typename Tp >
static void tim::component::papi_common::initialize ( )
inlinestatic

Definition at line 293 of file papi_common.hpp.

294  {
295  if(!is_configured<Tp>() && initialize_papi())
296  {
297  auto& _event_set = event_set<Tp>();
298  auto& _events = get_events<Tp>();
299  if(!_events.empty())
300  {
301  if(settings::debug() || settings::verbose() > 1)
302  PRINT_HERE("configuring %i papi events", (int) _events.size());
303  papi::create_event_set(&_event_set, settings::papi_multiplexing());
304  papi::add_events(_event_set, _events.data(), _events.size());
305  if(settings::papi_overflow() > 0)
306  {
307  for(auto itr : _events)
308  {
309  papi::overflow(_event_set, itr, settings::papi_overflow(), 0,
311  }
312  }
314  papi::attach(_event_set, process::get_target_id());
315  papi::start(_event_set);
316  is_configured<Tp>() = papi::working();
317  }
318  if(!is_configured<Tp>())
319  {
320  PRINT_HERE("Warning! Configuring %i papi events failed",
321  (int) _events.size());
322  }
323  }
324  }
void start(TupleT< Tp... > &obj, Args &&... args)
Definition: functional.cpp:298
papi_multiplexing
Definition: settings.cpp:1405
papi_overflow
Definition: settings.cpp:1412
papi_attach
Definition: settings.cpp:1411
static void overflow_handler(int evt_set, void *address, long long overflow_vector, void *context)
#define PRINT_HERE(...)
Definition: macros.hpp:147

References tim::debug, initialize_papi(), overflow_handler(), tim::papi_attach, tim::papi_multiplexing, tim::papi_overflow, PRINT_HERE, tim::invoke::start(), and tim::verbose.

◆ initialize_papi()

static bool tim::component::papi_common::initialize_papi ( )
inlinestatic

Definition at line 155 of file papi_common.hpp.

156  {
157  if(!state().is_initialized && !state().is_working)
158  {
159  if(settings::debug() || settings::verbose() > 2)
160  {
161  PRINT_HERE("Initializing papi. is initialized: %s, is working: %s",
162  state().is_initialized ? "y" : "n",
163  state().is_working ? "y" : "n");
164  }
165  papi::init();
166  papi::register_thread();
167  state().is_working = papi::working();
168  if(!state().is_working)
169  {
170  std::cerr << "Warning! PAPI failed to initialized!\n";
171  std::cerr << "The following PAPI events will not be reported: \n";
172  for(const auto& itr : get_events<void>())
173  std::cerr << " " << papi::get_event_info(itr).short_descr << "\n";
174  std::cerr << std::flush;
175  // disable all the papi APIs with concrete instantiations
177  tpls::papi, papi_array_t, papi_common, papi_vector, papi_array8_t,
178  papi_array16_t, papi_array32_t>(false);
179  }
180  else
181  {
182  state().is_initialized = true;
183  }
184  }
185  return state().is_initialized && state().is_working;
186  }
void init(Args &&... args)
Definition: types.hpp:111
generic functions for setting/accessing static properties on types
Definition: types.hpp:80

References tim::debug, tim::init(), tim::component::papi_common::state_data::is_initialized, tim::component::papi_common::state_data::is_working, PRINT_HERE, state(), and tim::verbose.

Referenced by finalize(), get_initializer(), and initialize().

◆ is_configured()

template<typename Tp >
static bool& tim::component::papi_common::is_configured ( )
inlinestatic

Definition at line 113 of file papi_common.hpp.

114  {
115  return data<Tp>().is_configured;
116  }

◆ is_fixed()

template<typename Tp >
static bool& tim::component::papi_common::is_fixed ( )
inlinestatic

Definition at line 119 of file papi_common.hpp.

120  {
121  return data<Tp>().is_fixed;
122  }

◆ overflow_handler()

static void tim::component::papi_common::overflow_handler ( int  evt_set,
void *  address,
long long  overflow_vector,
void *  context 
)
inlinestatic

Definition at line 135 of file papi_common.hpp.

137  {
138  fprintf(stderr, "[papi_common%i]> Overflow at %p! bit=0x%llx \n", evt_set,
139  address, overflow_vector);
140  consume_parameters(context);
141  }
void consume_parameters(ArgsT &&...) TIMEMORY_HIDDEN
Definition: types.hpp:285

References tim::consume_parameters().

Referenced by initialize().

◆ private_events()

static vector_t<int>& tim::component::papi_common::private_events ( )
inlinestaticprotected

Definition at line 355 of file papi_common.hpp.

356  {
357  static auto _instance = vector_t<int>{};
358  return _instance;
359  }

Referenced by add_event(), and get_initializer().

◆ state()

static state_data& tim::component::papi_common::state ( )
inlinestatic

Definition at line 93 of file papi_common.hpp.

94  {
95  static thread_local state_data _instance{};
96  return _instance;
97  }

Referenced by finalize_papi(), and initialize_papi().

Member Data Documentation

◆ events

event_list tim::component::papi_common::events {}
protected

The documentation for this struct was generated from the following file: