27#include "timemory/components/papi/backends.hpp"
56 template <
typename Tp>
59 template <
typename Tp,
size_t N>
99 template <
typename Tp>
106 template <
typename Tp>
109 return data<Tp>().event_set;
112 template <
typename Tp>
115 return data<Tp>().is_configured;
118 template <
typename Tp>
121 return data<Tp>().is_fixed;
124 template <
typename Tp>
127 auto&
_ret = data<Tp>().events;
128 if(!is_fixed<Tp>() &&
_ret.empty())
129 _ret = get_initializer<Tp>()();
138 fprintf(stderr,
"[papi_common%i]> Overflow at %p! bit=0x%llx \n", evt_set,
139 address, overflow_vector);
148 auto fitr = std::find(pevents.begin(), pevents.end(), evt);
149 if(fitr == pevents.end())
150 pevents.push_back(evt);
161 PRINT_HERE(
"Initializing papi. is initialized: %s, is working: %s",
166 papi::register_thread();
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;
178 papi_array16_t, papi_array32_t>(
false);
194 papi::unregister_thread();
204 template <
typename Tp>
210 fprintf(stderr,
"[papi_common]> PAPI could not be initialized\n");
218 printf(
"[papi_common]> TIMEMORY_PAPI_EVENTS: '%s'...\n",
227 for(
int& pevent : pevents)
229 auto fitr = std::find(events_list.begin(), events_list.end(), pevent);
230 if(fitr == events_list.end())
231 events_list.push_back(pevent);
234 for(
const auto& itr : events_str_list)
236 if(itr.length() == 0)
241 printf(
"[papi_common]> Getting event code from '%s'...\n",
245 int evt_code = papi::get_event_code(itr);
246 if(evt_code == PAPI_NOT_INITED)
248 std::stringstream ss;
249 ss <<
"[papi_common] Error creating event with ID: " << itr;
256 fprintf(stderr,
"%s\n", ss.str().c_str());
262 std::find(events_list.begin(), events_list.end(), evt_code);
263 if(fitr == events_list.end())
267 printf(
"[papi_common] Successfully created event '%s' with "
269 itr.c_str(), evt_code);
271 events_list.push_back(evt_code);
277 printf(
"[papi_common] Event '%s' with code '%i' already "
279 itr.c_str(), evt_code);
292 template <
typename Tp>
297 auto& _event_set = event_set<Tp>();
298 auto& _events = get_events<Tp>();
302 PRINT_HERE(
"configuring %i papi events", (
int) _events.size());
304 papi::add_events(_event_set, _events.data(), _events.size());
307 for(
auto itr : _events)
314 papi::attach(_event_set, process::get_target_id());
316 is_configured<Tp>() = papi::working();
318 if(!is_configured<Tp>())
320 PRINT_HERE(
"Warning! Configuring %i papi events failed",
321 (
int) _events.size());
328 template <
typename Tp>
333 auto& _event_set = event_set<Tp>();
334 auto& _events = get_events<Tp>();
335 if(!_events.empty() && _event_set != PAPI_NULL && _event_set >= 0)
339 papi::remove_events(_event_set, _events.data(), _events.size());
340 papi::destroy_event_set(_event_set);
341 _event_set = PAPI_NULL;
Declare the papi component types.
const hash_alias_ptr_t hash_value_t std::string *& _ret
void stop(TupleT< Tp... > &obj, Args &&... args)
void start(TupleT< Tp... > &obj, Args &&... args)
void init(Args &&... args)
ContainerT delimit(const std::string &line, const std::string &delimiters="\"',;: ", PredicateT &&predicate=[](const std::string &s) -> std::string { return s;})
void consume_parameters(ArgsT &&...)
static vector_t< int > & get_events()
static common_data & data()
static vector_t< int > & private_events()
static state_data & state()
typename value_type::value_type entry_type
std::array< Tp, N > array_t
static bool & is_configured()
static bool initialize_papi()
static void overflow_handler(int evt_set, void *address, long long overflow_vector, void *context)
static bool finalize_papi()
std::vector< Tp > vector_t
std::function< event_list()> get_initializer_t
vector_t< int > event_list
static get_initializer_t & get_initializer()
vector_t< long long > value_type
static void add_event(int evt)
generic functions for setting/accessing static properties on types
#define TIMEMORY_EXCEPTION(...)