From 8a27064e05c0327790c5144bf8498ca4a68152da Mon Sep 17 00:00:00 2001 From: Jonas Hahnfeld Date: Wed, 14 Sep 2016 13:59:19 +0000 Subject: [PATCH] [OMPT] Reset task exit frame when execution is finished The exit address is set when execution of a task is started and should be reset as soon as the execution is finished. Especially for the asm implementation of __kmp_invoke_microtask, resetting in this call would be painfull, so reset just after the invokation. The testcase shows the effect of this patch: Before, the implicit barriers at the end of an implicit task would see an exit address for the implicit task. This barrier is a task scheduling point. Thus, any explicit task scheduled there would see an exit, but no reenter address for the implicit task. Patch by Joachim Protze! Differential Revision: https://reviews.llvm.org/D23307 llvm-svn: 281465 --- openmp/runtime/src/kmp_runtime.c | 6 ++++++ openmp/runtime/test/ompt/parallel/nested.c | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c index fb97c37..06b5d58 100644 --- a/openmp/runtime/src/kmp_runtime.c +++ b/openmp/runtime/src/kmp_runtime.c @@ -1548,6 +1548,7 @@ __kmp_fork_call( } #if OMPT_SUPPORT + *exit_runtime_p = NULL; if (ompt_enabled) { #if OMPT_TRACE lw_taskteam.ompt_task_info.frame.exit_runtime_frame = NULL; @@ -1745,6 +1746,7 @@ __kmp_fork_call( } #if OMPT_SUPPORT + *exit_runtime_p = NULL; if (ompt_enabled) { lw_taskteam.ompt_task_info.frame.exit_runtime_frame = NULL; @@ -1851,6 +1853,7 @@ __kmp_fork_call( } #if OMPT_SUPPORT + *exit_runtime_p = NULL; if (ompt_enabled) { #if OMPT_TRACE lw_taskteam.ompt_task_info.frame.exit_runtime_frame = NULL; @@ -6838,6 +6841,9 @@ __kmp_invoke_task_func( int gtid ) , exit_runtime_p #endif ); +#if OMPT_SUPPORT + *exit_runtime_p = NULL; +#endif } #if USE_ITT_BUILD diff --git a/openmp/runtime/test/ompt/parallel/nested.c b/openmp/runtime/test/ompt/parallel/nested.c index 63c5c4f..6847ab6 100644 --- a/openmp/runtime/test/ompt/parallel/nested.c +++ b/openmp/runtime/test/ompt/parallel/nested.c @@ -64,12 +64,20 @@ int main() // THREADS: {{^}}[[MASTER_ID]]: level 2: parallel_id=0, task_id=[[PARENT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[MAIN_REENTER]] // THREADS: {{^}}[[MASTER_ID]]: __builtin_frame_address(0)=[[NESTED_REENTER:0x[0-f]+]] // THREADS-NOT: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end + // explicit barrier // THREADS: {{^}}[[MASTER_ID]]: ompt_event_barrier_begin: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[NESTED_IMPLICIT_TASK_ID]] + // THREADS: {{^}}[[MASTER_ID]]: level 0: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[NESTED_IMPLICIT_TASK_ID]], exit_frame=[[NESTED_EXIT]], reenter_frame=[[NESTED_REENTER]] + // THREADS: {{^}}[[MASTER_ID]]: ompt_event_barrier_end: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[NESTED_IMPLICIT_TASK_ID]] + // implicit barrier + // THREADS: {{^}}[[MASTER_ID]]: ompt_event_barrier_begin: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[NESTED_IMPLICIT_TASK_ID]] + // THREADS: {{^}}[[MASTER_ID]]: level 0: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[NESTED_IMPLICIT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[NULL]] // THREADS: {{^}}[[MASTER_ID]]: ompt_event_barrier_end: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[NESTED_IMPLICIT_TASK_ID]] // THREADS: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[NESTED_IMPLICIT_TASK_ID]] // THREADS: {{^}}[[MASTER_ID]]: ompt_event_parallel_end: parallel_id=[[NESTED_PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], invoker=[[PARALLEL_INVOKER]] // THREADS-NOT: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end + // implicit barrier // THREADS: {{^}}[[MASTER_ID]]: ompt_event_barrier_begin: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]] + // THREADS: {{^}}[[MASTER_ID]]: level 0: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]], exit_frame=[[NULL]], reenter_frame=[[NULL]] // THREADS: {{^}}[[MASTER_ID]]: ompt_event_barrier_end: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]] // THREADS: {{^}}[[MASTER_ID]]: ompt_event_implicit_task_end: parallel_id=[[PARALLEL_ID]], task_id=[[IMPLICIT_TASK_ID]] -- 2.7.4