Index: openmp/tools/multiplex/ompt-multiplex.h =================================================================== --- openmp/tools/multiplex/ompt-multiplex.h +++ openmp/tools/multiplex/ompt-multiplex.h @@ -87,7 +87,13 @@ macro(callback_flush, ompt_callback_flush_t, 29); \ macro(callback_cancel, ompt_callback_cancel_t, 30); \ macro(callback_reduction, ompt_callback_sync_region_t, 31); \ - macro(callback_dispatch, ompt_callback_dispatch_t, 32); + macro(callback_dispatch, ompt_callback_dispatch_t, 32); \ + macro(callback_target_emi, ompt_callback_target_emi_t, 33); \ + macro(callback_target_data_op_emi, ompt_callback_target_data_op_emi_t, 34); \ + macro(callback_target_submit_emi, ompt_callback_target_submit_emi_t, 35); \ + macro(callback_target_map_emi, ompt_callback_target_map_emi_t, 36); \ + macro(callback_error, ompt_callback_error_t, 37); + typedef struct ompt_multiplex_callbacks_s { #define ompt_event_macro(event, callback, eventid) callback ompt_##event @@ -184,7 +190,6 @@ #endif } - static ompt_data_t *ompt_multiplex_get_own_target_data(ompt_data_t *data) { #ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TARGET_DATA return ompt_multiplex_get_own_ompt_data(data); @@ -193,8 +198,6 @@ #endif } - - static ompt_data_t *ompt_multiplex_get_client_thread_data(ompt_data_t *data) { #ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_THREAD_DATA return ompt_multiplex_get_client_ompt_data(data); @@ -219,7 +222,6 @@ #endif } - static ompt_data_t *ompt_multiplex_get_client_target_data(ompt_data_t *data) { #ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TARGET_DATA return ompt_multiplex_get_own_ompt_data(data); @@ -850,6 +852,151 @@ } } + +static void ompt_multiplex_callback_target_emi( + ompt_target_t kind, ompt_scope_endpoint_t endpoint, int device_num, + ompt_data_t *task_data, ompt_data_t *target_task_data, + ompt_data_t *target_data, const void *codeptr_ra) { + if (endpoint == ompt_scope_begin) { +#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TARGET_DATA + ompt_multiplex_allocate_data_pair(target_data); +#endif +#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA + if (target_task_data->ptr == NULL) + ompt_multiplex_allocate_data_pair(target_task_data); +#endif + if (ompt_multiplex_own_callbacks.ompt_callback_target_emi) { + ompt_multiplex_own_callbacks.ompt_callback_target_emi( + kind, endpoint, device_num, + ompt_multiplex_get_own_task_data(task_data), + ompt_multiplex_get_own_task_data(target_task_data), + ompt_multiplex_get_own_target_data(target_data), codeptr_ra); + } + if (ompt_multiplex_client_callbacks.ompt_callback_target_emi) { + ompt_multiplex_client_callbacks.ompt_callback_target_emi( + kind, endpoint, device_num, + ompt_multiplex_get_client_task_data(task_data), + ompt_multiplex_get_client_task_data(target_task_data), + ompt_multiplex_get_client_target_data(target_data), codeptr_ra); + } + } else { +// defines to make sure, callbacks are called in correct order depending on +// defines set by the user +#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TARGET_DATA) || \ + !defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TARGET_DATA) + if (ompt_multiplex_own_callbacks.ompt_callback_target_emi) { + ompt_multiplex_own_callbacks.ompt_callback_target_emi( + kind, endpoint, device_num, + ompt_multiplex_get_own_task_data(task_data), + ompt_multiplex_get_own_task_data(target_task_data), + ompt_multiplex_get_own_target_data(target_data), codeptr_ra); + } +#endif + + if (ompt_multiplex_client_callbacks.ompt_callback_target_emi) { + ompt_multiplex_client_callbacks.ompt_callback_target_emi( + kind, endpoint, device_num, + ompt_multiplex_get_client_task_data(task_data), + ompt_multiplex_get_client_task_data(target_task_data), + ompt_multiplex_get_client_target_data(target_data), codeptr_ra); + } + +#if defined(OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TARGET_DATA) && \ + !defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TARGET_DATA) + if (ompt_multiplex_own_callbacks.ompt_callback_target_emi) { + ompt_multiplex_own_callbacks.ompt_callback_target_emi( + kind, endpoint, device_num, + ompt_multiplex_get_own_task_data(task_data), + ompt_multiplex_get_own_task_data(target_task_data), + ompt_multiplex_get_own_target_data(target_data), codeptr_ra); + } +#endif + +#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TARGET_DATA + ompt_multiplex_free_data_pair(target_data); +#endif + +#ifndef OMPT_MULTIPLEX_CUSTOM_GET_CLIENT_TASK_DATA + ompt_multiplex_free_data_pair(target_task_data); +#endif + +#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TARGET_DATA) + OMPT_MULTIPLEX_CUSTOM_DELETE_TARGET_DATA(target_data); +#endif + +#if defined(OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA) + OMPT_MULTIPLEX_CUSTOM_DELETE_TASK_DATA(target_task_data); +#endif + } +} + +static void ompt_multiplex_callback_target_data_op_emi( + ompt_scope_endpoint_t endpoint, ompt_data_t *target_task_data, + ompt_data_t *target_data, ompt_id_t *host_op_id, + ompt_target_data_op_t optype, void *src_addr, int src_device_num, + void *dest_addr, int dest_device_num, size_t bytes, + const void *codeptr_ra) { + if (ompt_multiplex_own_callbacks.ompt_callback_target_data_op_emi) { + ompt_multiplex_own_callbacks.ompt_callback_target_data_op_emi( + endpoint, ompt_multiplex_get_own_task_data(target_task_data), + ompt_multiplex_get_own_target_data(target_data), host_op_id, optype, + src_addr, src_device_num, dest_addr, bytes, dest_device_num, + codeptr_ra); + } + if (ompt_multiplex_client_callbacks.ompt_callback_target_data_op_emi) { + ompt_multiplex_client_callbacks.ompt_callback_target_data_op_emi( + endpoint, ompt_multiplex_get_client_task_data(target_task_data), + ompt_multiplex_get_client_target_data(target_data), host_op_id, optype, + src_addr, src_device_num, dest_addr, bytes, dest_device_num, + codeptr_ra); + } +} + +static void ompt_multiplex_callback_target_submit_emi( + ompt_scope_endpoint_t endpoint, ompt_data_t *target_data, + ompt_id_t *host_op_id, unsigned int requested_num_teams) { + if (ompt_multiplex_own_callbacks.ompt_callback_target_submit_emi) { + ompt_multiplex_own_callbacks.ompt_callback_target_submit_emi( + endpoint, ompt_multiplex_get_own_target_data(target_data), host_op_id, + requested_num_teams); + } + if (ompt_multiplex_client_callbacks.ompt_callback_target_submit_emi) { + ompt_multiplex_client_callbacks.ompt_callback_target_submit_emi( + endpoint, ompt_multiplex_get_client_target_data(target_data), + host_op_id, requested_num_teams); + } +} + +static void ompt_multiplex_callback_target_map_emi( + ompt_data_t *target_data, unsigned int nitems, void **host_addr, + void **device_addr, size_t *bytes, unsigned int *mapping_flags, + const void *codeptr_ra) { + if (ompt_multiplex_own_callbacks.ompt_callback_target_map_emi) { + ompt_multiplex_own_callbacks.ompt_callback_target_map_emi( + ompt_multiplex_get_own_target_data(target_data), nitems, host_addr, + device_addr, bytes, mapping_flags, codeptr_ra); + } + if (ompt_multiplex_client_callbacks.ompt_callback_target_map_emi) { + ompt_multiplex_client_callbacks.ompt_callback_target_map_emi( + ompt_multiplex_get_client_target_data(target_data), nitems, host_addr, + device_addr, bytes, mapping_flags, codeptr_ra); + } +} + +static void ompt_multiplex_callback_error(ompt_severity_t severity, + const char *message, size_t length, + const void *codeptr_ra) { + if (ompt_multiplex_own_callbacks.ompt_callback_error) { + ompt_multiplex_own_callbacks.ompt_callback_error(severity, message, length, + codeptr_ra); + } + if (ompt_multiplex_client_callbacks.ompt_callback_error) { + ompt_multiplex_client_callbacks.ompt_callback_error(severity, message, + length, codeptr_ra); + } +} + + // runtime entry functions int ompt_multiplex_own_get_task_info(int ancestor_level, int *type,