Skip to content

Commit 3bc8ce5

Browse files
lechenyujprotze
authored andcommitted
[openmp] Add OMPT initialization in libomptarget
When loading libomptarget, the init function in libomptarget/src/rtl.cpp will search for the libomptarget_start_tool function using libdl. libomptarget_start_tool will pass those OMPT callbacks related to target constructs to libomptarget Differential Revision: https://reviews.llvm.org/D99803
1 parent 9bd29a7 commit 3bc8ce5

File tree

11 files changed

+289
-19
lines changed

11 files changed

+289
-19
lines changed

openmp/libomptarget/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,19 @@ set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda")
4848
set (LIBOMPTARGET_SYSTEM_TARGETS "")
4949
set (LIBOMPTARGET_TESTED_PLUGINS "")
5050

51+
# Check OMPT support
52+
set(OMPT_DEFAULT_IN_LIBOMPTARGET FALSE)
53+
if ((LIBOMP_HAVE_OMPT_SUPPORT) AND (NOT WIN32))
54+
set(OMPT_DEFAULT_IN_LIBOMPTARGET TRUE)
55+
endif()
56+
set(LIBOMP_OMPT_SUPPORT_IN_LIBOMPTARGET ${OMPT_DEFAULT_IN_LIBOMPTARGET} CACHE BOOL
57+
"OMPT-support in libomptarget?")
58+
if(LIBOMP_OMPT_SUPPORT_IN_LIBOMPTARGET)
59+
message(STATUS "OMPT enabled in libomptarget")
60+
else()
61+
message(STATUS "OMPT disabled in libomptarget")
62+
endif()
63+
5164
# Check whether using debug mode. In debug mode, allow dumping progress
5265
# messages at runtime by default. Otherwise, it can be enabled
5366
# independently using the LIBOMPTARGET_ENABLE_DEBUG option.

openmp/libomptarget/src/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,12 @@ set(LIBOMPTARGET_SRC_FILES
2020
${CMAKE_CURRENT_SOURCE_DIR}/omptarget.cpp
2121
)
2222

23-
set(LIBOMPTARGET_SRC_FILES ${LIBOMPTARGET_SRC_FILES} PARENT_SCOPE)
23+
if(LIBOMP_OMPT_SUPPORT_IN_LIBOMPTARGET)
24+
list(APPEND LIBOMPTARGET_SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/ompt-target.cpp)
25+
list(APPEND LIBOMPTARGET_LLVM_INCLUDE_DIRS ${LIBOMP_INCLUDE_DIR})
26+
endif()
2427

28+
set(LIBOMPTARGET_SRC_FILES ${LIBOMPTARGET_SRC_FILES} PARENT_SCOPE)
2529
include_directories(${LIBOMPTARGET_LLVM_INCLUDE_DIRS})
2630

2731
# Build libomptarget library with libdl dependency.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#include "ompt-target.h"
2+
3+
ompt_target_callbacks_active_t ompt_target_enabled;

openmp/libomptarget/src/ompt-target.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef LIBOMPTARGET_OMPT_TARGET_H
2+
#define LIBOMPTARGET_OMPT_TARGET_H
3+
4+
#include "omp-tools.h"
5+
6+
#define _OMP_EXTERN extern "C"
7+
8+
#define OMPT_WEAK_ATTRIBUTE __attribute__((weak))
9+
10+
// The following structs are used to pass target-related OMPT callbacks to
11+
// libomptarget. The structs' definitions should be in sync with the definitions
12+
// in libomptarget/src/ompt_internal.h
13+
14+
/* Bitmap to mark OpenMP 5.1 target events as registered*/
15+
typedef struct ompt_target_callbacks_active_s {
16+
unsigned int enabled : 1;
17+
#define ompt_event_macro(event, callback, eventid) unsigned int event : 1;
18+
19+
FOREACH_OMPT_51_TARGET_EVENT(ompt_event_macro)
20+
21+
#undef ompt_event_macro
22+
} ompt_target_callbacks_active_t;
23+
24+
extern ompt_target_callbacks_active_t ompt_target_enabled;
25+
26+
_OMP_EXTERN OMPT_WEAK_ATTRIBUTE bool
27+
libomp_start_tool(ompt_target_callbacks_active_t *libomptarget_ompt_enabled);
28+
29+
#endif // LIBOMPTARGET_OMPT_TARGET_H

