@@ -86,6 +86,8 @@ enum tool_setting_e {
8686
8787ompt_callbacks_active_t ompt_enabled;
8888
89+ ompt_target_callbacks_active_t ompt_target_enabled;
90+
8991ompt_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
101103ompt_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+
103109static 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);
125131typedef 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