1/* Copyright (C) 2005-2022 Free Software Foundation, Inc.
2   Contributed by Richard Henderson <rth@redhat.com>.
3
4   This file is part of the GNU Offloading and Multi Processing Library
5   (libgomp).
6
7   Libgomp is free software; you can redistribute it and/or modify it
8   under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3, or (at your option)
10   any later version.
11
12   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
13   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15   more details.
16
17   Under Section 7 of GPL version 3, you are granted additional
18   permissions described in the GCC Runtime Library Exception, version
19   3.1, as published by the Free Software Foundation.
20
21   You should have received a copy of the GNU General Public License and
22   a copy of the GCC Runtime Library Exception along with this program;
23   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24   <http://www.gnu.org/licenses/>.  */
25
26#ifndef _OMP_H
27#define _OMP_H 1
28
29#if defined(__GNUC__) && _OPENMP >= 201811
30# define __GOMP_DEPRECATED_5_0 __attribute__((__deprecated__))
31#else
32# define __GOMP_DEPRECATED_5_0
33#endif
34
35#if defined(__GNUC__) && _OPENMP >= 202011
36# define __GOMP_DEPRECATED_5_1 __attribute__((__deprecated__))
37#else
38# define __GOMP_DEPRECATED_5_1
39#endif
40
41#ifndef _LIBGOMP_OMP_LOCK_DEFINED
42#define _LIBGOMP_OMP_LOCK_DEFINED 1
43/* These two structures get edited by the libgomp build process to 
44   reflect the shape of the two types.  Their internals are private
45   to the library.  */
46
47typedef struct
48{
49  unsigned char _x[@OMP_LOCK_SIZE@] 
50    __attribute__((__aligned__(@OMP_LOCK_ALIGN@)));
51} omp_lock_t;
52
53typedef struct
54{
55  unsigned char _x[@OMP_NEST_LOCK_SIZE@] 
56    __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@)));
57} omp_nest_lock_t;
58#endif
59
60typedef enum omp_sched_t
61{
62  omp_sched_static = 1,
63  omp_sched_dynamic = 2,
64  omp_sched_guided = 3,
65  omp_sched_auto = 4,
66  omp_sched_monotonic = 0x80000000U
67} omp_sched_t;
68
69typedef enum omp_proc_bind_t
70{
71  omp_proc_bind_false = 0,
72  omp_proc_bind_true = 1,
73  omp_proc_bind_primary = 2,
74  omp_proc_bind_master __GOMP_DEPRECATED_5_1
75    = omp_proc_bind_primary,
76  omp_proc_bind_close = 3,
77  omp_proc_bind_spread = 4
78} omp_proc_bind_t;
79
80typedef enum omp_sync_hint_t
81{
82  omp_sync_hint_none = 0,
83  omp_lock_hint_none __GOMP_DEPRECATED_5_0 = omp_sync_hint_none,
84  omp_sync_hint_uncontended = 1,
85  omp_lock_hint_uncontended __GOMP_DEPRECATED_5_0 = omp_sync_hint_uncontended,
86  omp_sync_hint_contended = 2,
87  omp_lock_hint_contended __GOMP_DEPRECATED_5_0 = omp_sync_hint_contended,
88  omp_sync_hint_nonspeculative = 4,
89  omp_lock_hint_nonspeculative __GOMP_DEPRECATED_5_0
90    = omp_sync_hint_nonspeculative,
91  omp_sync_hint_speculative = 8,
92  omp_lock_hint_speculative __GOMP_DEPRECATED_5_0 = omp_sync_hint_speculative
93} omp_sync_hint_t;
94
95typedef __GOMP_DEPRECATED_5_0 omp_sync_hint_t omp_lock_hint_t;
96
97typedef struct __attribute__((__aligned__ (sizeof (void *)))) omp_depend_t
98{
99  char __omp_depend_t__[2 * sizeof (void *)];
100} omp_depend_t;
101
102typedef enum omp_pause_resource_t
103{
104  omp_pause_soft = 1,
105  omp_pause_hard = 2
106} omp_pause_resource_t;
107
108typedef __UINTPTR_TYPE__ omp_uintptr_t;
109
110#if __cplusplus >= 201103L
111# define __GOMP_UINTPTR_T_ENUM : omp_uintptr_t
112#else
113# define __GOMP_UINTPTR_T_ENUM
114#endif
115
116typedef enum omp_memspace_handle_t __GOMP_UINTPTR_T_ENUM
117{
118  omp_default_mem_space = 0,
119  omp_large_cap_mem_space = 1,
120  omp_const_mem_space = 2,
121  omp_high_bw_mem_space = 3,
122  omp_low_lat_mem_space = 4,
123  __omp_memspace_handle_t_max__ = __UINTPTR_MAX__
124} omp_memspace_handle_t;
125
126typedef enum omp_allocator_handle_t __GOMP_UINTPTR_T_ENUM
127{
128  omp_null_allocator = 0,
129  omp_default_mem_alloc = 1,
130  omp_large_cap_mem_alloc = 2,
131  omp_const_mem_alloc = 3,
132  omp_high_bw_mem_alloc = 4,
133  omp_low_lat_mem_alloc = 5,
134  omp_cgroup_mem_alloc = 6,
135  omp_pteam_mem_alloc = 7,
136  omp_thread_mem_alloc = 8,
137  __omp_allocator_handle_t_max__ = __UINTPTR_MAX__
138} omp_allocator_handle_t;
139
140typedef enum omp_alloctrait_key_t
141{
142  omp_atk_sync_hint = 1,
143  omp_atk_alignment = 2,
144  omp_atk_access = 3,
145  omp_atk_pool_size = 4,
146  omp_atk_fallback = 5,
147  omp_atk_fb_data = 6,
148  omp_atk_pinned = 7,
149  omp_atk_partition = 8
150} omp_alloctrait_key_t;
151
152typedef enum omp_alloctrait_value_t
153{
154  omp_atv_default = (__UINTPTR_TYPE__) -1,
155  omp_atv_false = 0,
156  omp_atv_true = 1,
157  omp_atv_contended = 3,
158  omp_atv_uncontended = 4,
159  omp_atv_serialized = 5,
160  omp_atv_sequential __GOMP_DEPRECATED_5_1 = omp_atv_serialized,
161  omp_atv_private = 6,
162  omp_atv_all = 7,
163  omp_atv_thread = 8,
164  omp_atv_pteam = 9,
165  omp_atv_cgroup = 10,
166  omp_atv_default_mem_fb = 11,
167  omp_atv_null_fb = 12,
168  omp_atv_abort_fb = 13,
169  omp_atv_allocator_fb = 14,
170  omp_atv_environment = 15,
171  omp_atv_nearest = 16,
172  omp_atv_blocked = 17,
173  omp_atv_interleaved = 18
174} omp_alloctrait_value_t;
175
176typedef struct omp_alloctrait_t
177{
178  omp_alloctrait_key_t key;
179  omp_uintptr_t value;
180} omp_alloctrait_t;
181
182typedef enum omp_event_handle_t __GOMP_UINTPTR_T_ENUM
183{
184  __omp_event_handle_t_max__ = __UINTPTR_MAX__
185} omp_event_handle_t;
186
187#ifdef __cplusplus
188extern "C" {
189# define __GOMP_NOTHROW throw ()
190# define __GOMP_DEFAULT_NULL_ALLOCATOR = omp_null_allocator
191#else
192# define __GOMP_NOTHROW __attribute__((__nothrow__))
193# define __GOMP_DEFAULT_NULL_ALLOCATOR
194#endif
195
196extern void omp_set_num_threads (int) __GOMP_NOTHROW;
197extern int omp_get_num_threads (void) __GOMP_NOTHROW;
198extern int omp_get_max_threads (void) __GOMP_NOTHROW;
199extern int omp_get_thread_num (void) __GOMP_NOTHROW;
200extern int omp_get_num_procs (void) __GOMP_NOTHROW;
201
202extern int omp_in_parallel (void) __GOMP_NOTHROW;
203
204extern void omp_set_dynamic (int) __GOMP_NOTHROW;
205extern int omp_get_dynamic (void) __GOMP_NOTHROW;
206
207extern void omp_set_nested (int) __GOMP_NOTHROW __GOMP_DEPRECATED_5_0;
208extern int omp_get_nested (void) __GOMP_NOTHROW __GOMP_DEPRECATED_5_0;
209
210extern void omp_init_lock (omp_lock_t *) __GOMP_NOTHROW;
211extern void omp_init_lock_with_hint (omp_lock_t *, omp_sync_hint_t)
212  __GOMP_NOTHROW;
213extern void omp_destroy_lock (omp_lock_t *) __GOMP_NOTHROW;
214extern void omp_set_lock (omp_lock_t *) __GOMP_NOTHROW;
215extern void omp_unset_lock (omp_lock_t *) __GOMP_NOTHROW;
216extern int omp_test_lock (omp_lock_t *) __GOMP_NOTHROW;
217
218extern void omp_init_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
219extern void omp_init_nest_lock_with_hint (omp_nest_lock_t *, omp_sync_hint_t)
220  __GOMP_NOTHROW;
221extern void omp_destroy_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
222extern void omp_set_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
223extern void omp_unset_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
224extern int omp_test_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
225
226extern double omp_get_wtime (void) __GOMP_NOTHROW;
227extern double omp_get_wtick (void) __GOMP_NOTHROW;
228
229extern void omp_set_schedule (omp_sched_t, int) __GOMP_NOTHROW;
230extern void omp_get_schedule (omp_sched_t *, int *) __GOMP_NOTHROW;
231extern int omp_get_thread_limit (void) __GOMP_NOTHROW;
232extern void omp_set_max_active_levels (int) __GOMP_NOTHROW;
233extern int omp_get_max_active_levels (void) __GOMP_NOTHROW;
234extern int omp_get_supported_active_levels (void) __GOMP_NOTHROW;
235extern int omp_get_level (void) __GOMP_NOTHROW;
236extern int omp_get_ancestor_thread_num (int) __GOMP_NOTHROW;
237extern int omp_get_team_size (int) __GOMP_NOTHROW;
238extern int omp_get_active_level (void) __GOMP_NOTHROW;
239
240extern int omp_in_final (void) __GOMP_NOTHROW;
241
242extern int omp_get_cancellation (void) __GOMP_NOTHROW;
243extern omp_proc_bind_t omp_get_proc_bind (void) __GOMP_NOTHROW;
244extern int omp_get_num_places (void) __GOMP_NOTHROW;
245extern int omp_get_place_num_procs (int) __GOMP_NOTHROW;
246extern void omp_get_place_proc_ids (int, int *) __GOMP_NOTHROW;
247extern int omp_get_place_num (void) __GOMP_NOTHROW;
248extern int omp_get_partition_num_places (void) __GOMP_NOTHROW;
249extern void omp_get_partition_place_nums (int *) __GOMP_NOTHROW;
250
251extern void omp_set_default_device (int) __GOMP_NOTHROW;
252extern int omp_get_default_device (void) __GOMP_NOTHROW;
253extern int omp_get_num_devices (void) __GOMP_NOTHROW;
254extern int omp_get_device_num (void) __GOMP_NOTHROW;
255extern int omp_get_num_teams (void) __GOMP_NOTHROW;
256extern int omp_get_team_num (void) __GOMP_NOTHROW;
257
258extern int omp_is_initial_device (void) __GOMP_NOTHROW;
259extern int omp_get_initial_device (void) __GOMP_NOTHROW;
260extern int omp_get_max_task_priority (void) __GOMP_NOTHROW;
261
262extern void omp_fulfill_event (omp_event_handle_t) __GOMP_NOTHROW;
263
264extern void omp_set_num_teams (int) __GOMP_NOTHROW;
265extern int omp_get_max_teams (void) __GOMP_NOTHROW;
266extern void omp_set_teams_thread_limit (int) __GOMP_NOTHROW;
267extern int omp_get_teams_thread_limit (void) __GOMP_NOTHROW;
268
269extern void *omp_target_alloc (__SIZE_TYPE__, int) __GOMP_NOTHROW;
270extern void omp_target_free (void *, int) __GOMP_NOTHROW;
271extern int omp_target_is_present (const void *, int) __GOMP_NOTHROW;
272extern int omp_target_memcpy (void *, const void *, __SIZE_TYPE__,
273			      __SIZE_TYPE__, __SIZE_TYPE__, int, int)
274  __GOMP_NOTHROW;
275extern int omp_target_memcpy_rect (void *, const void *, __SIZE_TYPE__, int,
276				   const __SIZE_TYPE__ *,
277				   const __SIZE_TYPE__ *,
278				   const __SIZE_TYPE__ *,
279				   const __SIZE_TYPE__ *,
280				   const __SIZE_TYPE__ *, int, int)
281  __GOMP_NOTHROW;
282extern int omp_target_associate_ptr (const void *, const void *, __SIZE_TYPE__,
283				     __SIZE_TYPE__, int) __GOMP_NOTHROW;
284extern int omp_target_disassociate_ptr (const void *, int) __GOMP_NOTHROW;
285
286extern void omp_set_affinity_format (const char *) __GOMP_NOTHROW;
287extern __SIZE_TYPE__ omp_get_affinity_format (char *, __SIZE_TYPE__)
288  __GOMP_NOTHROW;
289extern void omp_display_affinity (const char *) __GOMP_NOTHROW;
290extern __SIZE_TYPE__ omp_capture_affinity (char *, __SIZE_TYPE__, const char *)
291  __GOMP_NOTHROW;
292
293extern int omp_pause_resource (omp_pause_resource_t, int) __GOMP_NOTHROW;
294extern int omp_pause_resource_all (omp_pause_resource_t) __GOMP_NOTHROW;
295
296extern omp_allocator_handle_t omp_init_allocator (omp_memspace_handle_t,
297						  int,
298						  const omp_alloctrait_t [])
299  __GOMP_NOTHROW;
300extern void omp_destroy_allocator (omp_allocator_handle_t) __GOMP_NOTHROW;
301extern void omp_set_default_allocator (omp_allocator_handle_t) __GOMP_NOTHROW;
302extern omp_allocator_handle_t omp_get_default_allocator (void) __GOMP_NOTHROW;
303extern void omp_free (void *,
304		      omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR)
305  __GOMP_NOTHROW;
306extern void *omp_alloc (__SIZE_TYPE__,
307			omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR)
308  __GOMP_NOTHROW __attribute__((__malloc__, __malloc__ (omp_free),
309				__alloc_size__ (1)));
310extern void *omp_aligned_alloc (__SIZE_TYPE__, __SIZE_TYPE__,
311				omp_allocator_handle_t
312				__GOMP_DEFAULT_NULL_ALLOCATOR)
313  __GOMP_NOTHROW __attribute__((__malloc__, __malloc__ (omp_free),
314				__alloc_size__ (2), __alloc_align__ (1)));
315extern void *omp_calloc (__SIZE_TYPE__, __SIZE_TYPE__,
316			 omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR)
317  __GOMP_NOTHROW __attribute__((__malloc__, __malloc__ (omp_free),
318				__alloc_size__ (1, 2)));
319extern void *omp_aligned_calloc (__SIZE_TYPE__, __SIZE_TYPE__, __SIZE_TYPE__,
320				 omp_allocator_handle_t
321				 __GOMP_DEFAULT_NULL_ALLOCATOR)
322  __GOMP_NOTHROW __attribute__((__malloc__, __malloc__ (omp_free),
323				__alloc_size__ (2, 3), __alloc_align__ (1)));
324extern void *omp_realloc (void *, __SIZE_TYPE__,
325			  omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR,
326			  omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR)
327  __GOMP_NOTHROW __attribute__((__malloc__ (omp_free), __alloc_size__ (2)));
328
329extern void omp_display_env (int) __GOMP_NOTHROW;
330
331#ifdef __cplusplus
332}
333#endif
334
335#endif /* _OMP_H */
336