openmp/libomptarget/src/rtl.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
#include "device.h"
1515
#include "private.h"
1616

17+
#if OMPT_SUPPORT
18+
#include "ompt-target.h"
19+
#endif
20+
1721
#include <cassert>
1822
#include <cstdlib>
1923
#include <cstring>
@@ -181,6 +185,19 @@ void RTLsTy::LoadRTLs() {
181185
dlsym(dynlib_handle, "__tgt_rtl_print_device_info");
182186
}
183187

188+
#if OMPT_SUPPORT
189+
DP("OMPT_SUPPORT is enabled in libomptarget\n");
190+
DP("Init OMPT for libomptarget\n");
191+
if (libomp_start_tool) {
192+
DP("Retrieve libomp_start_tool successfully\n");
193+
if (!libomp_start_tool(&ompt_target_enabled)) {
194+
DP("Turn off OMPT in libomptarget because libomp_start_tool returns "
195+
"false\n");
196+
memset(&ompt_target_enabled, 0, sizeof(ompt_target_enabled));
197+
}
198+
}
199+
#endif
200+
184201
DP("RTLs loaded!\n");
185202

186203
return;

openmp/runtime/cmake/config-ix.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ else()
329329
set(LIBOMP_HAVE_OMPT_SUPPORT FALSE)
330330
endif()
331331
endif()
332+
set(LIBOMP_HAVE_OMPT_SUPPORT ${LIBOMP_HAVE_OMPT_SUPPORT} PARENT_SCOPE)
332333

333334
# Check if HWLOC support is available
334335
if(${LIBOMP_USE_HWLOC})

