From 589519b9ab47694159e8c20fa89ae802380f185f Mon Sep 17 00:00:00 2001 From: Vignesh Balasubramanian Date: Thu, 19 Aug 2021 12:46:07 +0530 Subject: [PATCH] [OpenMP][OMPD]Code movement required for OMPD These changes don't come under OMPD guard as it is a movement of existing code to capture parallel behavior correctly. "Runtime Entry Points for OMPD" like "ompd_bp_parallel_begin" and "ompd_bp_parallel_begin" should be placed at the correct execution point for the debugging tool to access proper handles/data. Without the below changes, in certain cases, debugging tool will pick the wrong parallel and task handle. Reviewed By: @hbae Differential Revision: https://reviews.llvm.org/D100366 --- openmp/runtime/src/kmp_csupport.cpp | 7 ++----- openmp/runtime/src/ompt-specific.cpp | 15 +++++++-------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/openmp/runtime/src/kmp_csupport.cpp b/openmp/runtime/src/kmp_csupport.cpp index 2a7c9a8c..0b5f899 100644 --- a/openmp/runtime/src/kmp_csupport.cpp +++ b/openmp/runtime/src/kmp_csupport.cpp @@ -578,9 +578,6 @@ void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) { __kmp_free(top); } - // if( serial_team -> t.t_serialized > 1 ) - serial_team->t.t_level--; - /* pop dispatch buffers stack */ KMP_DEBUG_ASSERT(serial_team->t.t_dispatch->th_disp_buffer); { @@ -605,6 +602,7 @@ void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) { } #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ + __kmp_pop_current_task_from_thread(this_thr); #if OMPD_SUPPORT if (ompd_state & OMPD_ENABLE_BP) ompd_bp_parallel_end(); @@ -623,8 +621,6 @@ void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) { this_thr->th.th_dispatch = &this_thr->th.th_team->t.t_dispatch[serial_team->t.t_master_tid]; - __kmp_pop_current_task_from_thread(this_thr); - KMP_ASSERT(this_thr->th.th_current_task->td_flags.executing == 0); this_thr->th.th_current_task->td_flags.executing = 1; @@ -645,6 +641,7 @@ void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid) { } } + serial_team->t.t_level--; if (__kmp_env_consistency_check) __kmp_pop_parallel(global_tid, NULL); #if OMPT_SUPPORT diff --git a/openmp/runtime/src/ompt-specific.cpp b/openmp/runtime/src/ompt-specific.cpp index 1ad0e17..c90edeb 100644 --- a/openmp/runtime/src/ompt-specific.cpp +++ b/openmp/runtime/src/ompt-specific.cpp @@ -283,10 +283,6 @@ void __ompt_lw_taskteam_link(ompt_lw_taskteam_t *lwt, kmp_info_t *thr, link_lwt->ompt_team_info = *OMPT_CUR_TEAM_INFO(thr); *OMPT_CUR_TEAM_INFO(thr) = tmp_team; - ompt_task_info_t tmp_task = lwt->ompt_task_info; - link_lwt->ompt_task_info = *OMPT_CUR_TASK_INFO(thr); - *OMPT_CUR_TASK_INFO(thr) = tmp_task; - // link the taskteam into the list of taskteams: ompt_lw_taskteam_t *my_parent = thr->th.th_team->t.ompt_serialized_team_info; @@ -297,6 +293,10 @@ void __ompt_lw_taskteam_link(ompt_lw_taskteam_t *lwt, kmp_info_t *thr, ompd_bp_parallel_begin(); } #endif + + ompt_task_info_t tmp_task = lwt->ompt_task_info; + link_lwt->ompt_task_info = *OMPT_CUR_TASK_INFO(thr); + *OMPT_CUR_TASK_INFO(thr) = tmp_task; } else { // this is the first serialized team, so we just store the values in the // team and drop the taskteam-object @@ -313,6 +313,9 @@ void __ompt_lw_taskteam_link(ompt_lw_taskteam_t *lwt, kmp_info_t *thr, void __ompt_lw_taskteam_unlink(kmp_info_t *thr) { ompt_lw_taskteam_t *lwtask = thr->th.th_team->t.ompt_serialized_team_info; if (lwtask) { + ompt_task_info_t tmp_task = lwtask->ompt_task_info; + lwtask->ompt_task_info = *OMPT_CUR_TASK_INFO(thr); + *OMPT_CUR_TASK_INFO(thr) = tmp_task; #if OMPD_SUPPORT if (ompd_state & OMPD_ENABLE_BP) { ompd_bp_parallel_end(); @@ -324,10 +327,6 @@ void __ompt_lw_taskteam_unlink(kmp_info_t *thr) { lwtask->ompt_team_info = *OMPT_CUR_TEAM_INFO(thr); *OMPT_CUR_TEAM_INFO(thr) = tmp_team; - ompt_task_info_t tmp_task = lwtask->ompt_task_info; - lwtask->ompt_task_info = *OMPT_CUR_TASK_INFO(thr); - *OMPT_CUR_TASK_INFO(thr) = tmp_task; - if (lwtask->heap) { __kmp_free(lwtask); lwtask = NULL; -- 2.7.4