diff options
author | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2015-06-29 17:28:57 +0000 |
---|---|---|
committer | Jonathan Peyton <jonathan.l.peyton@intel.com> | 2015-06-29 17:28:57 +0000 |
commit | 117a94ff9d12d4fbf1ff81cea9f69154ecf831bb (patch) | |
tree | 4e12ec64f529fb03954cec143d817db89e0663be | |
parent | cdfea9a7a72898a4fbbfa0cbfa9f7fef25ece04d (diff) | |
download | bcm5719-llvm-117a94ff9d12d4fbf1ff81cea9f69154ecf831bb.tar.gz bcm5719-llvm-117a94ff9d12d4fbf1ff81cea9f69154ecf831bb.zip |
Fix OMPT state maintenance for barriers and missing init of implicit task id.
Fix OMPT support for barriers so that state changes occur even if OMPT_TRACE turned off.
These state changes are needed by performance tools that use callbacks for either
ompt_event_wait_barrier_begin or ompt_event_wait_barrier_end. Change ifdef flag to OMPT_BLAME
for callbacks ompt_event_wait_barrier_begin or ompt_event_wait_barrier_end rather than
OMPT_TRACE -- they were misclassified. Without this patch, when the runtime is compiled with
LIBOMP_OMPT_SUPPORT=true, LIBOMP_OMPT_BLAME=true, and LIBOMP_OMPT_TRACE=false, and a callback
is registered for either ompt_event_wait_barrier_begin or ompt_event_wait_barrier_end, then an
assertion will trip. Fix the scoping of one OMPT_TRACE ifdef, which should not have surrounded
an update of an OMPT state. Add a missing initialization of an OMPT task id for an implicit task.
Patch by John Mellor-Crummey
Differential Revision: http://reviews.llvm.org/D10759
llvm-svn: 240970
-rw-r--r-- | openmp/runtime/src/kmp_barrier.cpp | 21 | ||||
-rw-r--r-- | openmp/runtime/src/kmp_runtime.c | 4 |
2 files changed, 18 insertions, 7 deletions
diff --git a/openmp/runtime/src/kmp_barrier.cpp b/openmp/runtime/src/kmp_barrier.cpp index 8821e6f3023..7d40fd285d8 100644 --- a/openmp/runtime/src/kmp_barrier.cpp +++ b/openmp/runtime/src/kmp_barrier.cpp @@ -1049,26 +1049,31 @@ __kmp_barrier(enum barrier_type bt, int gtid, int is_split, size_t reduce_size, KA_TRACE(15, ("__kmp_barrier: T#%d(%d:%d) has arrived\n", gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid))); -#if OMPT_SUPPORT && OMPT_TRACE +#if OMPT_SUPPORT if (ompt_status & ompt_status_track) { +#if OMPT_BLAME if (ompt_status == ompt_status_track_callback) { my_task_id = team->t.t_implicit_task_taskdata[tid].ompt_task_info.task_id; my_parallel_id = team->t.ompt_team_info.parallel_id; +#if OMPT_TRACE if (this_thr->th.ompt_thread_info.state == ompt_state_wait_single) { if (ompt_callbacks.ompt_callback(ompt_event_single_others_end)) { ompt_callbacks.ompt_callback(ompt_event_single_others_end)( my_parallel_id, my_task_id); } } - this_thr->th.ompt_thread_info.state = ompt_state_wait_barrier; +#endif if (ompt_callbacks.ompt_callback(ompt_event_barrier_begin)) { ompt_callbacks.ompt_callback(ompt_event_barrier_begin)( my_parallel_id, my_task_id); } - } else { - this_thr->th.ompt_thread_info.state = ompt_state_wait_barrier; - } + } +#endif + // It is OK to report the barrier state after the barrier begin callback. + // According to the OMPT specification, a compliant implementation may + // even delay reporting this state until the barrier begins to wait. + this_thr->th.ompt_thread_info.state = ompt_state_wait_barrier; } #endif @@ -1261,7 +1266,7 @@ __kmp_barrier(enum barrier_type bt, int gtid, int is_split, size_t reduce_size, #if OMPT_SUPPORT if (ompt_status & ompt_status_track) { -#if OMPT_TRACE +#if OMPT_BLAME if ((ompt_status == ompt_status_track_callback) && ompt_callbacks.ompt_callback(ompt_event_barrier_end)) { ompt_callbacks.ompt_callback(ompt_event_barrier_end)( @@ -1363,13 +1368,15 @@ __kmp_join_barrier(int gtid) KMP_DEBUG_ASSERT(this_thr == team->t.t_threads[tid]); KA_TRACE(10, ("__kmp_join_barrier: T#%d(%d:%d) arrived at join barrier\n", gtid, team_id, tid)); -#if OMPT_SUPPORT && OMPT_TRACE +#if OMPT_SUPPORT +#if OMPT_TRACE if ((ompt_status == ompt_status_track_callback) && ompt_callbacks.ompt_callback(ompt_event_barrier_begin)) { ompt_callbacks.ompt_callback(ompt_event_barrier_begin)( team->t.ompt_team_info.parallel_id, team->t.t_implicit_task_taskdata[tid].ompt_task_info.task_id); } +#endif this_thr->th.ompt_thread_info.state = ompt_state_wait_barrier; #endif diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c index f5fec3bc61c..9f21986411b 100644 --- a/openmp/runtime/src/kmp_runtime.c +++ b/openmp/runtime/src/kmp_runtime.c @@ -5521,6 +5521,10 @@ __kmp_launch_thread( kmp_info_t *this_thr ) #if OMPT_SUPPORT if (ompt_status & ompt_status_track) { 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); } #endif |