[OpenMP][Stats] Fix stats gathering for distribute and team clause
The distribute clause needs an explicit push of a timer. The teams
clause needs a timer added and also, similarly to parallel, exchanged
with the serial timer when encountered so that serial regions are
counted properly.
Differential Revision: https://reviews.llvm.org/D59801
llvm-svn: 357621
diff --git a/openmp/runtime/src/kmp_runtime.cpp b/openmp/runtime/src/kmp_runtime.cpp
index 369aff9..6b6ebee 100644
--- a/openmp/runtime/src/kmp_runtime.cpp
+++ b/openmp/runtime/src/kmp_runtime.cpp
@@ -2285,9 +2285,25 @@
team->t.t_id, team->t.t_pkfn));
} // END of timer KMP_fork_call block
+#if KMP_STATS_ENABLED && OMP_40_ENABLED
+ // If beginning a teams construct, then change thread state
+ stats_state_e previous_state = KMP_GET_THREAD_STATE();
+ if (!ap) {
+ KMP_SET_THREAD_STATE(stats_state_e::TEAMS_REGION);
+ }
+#endif
+
if (!team->t.t_invoke(gtid)) {
KMP_ASSERT2(0, "cannot invoke microtask for MASTER thread");
}
+
+#if KMP_STATS_ENABLED && OMP_40_ENABLED
+ // If was beginning of a teams construct, then reset thread state
+ if (!ap) {
+ KMP_SET_THREAD_STATE(previous_state);
+ }
+#endif
+
KA_TRACE(20, ("__kmp_fork_call: T#%d(%d:0) done microtask = %p\n", gtid,
team->t.t_id, team->t.t_pkfn));
KMP_MB(); /* Flush all pending memory write invalidates. */
@@ -7106,21 +7122,33 @@
}
#endif
- {
- KMP_TIME_PARTITIONED_BLOCK(OMP_parallel);
- KMP_SET_THREAD_STATE_BLOCK(IMPLICIT_TASK);
- rc =
- __kmp_invoke_microtask((microtask_t)TCR_SYNC_PTR(team->t.t_pkfn), gtid,
- tid, (int)team->t.t_argc, (void **)team->t.t_argv
-#if OMPT_SUPPORT
- ,
- exit_runtime_p
-#endif
- );
-#if OMPT_SUPPORT
- *exit_runtime_p = NULL;
-#endif
+#if KMP_STATS_ENABLED
+ stats_state_e previous_state = KMP_GET_THREAD_STATE();
+ if (previous_state == stats_state_e::TEAMS_REGION) {
+ KMP_PUSH_PARTITIONED_TIMER(OMP_teams);
+ } else {
+ KMP_PUSH_PARTITIONED_TIMER(OMP_parallel);
}
+ KMP_SET_THREAD_STATE(IMPLICIT_TASK);
+#endif
+
+ rc = __kmp_invoke_microtask((microtask_t)TCR_SYNC_PTR(team->t.t_pkfn), gtid,
+ tid, (int)team->t.t_argc, (void **)team->t.t_argv
+#if OMPT_SUPPORT
+ ,
+ exit_runtime_p
+#endif
+ );
+#if OMPT_SUPPORT
+ *exit_runtime_p = NULL;
+#endif
+
+#if KMP_STATS_ENABLED
+ if (previous_state == stats_state_e::TEAMS_REGION) {
+ KMP_SET_THREAD_STATE(previous_state);
+ }
+ KMP_POP_PARTITIONED_TIMER();
+#endif
#if USE_ITT_BUILD
if (__itt_stack_caller_create_ptr) {