diff options
author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2016-01-26 21:45:21 +0000 |
---|---|---|
committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2016-01-26 21:45:21 +0000 |
commit | b4c73d8d8af094c7ab7cc02173ee8ad53e834ec7 (patch) | |
tree | 60013f6cfa73b87e9566706d6807d1e128c01ec8 /openmp/runtime/src | |
parent | 00adc1e105734a2a3982191863cff482676cad7d (diff) | |
download | bcm5719-llvm-b4c73d8d8af094c7ab7cc02173ee8ad53e834ec7.tar.gz bcm5719-llvm-b4c73d8d8af094c7ab7cc02173ee8ad53e834ec7.zip |
[OMPT]: Fix the order of implicit_task_end_events
For implcit barriers in simple parallel for loops, the order of the OMPT events
was wrong. The barrier_{begin,end} events came after the implcit_task_end
event for the implcit barrier at the end of the parallel region. This is wrong
because the implicit task executes the barrier before ending. This patch fixes
the order of the event: It will be triggerd now just before
__kmp_pop_current_task_from_thread() is called.
Patch by Tim Cramer
Differential Revision: http://reviews.llvm.org/D16347
llvm-svn: 258866
Diffstat (limited to 'openmp/runtime/src')
-rw-r--r-- | openmp/runtime/src/kmp_runtime.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c index b80bbfd1f26..3cd404d32ab 100644 --- a/openmp/runtime/src/kmp_runtime.c +++ b/openmp/runtime/src/kmp_runtime.c @@ -2475,6 +2475,18 @@ __kmp_join_call(ident_t *loc, int gtid } KMP_DEBUG_ASSERT( root->r.r_in_parallel >= 0 ); +#if OMPT_SUPPORT && OMPT_TRACE + if(ompt_enabled){ + ompt_task_info_t *task_info = __ompt_get_taskinfo(0); + if (ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)) { + ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)( + parallel_id, task_info->task_id); + } + task_info->frame.exit_runtime_frame = 0; + task_info->task_id = 0; + } +#endif + KF_TRACE( 10, ("__kmp_join_call1: T#%d, this_thread=%p team=%p\n", 0, master_th, team ) ); __kmp_pop_current_task_from_thread( master_th ); @@ -5504,6 +5516,12 @@ __kmp_launch_thread( kmp_info_t *this_thr ) /* have we been allocated? */ if ( TCR_SYNC_PTR(*pteam) && !TCR_4(__kmp_global.g.g_done) ) { +#if OMPT_SUPPORT + ompt_task_info_t *task_info; + if (ompt_enabled) { + task_info = __ompt_get_taskinfo(0); + } +#endif /* we were just woken up, so run our new task */ if ( TCR_SYNC_PTR((*pteam)->t.t_pkfn) != NULL ) { int rc; @@ -5517,8 +5535,7 @@ __kmp_launch_thread( kmp_info_t *this_thr ) this_thr->th.ompt_thread_info.state = ompt_state_work_parallel; // Initialize OMPT task id for implicit task. int tid = __kmp_tid_from_gtid(gtid); - (*pteam)->t.t_implicit_task_taskdata[tid].ompt_task_info.task_id = - __ompt_task_id_new(tid); + task_info->task_id = __ompt_task_id_new(tid); } #endif @@ -5533,8 +5550,7 @@ __kmp_launch_thread( kmp_info_t *this_thr ) #if OMPT_SUPPORT if (ompt_enabled) { /* no frame set while outside task */ - int tid = __kmp_tid_from_gtid(gtid); - (*pteam)->t.t_implicit_task_taskdata[tid].ompt_task_info.frame.exit_runtime_frame = 0; + task_info->frame.exit_runtime_frame = 0; this_thr->th.ompt_thread_info.state = ompt_state_overhead; } @@ -5545,6 +5561,17 @@ __kmp_launch_thread( kmp_info_t *this_thr ) } /* join barrier after parallel region */ __kmp_join_barrier( gtid ); +#if OMPT_SUPPORT && OMPT_TRACE + if (ompt_enabled) { + if (ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)) { + int my_parallel_id = (*pteam)->t.ompt_team_info.parallel_id; + ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)( + my_parallel_id, task_info->task_id); + } + task_info->frame.exit_runtime_frame = 0; + task_info->task_id = 0; + } +#endif } } TCR_SYNC_PTR((intptr_t)__kmp_global.g.g_done); @@ -6858,17 +6885,6 @@ __kmp_invoke_task_func( int gtid ) ); } -#if OMPT_SUPPORT && OMPT_TRACE - if (ompt_enabled) { - if (ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)) { - ompt_callbacks.ompt_callback(ompt_event_implicit_task_end)( - my_parallel_id, my_task_id); - } - // the implicit task is not dead yet, so we can't clear its task id here - team->t.t_implicit_task_taskdata[tid].ompt_task_info.frame.exit_runtime_frame = 0; - } -#endif - #if USE_ITT_BUILD if ( __itt_stack_caller_create_ptr ) { __kmp_itt_stack_callee_leave( (__itt_caller)team->t.t_stack_id ); // inform ittnotify about leaving user's code |