[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / clang / docs / OpenMPSupport.rst
blobaf405d2202a85c8f7ffcb7c77c9e99ec8e18a980
1 .. raw:: html
3   <style type="text/css">
4     .none { background-color: #FFCCCC }
5     .part { background-color: #FFFF99 }
6     .good { background-color: #CCFF99 }
7   </style>
9 .. role:: none
10 .. role:: part
11 .. role:: good
13 .. contents::
14    :local:
16 OpenMP Support
17 ==============
19 Clang fully supports OpenMP 4.5. Clang supports offloading to X86_64, AArch64,
20 PPC64[LE] and has `basic support for Cuda devices`_.
22 * #pragma omp declare simd: :part:`Partial`.  We support parsing/semantic
23   analysis + generation of special attributes for X86 target, but still
24   missing the LLVM pass for vectorization.
26 In addition, the LLVM OpenMP runtime `libomp` supports the OpenMP Tools
27 Interface (OMPT) on x86, x86_64, AArch64, and PPC64 on Linux, Windows, and macOS.
29 For the list of supported features from OpenMP 5.0 see `OpenMP implementation details`_.
31 General improvements
32 ====================
33 - New collapse clause scheme to avoid expensive remainder operations.
34   Compute loop index variables after collapsing a loop nest via the
35   collapse clause by replacing the expensive remainder operation with
36   multiplications and additions.
38 - The default schedules for the `distribute` and `for` constructs in a
39   parallel region and in SPMD mode have changed to ensure coalesced
40   accesses. For the `distribute` construct, a static schedule is used
41   with a chunk size equal to the number of threads per team (default
42   value of threads or as specified by the `thread_limit` clause if
43   present). For the `for` construct, the schedule is static with chunk
44   size of one.
46 - Simplified SPMD code generation for `distribute parallel for` when
47   the new default schedules are applicable.
49 - When using the collapse clause on a loop nest the default behavior
50   is to automatically extend the representation of the loop counter to
51   64 bits for the cases where the sizes of the collapsed loops are not
52   known at compile time. To prevent this conservative choice and use
53   at most 32 bits, compile your program with the
54   `-fopenmp-optimistic-collapse`.
56 .. _basic support for Cuda devices:
58 Cuda devices support
59 ====================
61 Directives execution modes
62 --------------------------
64 Clang code generation for target regions supports two modes: the SPMD and
65 non-SPMD modes. Clang chooses one of these two modes automatically based on the
66 way directives and clauses on those directives are used. The SPMD mode uses a
67 simplified set of runtime functions thus increasing performance at the cost of
68 supporting some OpenMP features. The non-SPMD mode is the most generic mode and
69 supports all currently available OpenMP features. The compiler will always
70 attempt to use the SPMD mode wherever possible. SPMD mode will not be used if:
72    - The target region contains user code (other than OpenMP-specific
73      directives) in between the `target` and the `parallel` directives.
75 Data-sharing modes
76 ------------------
78 Clang supports two data-sharing models for Cuda devices: `Generic` and `Cuda`
79 modes. The default mode is `Generic`. `Cuda` mode can give an additional
80 performance and can be activated using the `-fopenmp-cuda-mode` flag. In
81 `Generic` mode all local variables that can be shared in the parallel regions
82 are stored in the global memory. In `Cuda` mode local variables are not shared
83 between the threads and it is user responsibility to share the required data
84 between the threads in the parallel regions.
87 Features not supported or with limited support for Cuda devices
88 ---------------------------------------------------------------
90 - Cancellation constructs are not supported.
92 - Doacross loop nest is not supported.
94 - User-defined reductions are supported only for trivial types.
96 - Nested parallelism: inner parallel regions are executed sequentially.
98 - Automatic translation of math functions in target regions to device-specific
99   math functions is not implemented yet.
101 - Debug information for OpenMP target regions is supported, but sometimes it may
102   be required to manually specify the address class of the inspected variables.
103   In some cases the local variables are actually allocated in the global memory,
104   but the debug info may be not aware of it.
107 .. _OpenMP implementation details:
109 OpenMP 5.0 Implementation Details
110 =================================
112 The following table provides a quick overview over various OpenMP 5.0 features
113 and their implementation status. Please post on the
114 `Discourse forums (Runtimes - OpenMP category)`_ for more 
115 information or if you want to help with the
116 implementation.
118 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
119 |Category                      | Feature                                                      | Status                   | Reviews                                                               |
120 +==============================+==============================================================+==========================+=======================================================================+
121 | loop                         | support != in the canonical loop form                        | :good:`done`             | D54441                                                                |
122 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
123 | loop                         | #pragma omp loop (directive)                                 | :part:`worked on`        |                                                                       |
124 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
125 | loop                         | collapse imperfectly nested loop                             | :good:`done`             |                                                                       |
126 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
127 | loop                         | collapse non-rectangular nested loop                         | :good:`done`             |                                                                       |
128 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
129 | loop                         | C++ range-base for loop                                      | :good:`done`             |                                                                       |
130 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
131 | loop                         | clause: if for SIMD directives                               | :good:`done`             |                                                                       |
132 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
133 | loop                         | inclusive scan (matching C++17 PSTL)                         | :good:`done`             |                                                                       |
134 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
135 | memory management            | memory allocators                                            | :good:`done`             | r341687,r357929                                                       |
136 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
137 | memory management            | allocate directive and allocate clause                       | :good:`done`             | r355614,r335952                                                       |
138 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
139 | OMPD                         | OMPD interfaces                                              | :part:`not upstream`     | https://github.com/OpenMPToolsInterface/LLVM-openmp/tree/ompd-tests   |
140 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
141 | OMPT                         | OMPT interfaces                                              | :part:`mostly done`      |                                                                       |
142 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
143 | thread affinity              | thread affinity                                              | :good:`done`             |                                                                       |
144 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
145 | task                         | taskloop reduction                                           | :good:`done`             |                                                                       |
146 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
147 | task                         | task affinity                                                | :part:`not upstream`     | https://github.com/jklinkenberg/openmp/tree/task-affinity             |
148 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
149 | task                         | clause: depend on the taskwait construct                     | :part:`mostly done`      | D113540 (regular codegen only)                                        |
150 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
151 | task                         | depend objects and detachable tasks                          | :good:`done`             |                                                                       |
152 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
153 | task                         | mutexinoutset dependence-type for tasks                      | :good:`done`             | D53380,D57576                                                         |
154 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
155 | task                         | combined taskloop constructs                                 | :good:`done`             |                                                                       |
156 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
157 | task                         | master taskloop                                              | :good:`done`             |                                                                       |
158 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
159 | task                         | parallel master taskloop                                     | :good:`done`             |                                                                       |
160 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
161 | task                         | master taskloop simd                                         | :good:`done`             |                                                                       |
162 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
163 | task                         | parallel master taskloop simd                                | :good:`done`             |                                                                       |
164 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
165 | SIMD                         | atomic and simd constructs inside SIMD code                  | :good:`done`             |                                                                       |
166 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
167 | SIMD                         | SIMD nontemporal                                             | :good:`done`             |                                                                       |
168 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
169 | device                       | infer target functions from initializers                     | :part:`worked on`        |                                                                       |
170 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
171 | device                       | infer target variables from initializers                     | :part:`worked on`        |                                                                       |
172 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
173 | device                       | OMP_TARGET_OFFLOAD environment variable                      | :good:`done`             | D50522                                                                |
174 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
175 | device                       | support full 'defaultmap' functionality                      | :good:`done`             | D69204                                                                |
176 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
177 | device                       | device specific functions                                    | :good:`done`             |                                                                       |
178 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
179 | device                       | clause: device_type                                          | :good:`done`             |                                                                       |
180 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
181 | device                       | clause: extended device                                      | :good:`done`             |                                                                       |
182 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
183 | device                       | clause: uses_allocators clause                               | :good:`done`             |                                                                       |
184 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
185 | device                       | clause: in_reduction                                         | :part:`worked on`        | r308768                                                               |
186 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
187 | device                       | omp_get_device_num()                                         | :part:`worked on`        | D54342                                                                |
188 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
189 | device                       | structure mapping of references                              | :none:`unclaimed`        |                                                                       |
190 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
191 | device                       | nested target declare                                        | :good:`done`             | D51378                                                                |
192 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
193 | device                       | implicitly map 'this' (this[:1])                             | :good:`done`             | D55982                                                                |
194 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
195 | device                       | allow access to the reference count (omp_target_is_present)  | :good:`done`             |                                                                       |
196 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
197 | device                       | requires directive                                           | :part:`partial`          |                                                                       |
198 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
199 | device                       | clause: unified_shared_memory                                | :good:`done`             | D52625,D52359                                                         |
200 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
201 | device                       | clause: unified_address                                      | :part:`partial`          |                                                                       |
202 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
203 | device                       | clause: reverse_offload                                      | :none:`unclaimed parts`  | D52780                                                                |
204 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
205 | device                       | clause: atomic_default_mem_order                             | :good:`done`             | D53513                                                                |
206 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
207 | device                       | clause: dynamic_allocators                                   | :part:`unclaimed parts`  | D53079                                                                |
208 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
209 | device                       | user-defined mappers                                         | :part:`worked on`        | D56326,D58638,D58523,D58074,D60972,D59474                             |
210 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
211 | device                       | mapping lambda expression                                    | :good:`done`             | D51107                                                                |
212 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
213 | device                       | clause: use_device_addr for target data                      | :good:`done`             |                                                                       |
214 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
215 | device                       | support close modifier on map clause                         | :good:`done`             | D55719,D55892                                                         |
216 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
217 | device                       | teams construct on the host device                           | :part:`done`             | r371553                                                               |
218 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
219 | device                       | support non-contiguous array sections for target update      | :good:`done`             |                                                                       |
220 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
221 | device                       | pointer attachment                                           | :none:`unclaimed`        |                                                                       |
222 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
223 | device                       | map clause reordering based on map types                     | :none:`unclaimed`        |                                                                       |
224 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
225 | atomic                       | hints for the atomic construct                               | :good:`done`             | D51233                                                                |
226 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
227 | base language                | C11 support                                                  | :good:`done`             |                                                                       |
228 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
229 | base language                | C++11/14/17 support                                          | :good:`done`             |                                                                       |
230 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
231 | base language                | lambda support                                               | :good:`done`             |                                                                       |
232 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
233 | misc                         | array shaping                                                | :good:`done`             | D74144                                                                |
234 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
235 | misc                         | library shutdown (omp_pause_resource[_all])                  | :none:`unclaimed parts`  | D55078                                                                |
236 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
237 | misc                         | metadirectives                                               | :part:`worked on`        | D91944                                                                |
238 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
239 | misc                         | conditional modifier for lastprivate clause                  | :good:`done`             |                                                                       |
240 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
241 | misc                         | iterator and multidependences                                | :good:`done`             |                                                                       |
242 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
243 | misc                         | depobj directive and depobj dependency kind                  | :good:`done`             |                                                                       |
244 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
245 | misc                         | user-defined function variants                               | :part:`worked on`        | D67294, D64095, D71847, D71830, D109635                               |
246 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
247 | misc                         | pointer/reference to pointer based array reductions          | :none:`unclaimed`        |                                                                       |
248 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
249 | misc                         | prevent new type definitions in clauses                      | :good:`done`             |                                                                       |
250 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
251 | memory model                 | memory model update (seq_cst, acq_rel, release, acquire,...) | :good:`done`             |                                                                       |
252 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
255 OpenMP 5.1 Implementation Details
256 =================================
258 The following table provides a quick overview over various OpenMP 5.1 features
259 and their implementation status, as defined in the technical report 8 (TR8).
260 Please post on the 
261 `Discourse forums (Runtimes - OpenMP category)`_ for more 
262 information or if you want to help with the
263 implementation.
265 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
266 |Category                      | Feature                                                      | Status                   | Reviews                                                               |
267 +==============================+==============================================================+==========================+=======================================================================+
268 | atomic                       | 'compare' clause on atomic construct                         | :good:`done`             | D120290, D120007, D118632, D120200, D116261, D118547, D116637         |
269 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
270 | atomic                       | 'fail' clause on atomic construct                            | :part:`worked on`        |                                                                       |
271 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
272 | base language                | C++ attribute specifier syntax                               | :good:`done`             | D105648                                                               |
273 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
274 | device                       | 'present' map type modifier                                  | :good:`done`             | D83061, D83062, D84422                                                |
275 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
276 | device                       | 'present' motion modifier                                    | :good:`done`             | D84711, D84712                                                        |
277 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
278 | device                       | 'present' in defaultmap clause                               | :good:`done`             | D92427                                                                |
279 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
280 | device                       | map clause reordering reordering based on 'present' modifier | :none:`unclaimed`        |                                                                       |
281 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
282 | device                       | device-specific environment variables                        | :none:`unclaimed`        |                                                                       |
283 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
284 | device                       | omp_target_is_accessible routine                             | :none:`unclaimed`        |                                                                       |
285 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
286 | device                       | omp_get_mapped_ptr routine                                   | :none:`unclaimed`        |                                                                       |
287 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
288 | device                       | new async target memory copy routines                        | :none:`unclaimed`        |                                                                       |
289 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
290 | device                       | thread_limit clause on target construct                      | :none:`unclaimed`        |                                                                       |
291 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
292 | device                       | has_device_addr clause on target construct                   | :none:`unclaimed`        |                                                                       |
293 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
294 | device                       | iterators in map clause or motion clauses                    | :part:`worked on`        |                                                                       |
295 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
296 | device                       | indirect clause on declare target directive                  | :none:`unclaimed`        |                                                                       |
297 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
298 | device                       | allow virtual functions calls for mapped object on device    | :none:`unclaimed`        |                                                                       |
299 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
300 | device                       | interop construct                                            | :part:`partial`          | parsing/sema done: D98558, D98834, D98815                             |
301 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
302 | device                       | assorted routines for querying interoperable properties      | :none:`unclaimed`        |                                                                       |
303 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
304 | loop                         | Loop tiling transformation                                   | :good:`done`             | D76342                                                                |
305 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
306 | loop                         | Loop unrolling transformation                                | :good:`done`             | D99459                                                                |
307 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
308 | loop                         | 'reproducible'/'unconstrained' modifiers in 'order' clause   | :part:`partial`          | D127855                                                               |
309 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
310 | memory management            | alignment for allocate directive and clause                  | :part:`worked on`        |                                                                       |
311 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
312 | memory management            | new memory management routines                               | :none:`unclaimed`        |                                                                       |
313 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
314 | memory management            | changes to omp_alloctrait_key enum                           | :none:`unclaimed`        |                                                                       |
315 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
316 | memory model                 | seq_cst clause on flush construct                            | :none:`unclaimed`        |                                                                       |
317 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
318 | misc                         | 'omp_all_memory' keyword and use in 'depend' clause          | :good:`done`             | D125828, D126321                                                      |
319 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
320 | misc                         | error directive                                              | :none:`unclaimed`        |                                                                       |
321 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
322 | misc                         | scope construct                                              | :none:`unclaimed`        |                                                                       |
323 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
324 | misc                         | routines for controlling and querying team regions           | :none:`unclaimed`        |                                                                       |
325 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
326 | misc                         | changes to ompt_scope_endpoint_t enum                        | :none:`unclaimed`        |                                                                       |
327 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
328 | misc                         | omp_display_env routine                                      | :none:`unclaimed`        |                                                                       |
329 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
330 | misc                         | extended OMP_PLACES syntax                                   | :none:`unclaimed`        |                                                                       |
331 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
332 | misc                         | OMP_NUM_TEAMS and OMP_TEAMS_THREAD_LIMIT env vars            | :none:`unclaimed`        |                                                                       |
333 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
334 | misc                         | 'target_device' selector in context specifier                | :none:`unclaimed`        |                                                                       |
335 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
336 | misc                         | begin/end declare variant                                    | :good:`done`             | D71179                                                                |
337 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
338 | misc                         | dispatch construct and function variant argument adjustment  | :part:`worked on`        | D99537, D99679                                                        |
339 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
340 | misc                         | assume and assumes directives                                | :part:`worked on`        |                                                                       |
341 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
342 | misc                         | nothing directive                                            | :part:`worked on`        |                                                                       |
343 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
344 | misc                         | masked construct and related combined constructs             | :part:`worked on`        | D99995, D100514                                                       |
345 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
346 | misc                         | default(firstprivate) & default(private)                     | :part:`partial`          | firstprivate done: D75591                                             |
347 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
348 | other                        | deprecating master construct                                 | :none:`unclaimed`        |                                                                       |
349 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
350 | OMPT                         | new barrier types added to ompt_sync_region_t enum           | :none:`unclaimed`        |                                                                       |
351 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
352 | OMPT                         | async data transfers added to ompt_target_data_op_t enum     | :none:`unclaimed`        |                                                                       |
353 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
354 | OMPT                         | new barrier state values added to ompt_state_t enum          | :none:`unclaimed`        |                                                                       |
355 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
356 | OMPT                         | new 'emi' callbacks for external monitoring interfaces       | :none:`unclaimed`        |                                                                       |
357 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
358 | task                         | 'strict' modifier for taskloop construct                     | :none:`unclaimed`        |                                                                       |
359 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
360 | task                         | inoutset in depend clause                                    | :none:`unclaimed`        |                                                                       |
361 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
362 | task                         | nowait clause on taskwait                                    | :part:`worked on`        |                                                                       |
363 +------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
365 OpenMP Extensions
366 =================
368 The following table provides a quick overview over various OpenMP 
369 extensions and their implementation status.  These extensions are not
370 currently defined by any standard, so links to associated LLVM
371 documentation are provided.  As these extensions mature, they will be
372 considered for standardization. Please post on the
373 `Discourse forums (Runtimes - OpenMP category)`_ to provide feedback. 
375 +------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
376 |Category                      | Feature                                                                           | Status                   | Reviews                                                |
377 +==============================+===================================================================================+==========================+========================================================+
378 | atomic extension             | `'atomic' strictly nested within 'teams'                                          | :good:`prototyped`       | D126323                                                |
379 |                              | <https://openmp.llvm.org/docs/openacc/OpenMPExtensions.html#atomicWithinTeams>`_  |                          |                                                        |
380 +------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
381 | device extension             | `'ompx_hold' map type modifier                                                    | :good:`prototyped`       | D106509, D106510                                       |
382 |                              | <https://openmp.llvm.org/docs/openacc/OpenMPExtensions.html#ompx-hold>`_          |                          |                                                        |
383 +------------------------------+-----------------------------------------------------------------------------------+--------------------------+--------------------------------------------------------+
385 .. _Discourse forums (Runtimes - OpenMP category): https://discourse.llvm.org/c/runtimes/openmp/35