1*0b57cec5SDimitry Andric /* 2*0b57cec5SDimitry Andric * ompt-internal.h - header of OMPT internal data structures 3*0b57cec5SDimitry Andric */ 4*0b57cec5SDimitry Andric 5*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 8*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 9*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #ifndef __OMPT_INTERNAL_H__ 14*0b57cec5SDimitry Andric #define __OMPT_INTERNAL_H__ 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric #include "ompt-event-specific.h" 17*0b57cec5SDimitry Andric #include "omp-tools.h" 18*0b57cec5SDimitry Andric 19*0b57cec5SDimitry Andric #define OMPT_VERSION 1 20*0b57cec5SDimitry Andric 21*0b57cec5SDimitry Andric #define _OMP_EXTERN extern "C" 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andric #define OMPT_INVOKER(x) \ 24*0b57cec5SDimitry Andric ((x == fork_context_gnu) ? ompt_parallel_invoker_program \ 25*0b57cec5SDimitry Andric : ompt_parallel_invoker_runtime) 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric #define ompt_callback(e) e##_callback 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric typedef struct ompt_callbacks_internal_s { 30*0b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid) \ 31*0b57cec5SDimitry Andric callback ompt_callback(event); 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric FOREACH_OMPT_EVENT(ompt_event_macro) 34*0b57cec5SDimitry Andric 35*0b57cec5SDimitry Andric #undef ompt_event_macro 36*0b57cec5SDimitry Andric } ompt_callbacks_internal_t; 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric typedef struct ompt_callbacks_active_s { 39*0b57cec5SDimitry Andric unsigned int enabled : 1; 40*0b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid) unsigned int event : 1; 41*0b57cec5SDimitry Andric 42*0b57cec5SDimitry Andric FOREACH_OMPT_EVENT(ompt_event_macro) 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric #undef ompt_event_macro 45*0b57cec5SDimitry Andric } ompt_callbacks_active_t; 46*0b57cec5SDimitry Andric 47*0b57cec5SDimitry Andric #define TASK_TYPE_DETAILS_FORMAT(info) \ 48*0b57cec5SDimitry Andric ((info->td_flags.task_serial || info->td_flags.tasking_ser) \ 49*0b57cec5SDimitry Andric ? ompt_task_undeferred \ 50*0b57cec5SDimitry Andric : 0x0) | \ 51*0b57cec5SDimitry Andric ((!(info->td_flags.tiedness)) ? ompt_task_untied : 0x0) | \ 52*0b57cec5SDimitry Andric (info->td_flags.final ? ompt_task_final : 0x0) | \ 53*0b57cec5SDimitry Andric (info->td_flags.merged_if0 ? ompt_task_mergeable : 0x0) 54*0b57cec5SDimitry Andric 55*0b57cec5SDimitry Andric typedef struct { 56*0b57cec5SDimitry Andric ompt_frame_t frame; 57*0b57cec5SDimitry Andric ompt_data_t task_data; 58*0b57cec5SDimitry Andric struct kmp_taskdata *scheduling_parent; 59*0b57cec5SDimitry Andric int thread_num; 60*0b57cec5SDimitry Andric int ndeps; 61*0b57cec5SDimitry Andric ompt_dependence_t *deps; 62*0b57cec5SDimitry Andric } ompt_task_info_t; 63*0b57cec5SDimitry Andric 64*0b57cec5SDimitry Andric typedef struct { 65*0b57cec5SDimitry Andric ompt_data_t parallel_data; 66*0b57cec5SDimitry Andric void *master_return_address; 67*0b57cec5SDimitry Andric } ompt_team_info_t; 68*0b57cec5SDimitry Andric 69*0b57cec5SDimitry Andric typedef struct ompt_lw_taskteam_s { 70*0b57cec5SDimitry Andric ompt_team_info_t ompt_team_info; 71*0b57cec5SDimitry Andric ompt_task_info_t ompt_task_info; 72*0b57cec5SDimitry Andric int heap; 73*0b57cec5SDimitry Andric struct ompt_lw_taskteam_s *parent; 74*0b57cec5SDimitry Andric } ompt_lw_taskteam_t; 75*0b57cec5SDimitry Andric 76*0b57cec5SDimitry Andric typedef struct { 77*0b57cec5SDimitry Andric ompt_data_t thread_data; 78*0b57cec5SDimitry Andric ompt_data_t task_data; /* stored here from implicit barrier-begin until 79*0b57cec5SDimitry Andric implicit-task-end */ 80*0b57cec5SDimitry Andric void *return_address; /* stored here on entry of runtime */ 81*0b57cec5SDimitry Andric ompt_state_t state; 82*0b57cec5SDimitry Andric ompt_wait_id_t wait_id; 83*0b57cec5SDimitry Andric int ompt_task_yielded; 84*0b57cec5SDimitry Andric void *idle_frame; 85*0b57cec5SDimitry Andric } ompt_thread_info_t; 86*0b57cec5SDimitry Andric 87*0b57cec5SDimitry Andric extern ompt_callbacks_internal_t ompt_callbacks; 88*0b57cec5SDimitry Andric 89*0b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL 90*0b57cec5SDimitry Andric #if USE_FAST_MEMORY 91*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_fast_allocate 92*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_fast_free 93*0b57cec5SDimitry Andric #else 94*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_thread_malloc 95*0b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_thread_free 96*0b57cec5SDimitry Andric #endif 97*0b57cec5SDimitry Andric #endif /* OMPT_SUPPORT && OMPT_OPTIONAL */ 98*0b57cec5SDimitry Andric 99*0b57cec5SDimitry Andric #ifdef __cplusplus 100*0b57cec5SDimitry Andric extern "C" { 101*0b57cec5SDimitry Andric #endif 102*0b57cec5SDimitry Andric 103*0b57cec5SDimitry Andric void ompt_pre_init(void); 104*0b57cec5SDimitry Andric void ompt_post_init(void); 105*0b57cec5SDimitry Andric void ompt_fini(void); 106*0b57cec5SDimitry Andric 107*0b57cec5SDimitry Andric #define OMPT_GET_RETURN_ADDRESS(level) __builtin_return_address(level) 108*0b57cec5SDimitry Andric #define OMPT_GET_FRAME_ADDRESS(level) __builtin_frame_address(level) 109*0b57cec5SDimitry Andric 110*0b57cec5SDimitry Andric int __kmp_control_tool(uint64_t command, uint64_t modifier, void *arg); 111*0b57cec5SDimitry Andric 112*0b57cec5SDimitry Andric extern ompt_callbacks_active_t ompt_enabled; 113*0b57cec5SDimitry Andric 114*0b57cec5SDimitry Andric #if KMP_OS_WINDOWS 115*0b57cec5SDimitry Andric #define UNLIKELY(x) (x) 116*0b57cec5SDimitry Andric #define OMPT_NOINLINE __declspec(noinline) 117*0b57cec5SDimitry Andric #else 118*0b57cec5SDimitry Andric #define UNLIKELY(x) __builtin_expect(!!(x), 0) 119*0b57cec5SDimitry Andric #define OMPT_NOINLINE __attribute__((noinline)) 120*0b57cec5SDimitry Andric #endif 121*0b57cec5SDimitry Andric 122*0b57cec5SDimitry Andric #ifdef __cplusplus 123*0b57cec5SDimitry Andric }; 124*0b57cec5SDimitry Andric #endif 125*0b57cec5SDimitry Andric 126*0b57cec5SDimitry Andric #endif 127