10b57cec5SDimitry Andric /* 20b57cec5SDimitry Andric * ompt-internal.h - header of OMPT internal data structures 30b57cec5SDimitry Andric */ 40b57cec5SDimitry Andric 50b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 80b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 90b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef __OMPT_INTERNAL_H__ 140b57cec5SDimitry Andric #define __OMPT_INTERNAL_H__ 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "ompt-event-specific.h" 170b57cec5SDimitry Andric #include "omp-tools.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric #define OMPT_VERSION 1 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric #define _OMP_EXTERN extern "C" 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric #define OMPT_INVOKER(x) \ 240b57cec5SDimitry Andric ((x == fork_context_gnu) ? ompt_parallel_invoker_program \ 250b57cec5SDimitry Andric : ompt_parallel_invoker_runtime) 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric #define ompt_callback(e) e##_callback 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric typedef struct ompt_callbacks_internal_s { 300b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid) \ 310b57cec5SDimitry Andric callback ompt_callback(event); 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric FOREACH_OMPT_EVENT(ompt_event_macro) 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric #undef ompt_event_macro 360b57cec5SDimitry Andric } ompt_callbacks_internal_t; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric typedef struct ompt_callbacks_active_s { 390b57cec5SDimitry Andric unsigned int enabled : 1; 400b57cec5SDimitry Andric #define ompt_event_macro(event, callback, eventid) unsigned int event : 1; 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric FOREACH_OMPT_EVENT(ompt_event_macro) 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric #undef ompt_event_macro 450b57cec5SDimitry Andric } ompt_callbacks_active_t; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric #define TASK_TYPE_DETAILS_FORMAT(info) \ 480b57cec5SDimitry Andric ((info->td_flags.task_serial || info->td_flags.tasking_ser) \ 490b57cec5SDimitry Andric ? ompt_task_undeferred \ 500b57cec5SDimitry Andric : 0x0) | \ 510b57cec5SDimitry Andric ((!(info->td_flags.tiedness)) ? ompt_task_untied : 0x0) | \ 520b57cec5SDimitry Andric (info->td_flags.final ? ompt_task_final : 0x0) | \ 530b57cec5SDimitry Andric (info->td_flags.merged_if0 ? ompt_task_mergeable : 0x0) 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric typedef struct { 560b57cec5SDimitry Andric ompt_frame_t frame; 570b57cec5SDimitry Andric ompt_data_t task_data; 580b57cec5SDimitry Andric struct kmp_taskdata *scheduling_parent; 590b57cec5SDimitry Andric int thread_num; 6081ad6265SDimitry Andric ompt_dispatch_chunk_t dispatch_chunk; 610b57cec5SDimitry Andric } ompt_task_info_t; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric typedef struct { 640b57cec5SDimitry Andric ompt_data_t parallel_data; 650b57cec5SDimitry Andric void *master_return_address; 660b57cec5SDimitry Andric } ompt_team_info_t; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric typedef struct ompt_lw_taskteam_s { 690b57cec5SDimitry Andric ompt_team_info_t ompt_team_info; 700b57cec5SDimitry Andric ompt_task_info_t ompt_task_info; 710b57cec5SDimitry Andric int heap; 720b57cec5SDimitry Andric struct ompt_lw_taskteam_s *parent; 730b57cec5SDimitry Andric } ompt_lw_taskteam_t; 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric typedef struct { 760b57cec5SDimitry Andric ompt_data_t thread_data; 770b57cec5SDimitry Andric ompt_data_t task_data; /* stored here from implicit barrier-begin until 780b57cec5SDimitry Andric implicit-task-end */ 7906c3fb27SDimitry Andric ompt_data_t target_task_data; /* required by target support */ 800b57cec5SDimitry Andric void *return_address; /* stored here on entry of runtime */ 810b57cec5SDimitry Andric ompt_state_t state; 820b57cec5SDimitry Andric ompt_wait_id_t wait_id; 830b57cec5SDimitry Andric int ompt_task_yielded; 84489b1cf2SDimitry Andric int parallel_flags; // information for the last parallel region invoked 850b57cec5SDimitry Andric void *idle_frame; 860b57cec5SDimitry Andric } ompt_thread_info_t; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric extern ompt_callbacks_internal_t ompt_callbacks; 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric #if OMPT_SUPPORT && OMPT_OPTIONAL 910b57cec5SDimitry Andric #if USE_FAST_MEMORY 920b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_fast_allocate 930b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_fast_free 940b57cec5SDimitry Andric #else 950b57cec5SDimitry Andric #define KMP_OMPT_DEPS_ALLOC __kmp_thread_malloc 960b57cec5SDimitry Andric #define KMP_OMPT_DEPS_FREE __kmp_thread_free 970b57cec5SDimitry Andric #endif 980b57cec5SDimitry Andric #endif /* OMPT_SUPPORT && OMPT_OPTIONAL */ 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric #ifdef __cplusplus 1010b57cec5SDimitry Andric extern "C" { 1020b57cec5SDimitry Andric #endif 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric void ompt_pre_init(void); 1050b57cec5SDimitry Andric void ompt_post_init(void); 1060b57cec5SDimitry Andric void ompt_fini(void); 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric #define OMPT_GET_RETURN_ADDRESS(level) __builtin_return_address(level) 1090b57cec5SDimitry Andric #define OMPT_GET_FRAME_ADDRESS(level) __builtin_frame_address(level) 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric int __kmp_control_tool(uint64_t command, uint64_t modifier, void *arg); 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric extern ompt_callbacks_active_t ompt_enabled; 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric #if KMP_OS_WINDOWS 1160b57cec5SDimitry Andric #define UNLIKELY(x) (x) 1170b57cec5SDimitry Andric #define OMPT_NOINLINE __declspec(noinline) 1180b57cec5SDimitry Andric #else 1190b57cec5SDimitry Andric #define UNLIKELY(x) __builtin_expect(!!(x), 0) 1200b57cec5SDimitry Andric #define OMPT_NOINLINE __attribute__((noinline)) 1210b57cec5SDimitry Andric #endif 1220b57cec5SDimitry Andric 1230b57cec5SDimitry Andric #ifdef __cplusplus 124fe6060f1SDimitry Andric } 1250b57cec5SDimitry Andric #endif 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric #endif 128