mirror of
https://github.com/OpenMP/Examples.git
synced 2025-04-04 05:41:33 +01:00
81 lines
4.0 KiB
TeX
81 lines
4.0 KiB
TeX
%\pagebreak
|
|
\section{Doacross Loop Nest}
|
|
\label{sec:doacross}
|
|
\index{dependences!doacross loop nest}
|
|
\index{doacross loop nest!ordered construct@\kcode{ordered} construct}
|
|
\index{ordered construct@\kcode{ordered} construct!doacross loop nest}
|
|
\index{doacross loop nest!doacross clause@\kcode{doacross} clause}
|
|
\index{constructs!ordered@\kcode{ordered}}
|
|
\index{clauses!doacross@\kcode{doacross}}
|
|
\index{doacross clause@\kcode{doacross} clause}
|
|
|
|
An \kcode{ordered} clause can be used on a worksharing-loop construct with an integer
|
|
parameter argument to define the number of associated loops within
|
|
a \plc{doacross loop nest} where cross-iteration dependences exist.
|
|
A \kcode{doacross} clause on an \kcode{ordered} construct within an \plc{ordered}
|
|
loop describes the dependences of the \plc{doacross} loops.
|
|
|
|
In the code below, the \kcode{doacross(sink:\ucode{i-1})} clause defines an \ucode{i-1}
|
|
to \ucode{i} cross-iteration dependence that specifies a wait point for
|
|
the completion of computation from iteration \ucode{i-1} before proceeding
|
|
to the subsequent statements. The \kcode{doacross(source:omp_cur_iteration)}
|
|
or \kcode{doacross(source:)} clause indicates
|
|
the completion of computation from the current iteration (\ucode{i})
|
|
to satisfy the cross-iteration dependence that arises from the iteration.
|
|
The \kcode{omp_cur_iteration} keyword is optional for the \kcode{source}
|
|
dependence type.
|
|
For this example the same sequential ordering could have been achieved
|
|
with an \kcode{ordered} clause without a parameter on the worksharing-loop directive,
|
|
and a single \kcode{ordered} directive without the \kcode{doacross} clause
|
|
specified for the statement executing the \ucode{bar} function.
|
|
|
|
\cexample[5.2]{doacross}{1}
|
|
|
|
\ffreeexample[5.2]{doacross}{1}
|
|
|
|
\pagebreak
|
|
The following code is similar to the previous example but with
|
|
the \plc{doacross loop nest} extended to two nested loops, \ucode{i} and \ucode{j},
|
|
as specified by the \kcode{ordered(\ucode{2})} clause on the worksharing-loop directive.
|
|
In the C/C++ code, the \ucode{i} and \ucode{j} loops are the first and
|
|
second associated loops, respectively, whereas
|
|
in the Fortran code, the \ucode{j} and \ucode{i} loops are the first and
|
|
second associated loops, respectively.
|
|
The \kcode{doacross(sink:\ucode{i-1,j})} and \kcode{doacross(sink:\ucode{i,j-1})} clauses in
|
|
the C/C++ code define cross-iteration dependences in two dimensions from
|
|
iterations (\ucode{i-1, j}) and (\ucode{i, j-1}) to iteration (\ucode{i, j}).
|
|
Likewise, the \kcode{doacross(sink:\ucode{j-1,i})} and \kcode{doacross(sink:\ucode{j,i-1})} clauses
|
|
in the Fortran code define cross-iteration dependences from iterations
|
|
(\ucode{j-1, i}) and (\ucode{j, i-1}) to iteration (\ucode{j, i}).
|
|
|
|
\cexample[5.2]{doacross}{2}
|
|
|
|
\ffreeexample[5.2]{doacross}{2}
|
|
|
|
|
|
The following example shows an incorrect use of the \kcode{ordered}
|
|
directive with a \kcode{doacross} clause. There are two issues with the code.
|
|
The first issue is a missing \kcode{ordered doacross(source:)} directive,
|
|
which could cause a deadlock.
|
|
The second issue is the \kcode{doacross(sink:\ucode{i+1,j})} and \kcode{doacross(sink:\ucode{i,j+1})}
|
|
clauses define dependences on lexicographically later
|
|
source iterations (\ucode{i+1, j}) and (\ucode{i, j+1}), which could cause
|
|
a deadlock as well since they may not start to execute until the current iteration completes.
|
|
|
|
\cexample[5.2]{doacross}{3}
|
|
|
|
\ffreeexample[5.2]{doacross}{3}
|
|
|
|
|
|
The following example illustrates the use of the \kcode{collapse} clause for
|
|
a \plc{doacross loop nest}. The \ucode{i} and \ucode{j} loops are the associated
|
|
loops for the collapsed loop as well as for the \plc{doacross loop nest}.
|
|
The example also shows a conforming usage of the \kcode{ordered} directive specifying a cross-iteration source
|
|
that is placed before a corresponding \kcode{ordered} directive specifying a
|
|
cross-iteration sink. There is no requirement that the source specification
|
|
must follow the sink specification in a given iteration.
|
|
|
|
\cexample[5.2]{doacross}{4}
|
|
|
|
\ffreeexample[5.2]{doacross}{4}
|