timemory 3.3.0
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:386
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

◆ 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 }
const hash_alias_ptr_t hash_value_t std::string *& _ret
Definition: definition.hpp:300

◆ 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
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 {
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 {
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:1716
papi_fail_on_error
Definition: settings.cpp:1713
ContainerT delimit(const std::string &line, const std::string &delimiters="\"',;: ", PredicateT &&predicate=[](const std::string &s) -> std::string { return s;})
Definition: delimit.hpp:68
std::function< event_list()> get_initializer_t
Definition: papi_common.hpp:66
#define TIMEMORY_EXCEPTION(...)
Definition: types.hpp:138

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 {
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());
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:316
papi_multiplexing
Definition: settings.cpp:1711
papi_overflow
Definition: settings.cpp:1718
papi_attach
Definition: settings.cpp:1717
static void overflow_handler(int evt_set, void *address, long long overflow_vector, void *context)
#define PRINT_HERE(...)
Definition: macros.hpp:152

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 {
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 &&...)
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: