libgomp/ChangeLog:

        * libgomp.texi (Implementing MASKED and MASTER construct): Update
        pseudocode; describe GOMP_has_masked_thread_num.
        (Implementing ATOMIC construct): Fix stale function names; note
        exclusivity to explicit atomic constructs.
        (Implementing BARRIER construct): Document GOMP_barrier_ext and
        GOMP_barrier_cancel_ext; describe the kind parameter.
        (Implementing REDUCTION clause): Document GOMP_reduction_start and
        GOMP_reduction_end.
        (Implementing FOR construct): Document GOMP_loop_static_worksharing
        and GOMP_distribute_static_worksharing.
---
 libgomp/libgomp.texi | 64 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 55 insertions(+), 9 deletions(-)

diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi
index 05de63e4020..cb08aa08e2c 100644
--- a/libgomp/libgomp.texi
+++ b/libgomp/libgomp.texi
@@ -8023,10 +8023,18 @@ presented by libgomp.  Only maintainers should need 
them.
 @section Implementing MASKED and MASTER construct
 
 @smallexample
-if (omp_get_thread_num () == thread_num)
+if (GOMP_has_masked_thread_num(thread_num))
   block
 @end smallexample
 
+@code{GOMP_has_masked_thread_num} encapsulates the following check, so that 
OMPT
+can distinguish the compiler-generated code from user-level thread-number
+queries:
+
+@smallexample
+omp_get_thread_num() == @var{thread_num}
+@end
+
 Hereby, @var{thread_num} has the value of the argument to the @code{filter}
 clause or zero if not specified.
 
@@ -8070,13 +8078,17 @@ The target should implement the @code{__sync} builtins.
 Failing that we could add
 
 @smallexample
-  void GOMP_atomic_enter (void)
-  void GOMP_atomic_exit (void)
+  void GOMP_atomic_start (void)
+  void GOMP_atomic_end (void)
 @end smallexample
 
 which reuses the regular lock code, but with yet another lock
 object private to the library.
 
+Those two functions are used exclusively for explicit @code{atomic} constructs;
+reductions use @code{GOMP_reduction_start} and @code{GOMP_reduction_end} 
instead
+(see @ref{Implementing REDUCTION clause}).
+
 
 
 @node Implementing FLUSH construct
@@ -8090,9 +8102,20 @@ Expands to the @code{__sync_synchronize} builtin.
 @section Implementing BARRIER construct
 
 @smallexample
-  void GOMP_barrier (void)
+  void GOMP_barrier_ext (int kind)
+  void GOMP_barrier_cancel_ext (int kind)
 @end smallexample
 
+@var{kind} should be @code{GOMP_BARRIER_EXPLICIT}. Other values are for 
implicit
+barriers resulting from parallel or work-sharing constructs.
+
+@code{GOMP_barrier} and @code{GOMP_barrier_cancel} are kept for backward
+compatibility but new code only calls the @code{_ext} variants.
+
+@code{GOMP_barrier_cancel_ext} should be used when the barrier happens within
+a cancellable construct.
+
+
 
 @node Implementing THREADPRIVATE construct
 @section Implementing THREADPRIVATE construct
@@ -8171,6 +8194,17 @@ thread's @var{team_id}.  The thread stores its final 
value into the
 array, and after the barrier, the primary thread iterates over the
 array to collect the values.
 
+In cases where an atomic update cannot be used (e.g. for a reduction involving
+more than one scalar), a critical section is required. Dedicated entry points
+are used rather than @code{GOMP_atomic_start} and @code{GOMP_atomic_end} so 
that
+OMPT can distinguish reduction critical sections from user-level atomic
+constructs. The section is bracketed by:
+
+@smallexample
+  void GOMP_reduction_start (void)
+  void GOMP_reduction_end (void)
+@end smallexample
+
 
 @node Implementing PARALLEL construct
 @section Implementing PARALLEL construct
@@ -8281,11 +8315,23 @@ variables.  So the expression should remain evaluable 
in the
 subfunction.  We can also pull it into a local variable if we like,
 but since its supposed to remain unchanged, we can also not if we like.
 
-If we have SCHEDULE(STATIC), and no ORDERED, then we ought to be
-able to get away with no work-sharing context at all, since we can
-simply perform the arithmetic directly in each thread to divide up
-the iterations.  Which would mean that we wouldn't need to call any
-of these routines.
+For @code{schedule(static)} without @code{ordered}, the compiler uses:
+
+@smallexample
+  _Complex int GOMP_loop_static_worksharing (void)
+@end
+
+which returns the thread id in the real part and the thread count in the 
imaginary
+part as a single value, avoiding separate @code{omp_get_thread_num} /
+@code{omp_get_num_threads} calls that OMPT cannot distinguish from user 
queries.
+
+Similarly, for @code{distribute} constructs:
+
+@smallexample
+  _Complex int GOMP_distribute_static_worksharing (void)
+@end
+
+returns the team id and team count.
 
 There are separate routines for handling loops with an ORDERED
 clause.  Bookkeeping for that is non-trivial...
-- 
2.53.0

Reply via email to