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