openmp/runtime/src/exports_so.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ VERSION {
2525
#
2626
# OMPT API
2727
#
28-
ompt_start_tool; # OMPT start interface
28+
ompt_start_tool; # OMPT start interface
29+
libomp_start_tool; # OMPT start interface for libomptarget
30+
libomp_ompt_*; # OMPT callback functions
2931

3032
ompc_*; # omp.h renames some standard functions to ompc_*.
3133
kmp_*; # Intel extensions.

openmp/runtime/src/include/omp-tools.h.var

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
macro (kmp_mutex_impl_queuing, 2) /* based on some fair policy */ \
109109
macro (kmp_mutex_impl_speculative, 3) /* based on HW-supported speculation */
110110

111-
#define FOREACH_OMPT_EVENT(macro) \
111+
#define FOREACH_OMPT_HOST_EVENT(macro) \
112112
\
113113
/*--- Mandatory Events ---*/ \
114114
macro (ompt_callback_thread_begin, ompt_callback_thread_begin_t, 1) /* thread begin */ \
@@ -121,17 +121,9 @@
121121
macro (ompt_callback_task_schedule, ompt_callback_task_schedule_t, 6) /* task schedule */ \
122122
macro (ompt_callback_implicit_task, ompt_callback_implicit_task_t, 7) /* implicit task */ \
123123
\
124-
macro (ompt_callback_target, ompt_callback_target_t, 8) /* target */ \
125-
macro (ompt_callback_target_data_op, ompt_callback_target_data_op_t, 9) /* target data op */ \
126-
macro (ompt_callback_target_submit, ompt_callback_target_submit_t, 10) /* target submit */ \
127124
\
128125
macro (ompt_callback_control_tool, ompt_callback_control_tool_t, 11) /* control tool */ \
129126
\
130-
macro (ompt_callback_device_initialize, ompt_callback_device_initialize_t, 12) /* device initialize */ \
131-
macro (ompt_callback_device_finalize, ompt_callback_device_finalize_t, 13) /* device finalize */ \
132-
\
133-
macro (ompt_callback_device_load, ompt_callback_device_load_t, 14) /* device load */ \
134-
macro (ompt_callback_device_unload, ompt_callback_device_unload_t, 15) /* device unload */ \
135127
\
136128
/* Optional Events */ \
137129
macro (ompt_callback_sync_region_wait, ompt_callback_sync_region_t, 16) /* sync region wait begin or end */ \
@@ -145,7 +137,6 @@
145137
\
146138
macro (ompt_callback_masked, ompt_callback_masked_t, 21) /* task at masked begin or end */ \
147139
\
148-
macro (ompt_callback_target_map, ompt_callback_target_map_t, 22) /* target map */ \
149140
\
150141
macro (ompt_callback_sync_region, ompt_callback_sync_region_t, 23) /* sync region begin or end */ \
151142
\
@@ -164,11 +155,48 @@
164155
macro (ompt_callback_reduction, ompt_callback_sync_region_t, 31) /* reduction */ \
165156
\
166157
macro (ompt_callback_dispatch, ompt_callback_dispatch_t, 32) /* dispatch of work */ \
158+
macro (ompt_callback_error, ompt_callback_error_t, 37) /* error */
159+
160+
161+
#define FOREACH_OMPT_DEVICE_EVENT(macro) \
162+
macro (ompt_callback_device_initialize, ompt_callback_device_initialize_t, 12) /* device initialize */ \
163+
macro (ompt_callback_device_finalize, ompt_callback_device_finalize_t, 13) /* device finalize */ \
164+
\
165+
macro (ompt_callback_device_load, ompt_callback_device_load_t, 14) /* device load */ \
166+
macro (ompt_callback_device_unload, ompt_callback_device_unload_t, 15) /* device unload */ \
167+
168+
169+
#define FOREACH_OMPT_NOEMI_EVENT(macro) \
170+
macro (ompt_callback_target, ompt_callback_target_t, 8) /* target */ \
171+
macro (ompt_callback_target_data_op, ompt_callback_target_data_op_t, 9) /* target data op */ \
172+
macro (ompt_callback_target_submit, ompt_callback_target_submit_t, 10) /* target submit */ \
173+
macro (ompt_callback_target_map, ompt_callback_target_map_t, 22) /* target map */ \
174+
175+
176+
#define FOREACH_OMPT_EMI_EVENT(macro) \
167177
macro (ompt_callback_target_emi, ompt_callback_target_emi_t, 33) /* target */ \
168178
macro (ompt_callback_target_data_op_emi,ompt_callback_target_data_op_emi_t,34) /* target data op */ \
169179
macro (ompt_callback_target_submit_emi, ompt_callback_target_submit_emi_t, 35) /* target submit */ \
170180
macro (ompt_callback_target_map_emi, ompt_callback_target_map_emi_t, 36) /* target map */ \
171-
macro (ompt_callback_error, ompt_callback_error_t, 37) /* error */
181+
182+
#define FOREACH_OMPT_50_TARGET_EVENT(macro) \
183+
FOREACH_OMPT_DEVICE_EVENT(macro) \
184+
FOREACH_OMPT_NOEMI_EVENT(macro)
185+
186+
#define FOREACH_OMPT_51_TARGET_EVENT(macro) \
187+
FOREACH_OMPT_DEVICE_EVENT(macro) \
188+
FOREACH_OMPT_EMI_EVENT(macro)
189+
190+
#define FOREACH_OMPT_EVENT(macro) \
191+
FOREACH_OMPT_HOST_EVENT(macro) \
192+
FOREACH_OMPT_DEVICE_EVENT(macro) \
193+
FOREACH_OMPT_NOEMI_EVENT(macro) \
194+
FOREACH_OMPT_EMI_EVENT(macro)
195+
196+
#define FOREACH_OMPT_51_EVENT(macro) \
197+
FOREACH_OMPT_HOST_EVENT(macro) \
198+
FOREACH_OMPT_DEVICE_EVENT(macro) \
199+
FOREACH_OMPT_EMI_EVENT(macro)
172200

173201
/*****************************************************************************
174202
* implementation specific types

openmp/runtime/src/ompt-event-specific.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@
8686

8787
#define ompt_callback_masked_implemented ompt_event_MAY_ALWAYS_OPTIONAL
8888

89-
#define ompt_callback_target_map_implemented ompt_event_UNIMPLEMENTED
90-
#define ompt_callback_target_map_emi_implemented ompt_event_UNIMPLEMENTED
89+
#define ompt_callback_target_map_implemented ompt_event_MAY_ALWAYS_OPTIONAL
90+
#define ompt_callback_target_map_emi_implemented ompt_event_MAY_ALWAYS_OPTIONAL
9191

9292
#define ompt_callback_sync_region_implemented ompt_event_MAY_ALWAYS_OPTIONAL
9393

openmp/runtime/src/ompt-general.cpp

Lines changed: 132 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ enum tool_setting_e {
8686

8787
ompt_callbacks_active_t ompt_enabled;
8888

89+
ompt_target_callbacks_active_t ompt_target_enabled;
90+
8991
ompt_state_info_t ompt_state_info[] = {
9092
#define ompt_state_macro(state, code) {#state, state},
9193
FOREACH_OMPT_STATE(ompt_state_macro)
@@ -100,6 +102,10 @@ kmp_mutex_impl_info_t kmp_mutex_impl_info[] = {
100102

101103
ompt_callbacks_internal_t ompt_callbacks;
102104

105+
ompt_target_callbacks_internal_t ompt_target_callbacks;
106+
107+
ompt_callbacks_internal_noemi_t ompt_callbacks_noemi;
108+
103109
static ompt_start_tool_result_t *ompt_start_tool_result = NULL;
104110

105111
#if KMP_OS_WINDOWS
@@ -125,6 +131,51 @@ OMPT_API_ROUTINE ompt_data_t *ompt_get_thread_data(void);
125131
typedef ompt_start_tool_result_t *(*ompt_start_tool_t)(unsigned int,
126132
const char *);
127133

134+
_OMP_EXTERN OMPT_WEAK_ATTRIBUTE bool
135+
libomp_start_tool(ompt_target_callbacks_active_t *libomptarget_ompt_enabled) {
136+
if (!TCR_4(__kmp_init_middle)) {
137+
__kmp_middle_initialize();
138+
}
139+
bool ret = false;
140+
libomptarget_ompt_enabled->enabled = ompt_enabled.enabled;
141+
if (ompt_enabled.enabled) {
142+
ret = true;
143+
#define ompt_event_macro(event_name, callback_type, event_id) \
144+
libomptarget_ompt_enabled->event_name = ompt_target_enabled.event_name;
145+
146+
FOREACH_OMPT_51_TARGET_EVENT(ompt_event_macro)
147+
#undef ompt_event_macro
148+
}
149+
return ret;
150+
}
151+
152+
void ompt_callback_target_data_op_emi_wrapper(
153+
ompt_scope_endpoint_t endpoint, ompt_data_t *target_task_data,
154+
ompt_data_t *target_data, ompt_id_t *host_op_id,
155+
ompt_target_data_op_t optype, void *src_addr, int src_device_num,
156+
void *dest_addr, int dest_device_num, size_t bytes,
157+
const void *codeptr_ra) {}
158+
159+
void ompt_callback_target_emi_wrapper(ompt_target_t kind,
160+
ompt_scope_endpoint_t endpoint,
161+
int device_num, ompt_data_t *task_data,
162+
ompt_data_t *target_task_data,
163+
ompt_data_t *target_data,
164+
const void *codeptr_ra) {}
165+
166+
void ompt_callback_target_map_emi_wrapper(ompt_data_t *target_data,
167+
unsigned int nitems, void **host_addr,
168+
void **device_addr, size_t *bytes,
169+
unsigned int *mapping_flags,
170+
const void *codeptr_ra) {}
171+
172+
void ompt_callback_target_submit_emi_wrapper(ompt_scope_endpoint_t endpoint,
173+
ompt_data_t *target_data,
174+
ompt_id_t *host_op_id,
175+
unsigned int requested_num_teams) {
176+
177+
}
178+
128179
#if KMP_OS_DARWIN
129180

130181
// While Darwin supports weak symbols, the library that wishes to provide a new
@@ -571,7 +622,37 @@ OMPT_API_ROUTINE ompt_set_result_t ompt_set_callback(ompt_callbacks_t which,
571622
else \
572623
return ompt_set_always;
573624

574-
FOREACH_OMPT_EVENT(ompt_event_macro)
625+
FOREACH_OMPT_HOST_EVENT(ompt_event_macro)
626+
627+
#undef ompt_event_macro
628+
629+
#define ompt_event_macro(event_name, callback_type, event_id) \
630+
case event_name: \
631+
ompt_target_callbacks.ompt_callback(event_name) = (callback_type)callback; \
632+
ompt_target_enabled.event_name = (callback != 0); \
633+
if (callback) \
634+
return ompt_event_implementation_status(event_name); \
635+
else \
636+
return ompt_set_always;
637+
638+
FOREACH_OMPT_51_TARGET_EVENT(ompt_event_macro)
639+
640+
#undef ompt_event_macro
641+
642+
#define ompt_event_macro(event_name, callback_type, event_id) \
643+
case event_name: \
644+
ompt_callbacks_noemi.ompt_callback(event_name) = (callback_type)callback; \
645+
ompt_target_enabled.ompt_emi_event(event_name) = (callback != 0); \
646+
if (callback) { \
647+
ompt_target_callbacks.ompt_emi_callback(event_name) = \
648+
(ompt_emi_callback_type(event_name))(&ompt_emi_wrapper(event_name)); \
649+
return ompt_event_implementation_status(event_name); \
650+
} else { \
651+
ompt_target_callbacks.ompt_emi_callback(event_name) = NULL; \
652+
return ompt_set_always; \
653+
}
654+
655+
FOREACH_OMPT_NOEMI_EVENT(ompt_event_macro)
575656

576657
#undef ompt_event_macro
577658

@@ -598,7 +679,56 @@ OMPT_API_ROUTINE int ompt_get_callback(ompt_callbacks_t which,
598679
return ompt_get_callback_failure; \
599680
}
600681

601-
FOREACH_OMPT_EVENT(ompt_event_macro)
682+
FOREACH_OMPT_HOST_EVENT(ompt_event_macro)
683+
684+
#undef ompt_event_macro
685+
686+
#define ompt_event_macro(event_name, callback_type, event_id) \
687+
case event_name: { \
688+
ompt_callback_t mycb = \
689+
(ompt_callback_t)ompt_target_callbacks.ompt_callback(event_name); \
690+
if (ompt_target_enabled.event_name && mycb) { \
691+
*callback = mycb; \
692+
return ompt_get_callback_success; \
693+
} \
694+
return ompt_get_callback_failure; \
695+
}
696+
697+
FOREACH_OMPT_DEVICE_EVENT(ompt_event_macro)
698+
699+
#undef ompt_event_macro
700+
701+
#define ompt_event_macro(event_name, callback_type, event_id) \
702+
case ompt_emi_event(event_name): { \
703+
ompt_callback_t mycb = \
704+
(ompt_callback_t)ompt_target_callbacks.ompt_emi_callback(event_name); \
705+
if (ompt_target_enabled.ompt_emi_event(event_name) && \
706+
mycb != (ompt_callback_t)(&ompt_emi_wrapper(event_name))) { \
707+
*callback = mycb; \
708+
return ompt_get_callback_success; \
709+
} \
710+
return ompt_get_callback_failure; \
711+
}
712+
713+
FOREACH_OMPT_NOEMI_EVENT(ompt_event_macro)
714+
715+
#undef ompt_event_macro
716+
717+
#define ompt_event_macro(event_name, callback_type, event_id) \
718+
case event_name: { \
719+
ompt_callback_t mycb = \
720+
(ompt_callback_t)ompt_callbacks_noemi.ompt_callback(event_name); \
721+
ompt_callback_t wrapper = \
722+
(ompt_callback_t)ompt_target_callbacks.ompt_emi_callback(event_name); \
723+
if (ompt_target_enabled.ompt_emi_event(event_name) && \
724+
wrapper == (ompt_callback_t)(&ompt_emi_wrapper(event_name))) { \
725+
*callback = mycb; \
726+
return ompt_get_callback_success; \
727+
} \
728+
return ompt_get_callback_failure; \
729+
}
730+
731+
FOREACH_OMPT_NOEMI_EVENT(ompt_event_macro)
602732

603733
#undef ompt_event_macro
604734

0 commit comments

Comments
 (0)