46#if !defined(TIMEMORY_ESC)
47# define TIMEMORY_ESC(...) __VA_ARGS__
52#if !defined(TIMEMORY_STRINGIZE)
53# define TIMEMORY_STRINGIZE(X) TIMEMORY_STRINGIZE2(X)
57#if !defined(TIMEMORY_STRINGIZE2)
58# define TIMEMORY_STRINGIZE2(X) # X
64#if !defined(TIMEMORY_STATIC_ACCESSOR)
65# define TIMEMORY_STATIC_ACCESSOR(RETURN_TYPE, FUNC_NAME, ...) \
66 static RETURN_TYPE& FUNC_NAME() \
68 static RETURN_TYPE _v = __VA_ARGS__; \
75#if !defined(TIMEMORY_STATIC_THREAD_LOCAL_ACCESSOR)
76# define TIMEMORY_STATIC_THREAD_LOCAL_ACCESSOR(RETURN_TYPE, FUNC_NAME, ...) \
77 static RETURN_TYPE& FUNC_NAME() \
79 static thread_local RETURN_TYPE _v = __VA_ARGS__; \
90#if !defined(TIMEMORY_FORWARD_DECLARE_COMPONENT)
93# define TIMEMORY_FORWARD_DECLARE_COMPONENT(NAME) \
109#if !defined(TIMEMORY_DEFINE_CONCRETE_TRAIT)
110# define TIMEMORY_DEFINE_CONCRETE_TRAIT(TRAIT, COMPONENT, VALUE) \
116 struct TRAIT<COMPONENT> : VALUE \
124#if !defined(TIMEMORY_DEFINE_TEMPLATE_TRAIT)
125# define TIMEMORY_DEFINE_TEMPLATE_TRAIT(TRAIT, COMPONENT, VALUE, TYPE) \
131 struct TRAIT<COMPONENT<T>> : VALUE \
139#if !defined(TIMEMORY_DEFINE_VARIADIC_TRAIT)
140# define TIMEMORY_DEFINE_VARIADIC_TRAIT(TRAIT, COMPONENT, VALUE, TYPE) \
145 template <TYPE... T> \
146 struct TRAIT<COMPONENT<T...>> : VALUE \
158#if !defined(TIMEMORY_TRAIT_TYPE)
159# define TIMEMORY_TRAIT_TYPE(TRAIT, COMPONENT, ...) \
165 struct TRAIT<COMPONENT> \
167 using type = __VA_ARGS__; \
175#if !defined(TIMEMORY_TEMPLATE_TRAIT_TYPE)
176# define TIMEMORY_TEMPLATE_TRAIT_TYPE(TRAIT, COMPONENT, TEMPLATE_PARAM, TEMPLATE_ARG, \
182 template <TEMPLATE_PARAM> \
183 struct TRAIT<COMPONENT<TEMPLATE_ARG>> \
185 using type = __VA_ARGS__; \
193#if !defined(TIMEMORY_VARIADIC_TRAIT_TYPE)
194# define TIMEMORY_VARIADIC_TRAIT_TYPE(TRAIT, COMPONENT, TEMPLATE_PARAM, TEMPLATE_ARG, \
196 TIMEMORY_TEMPLATE_TRAIT_TYPE(TRAIT, COMPONENT, TIMEMORY_ESC(TEMPLATE_PARAM), \
197 TIMEMORY_ESC(TEMPLATE_ARG), __VA_ARGS__)
206#if !defined(TIMEMORY_STATISTICS_TYPE)
207# define TIMEMORY_STATISTICS_TYPE(COMPONENT, TYPE) \
208 TIMEMORY_TRAIT_TYPE(statistics, TIMEMORY_ESC(COMPONENT), TIMEMORY_ESC(TYPE))
213#if !defined(TIMEMORY_TEMPLATE_STATISTICS_TYPE)
214# define TIMEMORY_TEMPLATE_STATISTICS_TYPE(COMPONENT, TYPE, TEMPLATE_TYPE) \
215 TIMEMORY_TEMPLATE_TRAIT_TYPE(statistics, TIMEMORY_ESC(COMPONENT), \
216 TIMEMORY_ESC(TEMPLATE_TYPE T), TIMEMORY_ESC(T), \
222#if !defined(TIMEMORY_VARIADIC_STATISTICS_TYPE)
223# define TIMEMORY_VARIADIC_STATISTICS_TYPE(COMPONENT, TYPE, TEMPLATE_TYPE) \
224 TIMEMORY_VARIADIC_TRAIT_TYPE(statistics, TIMEMORY_ESC(COMPONENT), \
225 TIMEMORY_ESC(TEMPLATE_TYPE... T), \
226 TIMEMORY_ESC(T...), TIMEMORY_ESC(TYPE))
235#if defined(TIMEMORY_USE_GOTCHA)
242# if !defined(TIMEMORY_C_GOTCHA)
243# define TIMEMORY_C_GOTCHA(type, idx, func) \
244 type::template instrument< \
245 idx, typename ::tim::mpl::function_traits<decltype(func)>::result_type, \
246 typename ::tim::mpl::function_traits<decltype(func)>::call_type>:: \
247 generate(TIMEMORY_STRINGIZE(func))
255# if !defined(TIMEMORY_C_GOTCHA_TOOL)
256# define TIMEMORY_C_GOTCHA_TOOL(type, idx, func, ...) \
257 type::template instrument< \
258 idx, typename ::tim::mpl::function_traits<decltype(func)>::result_type, \
259 typename ::tim::mpl::function_traits<decltype(func)>::call_type>:: \
260 generate(TIMEMORY_STRINGIZE(func), __VA_ARGS__)
269# if !defined(TIMEMORY_CXX_GOTCHA)
270# define TIMEMORY_CXX_GOTCHA(type, idx, func) \
271 type::template instrument< \
272 idx, typename ::tim::mpl::function_traits<decltype(func)>::result_type, \
273 typename ::tim::mpl::function_traits<decltype(func)>::call_type>:: \
274 generate(::tim::mangle<decltype(func)>(TIMEMORY_STRINGIZE(func)))
282# if !defined(TIMEMORY_CXX_GOTCHA_TOOL)
283# define TIMEMORY_CXX_GOTCHA_TOOL(type, idx, func, ...) \
284 type::template instrument< \
285 idx, typename ::tim::mpl::function_traits<decltype(func)>::result_type, \
286 typename ::tim::mpl::function_traits<decltype(func)>::call_type>:: \
287 generate(::tim::mangle<decltype(func)>(TIMEMORY_STRINGIZE(func)), \
297# if !defined(TIMEMORY_CXX_GOTCHA_MEMFUN)
298# define TIMEMORY_CXX_GOTCHA_MEMFUN(type, idx, func) \
299 type::template instrument< \
300 idx, typename ::tim::mpl::function_traits<decltype(&func)>::result_type, \
301 typename ::tim::mpl::function_traits<decltype(&func)>::call_type>:: \
302 generate(::tim::mangle<decltype(&func)>(TIMEMORY_STRINGIZE(func)))
312# if !defined(TIMEMORY_DERIVED_GOTCHA)
313# define TIMEMORY_DERIVED_GOTCHA(type, idx, func, ...) \
314 type::template instrument< \
315 idx, typename ::tim::mpl::function_traits<decltype(func)>::result_type, \
316 typename ::tim::mpl::function_traits<decltype(func)>::call_type>:: \
317 generate(__VA_ARGS__)
322# if !defined(TIMEMORY_C_GOTCHA)
323# define TIMEMORY_C_GOTCHA(...)
325# if !defined(TIMEMORY_C_GOTCHA_TOOL)
326# define TIMEMORY_C_GOTCHA_TOOL(...)
328# if !defined(TIMEMORY_CXX_GOTCHA)
329# define TIMEMORY_CXX_GOTCHA(...)
331# if !defined(TIMEMORY_CXX_GOTCHA_TOOL)
332# define TIMEMORY_CXX_GOTCHA_TOOL(...)
334# if !defined(TIMEMORY_CXX_GOTCHA_MEMFUN)
335# define TIMEMORY_CXX_GOTCHA_MEMFUN(...)
337# if !defined(TIMEMORY_DERIVED_GOTCHA)
338# define TIMEMORY_DERIVED_GOTCHA(...)
345#if !defined(TIMEMORY_CXX_MEMFUN_GOTCHA)
346# define TIMEMORY_CXX_MEMFUN_GOTCHA(...) TIMEMORY_CXX_GOTCHA_MEMFUN(__VA_ARGS__)
355#if defined(TIMEMORY_USE_CUPTI)
359# if !defined(TIMEMORY_CUDA_DRIVER_API_CALL)
360# define TIMEMORY_CUDA_DRIVER_API_CALL(apiFuncCall) \
362 CUresult _status = apiFuncCall; \
363 if(_status != CUDA_SUCCESS) \
366 "%s:%d: error: function '%s' failed with error: %d.\n", \
367 __FILE__, __LINE__, #apiFuncCall, _status); \
374# if !defined(TIMEMORY_CUPTI_CALL)
375# define TIMEMORY_CUPTI_CALL(call) \
377 CUptiResult _status = call; \
378 if(_status != CUPTI_SUCCESS) \
380 const char* errstr; \
381 cuptiGetResultString(_status, &errstr); \
383 "%s:%d: error: function '%s' failed with error: %s.\n", \
384 __FILE__, __LINE__, #call, errstr); \
393# if !defined(TIMEMORY_CUDA_DRIVER_API_CALL)
394# define TIMEMORY_CUDA_DRIVER_API_CALL(...)
397# if !defined(TIMEMORY_CUPTI_CALL)
398# define TIMEMORY_CUPTI_CALL(...)
405#if !defined(TIMEMORY_CUPTI_BUFFER_SIZE)
406# define TIMEMORY_CUPTI_BUFFER_SIZE (32 * 1024)
411#if !defined(TIMEMORY_CUPTI_ALIGN_SIZE)
412# define TIMEMORY_CUPTI_ALIGN_SIZE (8)
417#if !defined(TIMEMORY_CUPTI_ALIGN_BUFFER)
418# define TIMEMORY_CUPTI_ALIGN_BUFFER(buffer, align) \
419 (((uintptr_t)(buffer) & ((align) -1)) \
420 ? ((buffer) + (align) - ((uintptr_t)(buffer) & ((align) -1))) \
426#if !defined(TIMEMORY_CUPTI_PROFILER_NAME_SHORT)
427# define TIMEMORY_CUPTI_PROFILER_NAME_SHORT 128
432#if !defined(TIMEMORY_CUPTI_PROFILER_NAME_LONG)
433# define TIMEMORY_CUPTI_PROFILER_NAME_LONG 512
442#if defined(TIMEMORY_USE_CUDA)
446# if !defined(TIMEMORY_CUDA_RUNTIME_API_CALL)
447# define TIMEMORY_CUDA_RUNTIME_API_CALL(apiFuncCall) \
449 ::tim::cuda::error_t err = apiFuncCall; \
450 if(err != ::tim::cuda::success_v && (int) err != 0) \
453 "%s:%d: error: function '%s' failed with error: %s.\n", \
454 __FILE__, __LINE__, #apiFuncCall, \
455 ::tim::cuda::get_error_string(err)); \
462# if !defined(TIMEMORY_CUDA_RUNTIME_API_CALL_THROW)
463# define TIMEMORY_CUDA_RUNTIME_API_CALL_THROW(apiFuncCall) \
465 ::tim::cuda::error_t err = apiFuncCall; \
466 if(err != ::tim::cuda::success_v && (int) err != 0) \
468 char errmsg[std::numeric_limits<uint16_t>::max()]; \
470 "%s:%d: error: function '%s' failed with error: %s.\n", \
471 __FILE__, __LINE__, #apiFuncCall, \
472 ::tim::cuda::get_error_string(err)); \
473 throw std::runtime_error(errmsg); \
480# if !defined(TIMEMORY_CUDA_RUNTIME_CHECK_ERROR)
481# define TIMEMORY_CUDA_RUNTIME_CHECK_ERROR(err) \
483 if(err != ::tim::cuda::success_v && (int) err != 0) \
485 fprintf(stderr, "%s:%d: error check failed with: code %i -- %s.\n", \
486 __FILE__, __LINE__, (int) err, \
487 ::tim::cuda::get_error_string(err)); \
498# if !defined(TIMEMORY_CUDA_RUNTIME_API_CALL)
499# define TIMEMORY_CUDA_RUNTIME_API_CALL(...)
504# if !defined(TIMEMORY_CUDA_RUNTIME_API_CALL_THROW)
505# define TIMEMORY_CUDA_RUNTIME_API_CALL_THROW(...)
510# if !defined(TIMEMORY_CUDA_RUNTIME_CHECK_ERROR)
511# define TIMEMORY_CUDA_RUNTIME_CHECK_ERROR(...)
518#if defined(TIMEMORY_USE_NVML)
519# if !defined(TIMEMORY_NVML_RUNTIME_CHECK_ERROR)
520# define TIMEMORY_NVML_RUNTIME_CHECK_ERROR(apiFuncCall, ...) \
522 auto err = apiFuncCall; \
523 if(err != NVML_SUCCESS && (int) err != 0) \
526 "%s:%d: error check failed with: code %i -- %s.\nFunction " \
528 __FILE__, __LINE__, (int) err, nvmlErrorString(err), \
535# if !defined(TIMEMORY_NVML_RUNTIME_CHECK_ERROR)
536# define TIMEMORY_NVML_RUNTIME_CHECK_ERROR(...)
546#if defined(TIMEMORY_USE_HIP)
550# if !defined(TIMEMORY_HIP_RUNTIME_API_CALL)
551# define TIMEMORY_HIP_RUNTIME_API_CALL(apiFuncCall) \
553 ::tim::hip::error_t err = apiFuncCall; \
554 if(err != ::tim::hip::success_v && (int) err != 0) \
557 "%s:%d: error: function '%s' failed with error: %s.\n", \
558 __FILE__, __LINE__, #apiFuncCall, \
559 ::tim::hip::get_error_string(err)); \
566# if !defined(TIMEMORY_HIP_RUNTIME_API_CALL_THROW)
567# define TIMEMORY_HIP_RUNTIME_API_CALL_THROW(apiFuncCall) \
569 ::tim::hip::error_t err = apiFuncCall; \
570 if(err != ::tim::hip::success_v && (int) err != 0) \
572 char errmsg[std::numeric_limits<uint16_t>::max()]; \
574 "%s:%d: error: function '%s' failed with error: %s.\n", \
575 __FILE__, __LINE__, #apiFuncCall, \
576 ::tim::hip::get_error_string(err)); \
577 throw std::runtime_error(errmsg); \
584# if !defined(TIMEMORY_HIP_RUNTIME_CHECK_ERROR)
585# define TIMEMORY_HIP_RUNTIME_CHECK_ERROR(err) \
587 if(err != ::tim::hip::success_v && (int) err != 0) \
589 fprintf(stderr, "%s:%d: error check failed with: code %i -- %s.\n", \
590 __FILE__, __LINE__, (int) err, \
591 ::tim::hip::get_error_string(err)); \
602# if !defined(TIMEMORY_HIP_RUNTIME_API_CALL)
603# define TIMEMORY_HIP_RUNTIME_API_CALL(...)
608# if !defined(TIMEMORY_HIP_RUNTIME_API_CALL_THROW)
609# define TIMEMORY_HIP_RUNTIME_API_CALL_THROW(...)
614# if !defined(TIMEMORY_HIP_RUNTIME_CHECK_ERROR)
615# define TIMEMORY_HIP_RUNTIME_CHECK_ERROR(...)
628#if !defined(TIMEMORY_GPU_RUNTIME_API_CALL)
629# if defined(TIMEMORY_USE_CUDA)
630# define TIMEMORY_GPU_RUNTIME_API_CALL(...) \
631 TIMEMORY_CUDA_RUNTIME_API_CALL(__VA_ARGS__)
632# elif defined(TIMEMORY_USE_HIP)
633# define TIMEMORY_GPU_RUNTIME_API_CALL(...) \
634 TIMEMORY_HIP_RUNTIME_API_CALL(__VA_ARGS__)
636# define TIMEMORY_GPU_RUNTIME_API_CALL(...)
642#if !defined(TIMEMORY_GPU_RUNTIME_API_CALL_THROW)
643# if defined(TIMEMORY_USE_CUDA)
644# define TIMEMORY_GPU_RUNTIME_API_CALL_THROW(...) \
645 TIMEMORY_CUDA_RUNTIME_API_CALL_THROW(__VA_ARGS__)
646# elif defined(TIMEMORY_USE_HIP)
647# define TIMEMORY_GPU_RUNTIME_API_CALL_THROW(...) \
648 TIMEMORY_HIP_RUNTIME_API_CALL_THROW(__VA_ARGS__)
650# define TIMEMORY_GPU_RUNTIME_API_CALL_THROW(...)
656#if !defined(TIMEMORY_GPU_RUNTIME_CHECK_ERROR)
657# if defined(TIMEMORY_USE_CUDA)
658# define TIMEMORY_GPU_RUNTIME_CHECK_ERROR(...) \
659 TIMEMORY_CUDA_RUNTIME_CHECK_ERROR(__VA_ARGS__)
660# elif defined(TIMEMORY_USE_HIP)
661# define TIMEMORY_GPU_RUNTIME_CHECK_ERROR(...) \
662 TIMEMORY_HIP_RUNTIME_CHECK_ERROR(__VA_ARGS__)
664# define TIMEMORY_GPU_RUNTIME_CHECK_ERROR(...)
677#if !defined(TIMEMORY_USE_LIKWID)
681# if !defined(LIKWID_MARKER_INIT)
682# define LIKWID_MARKER_INIT
687# if !defined(LIKWID_MARKER_THREADINIT)
688# define LIKWID_MARKER_THREADINIT
693# if !defined(LIKWID_MARKER_SWITCH)
694# define LIKWID_MARKER_SWITCH
699# if !defined(LIKWID_MARKER_REGISTER)
700# define LIKWID_MARKER_REGISTER(...)
705# if !defined(LIKWID_MARKER_CLOSE)
706# define LIKWID_MARKER_CLOSE
711# if !defined(LIKWID_MARKER_GET)
712# define LIKWID_MARKER_GET(...)
717# if !defined(LIKWID_MARKER_RESET)
718# define LIKWID_MARKER_RESET(...)
723# if !defined(LIKWID_WITH_NVMON)
724# define LIKWID_NVMARKER_INIT
729# if !defined(LIKWID_WITH_NVMON)
730# define LIKWID_NVMARKER_THREADINIT
735# if !defined(LIKWID_WITH_NVMON)
736# define LIKWID_NVMARKER_SWITCH
741# if !defined(LIKWID_WITH_NVMON)
742# define LIKWID_NVMARKER_REGISTER(...)
747# if !defined(LIKWID_WITH_NVMON)
748# define LIKWID_NVMARKER_CLOSE
753# if !defined(LIKWID_WITH_NVMON)
754# define LIKWID_NVMARKER_GET(...)
759# if !defined(LIKWID_WITH_NVMON)
760# define LIKWID_NVMARKER_RESET(...)
773#if !defined(TIMEMORY_OMPT_API_TAG)
774# define TIMEMORY_OMPT_API_TAG TIMEMORY_API
778#if !defined(TIMEMORY_OMPT_CBDECL)
779# if defined(TIMEMORY_USE_OMPT)
780# define TIMEMORY_OMPT_CBDECL(NAME) (ompt_callback_t) & NAME
782# define TIMEMORY_OMPT_CBDECL(...)