summaryrefslogtreecommitdiffstats
path: root/openmp/runtime/src
diff options
context:
space:
mode:
authorJonathan Peyton <jonathan.l.peyton@intel.com>2016-01-26 21:45:21 +0000
committerJonathan Peyton <jonathan.l.peyton@intel.com>2016-01-26 21:45:21 +0000
commitb4c73d8d8af094c7ab7cc02173ee8ad53e834ec7 (patch)
tree60013f6cfa73b87e9566706d6807d1e128c01ec8 /openmp/runtime/src
parent00adc1e105734a2a3982191863cff482676cad7d (diff)
downloadbcm5719-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.c46
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
OpenPOWER on IntegriCloud