1/* Copyright (C) 2005-2021 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#ifndef _LIBGOMP_OMP_LOCK_DEFINED
36#define _LIBGOMP_OMP_LOCK_DEFINED 1
37/* These two structures get edited by the libgomp build process to
38   reflect the shape of the two types.  Their internals are private
39   to the library.  */
40
41typedef struct
42{
43  unsigned char _x[@OMP_LOCK_SIZE@]
44    __attribute__((__aligned__(@OMP_LOCK_ALIGN@)));
45} omp_lock_t;
46
47typedef struct
48{
49  unsigned char _x[@OMP_NEST_LOCK_SIZE@]
50    __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@)));
51} omp_nest_lock_t;
52#endif
53
54typedef enum omp_sched_t
55{
56  omp_sched_static = 1,
57  omp_sched_dynamic = 2,
58  omp_sched_guided = 3,
59  omp_sched_auto = 4,
60  omp_sched_monotonic = 0x80000000U
61} omp_sched_t;
62
63typedef enum omp_proc_bind_t
64{
65  omp_proc_bind_false = 0,
66  omp_proc_bind_true = 1,
67  omp_proc_bind_master = 2,
68  omp_proc_bind_close = 3,
69  omp_proc_bind_spread = 4
70} omp_proc_bind_t;
71
72typedef enum omp_sync_hint_t
73{
74  omp_sync_hint_none = 0,
75  omp_lock_hint_none __GOMP_DEPRECATED_5_0 = omp_sync_hint_none,
76  omp_sync_hint_uncontended = 1,
77  omp_lock_hint_uncontended __GOMP_DEPRECATED_5_0 = omp_sync_hint_uncontended,
78  omp_sync_hint_contended = 2,
79  omp_lock_hint_contended __GOMP_DEPRECATED_5_0 = omp_sync_hint_contended,
80  omp_sync_hint_nonspeculative = 4,
81  omp_lock_hint_nonspeculative __GOMP_DEPRECATED_5_0
82    = omp_sync_hint_nonspeculative,
83  omp_sync_hint_speculative = 8,
84  omp_lock_hint_speculative __GOMP_DEPRECATED_5_0 = omp_sync_hint_speculative
85} omp_sync_hint_t;
86
87typedef __GOMP_DEPRECATED_5_0 omp_sync_hint_t omp_lock_hint_t;
88
89typedef struct __attribute__((__aligned__ (sizeof (void *)))) omp_depend_t
90{
91  char __omp_depend_t__[2 * sizeof (void *)];
92} omp_depend_t;
93
94typedef enum omp_pause_resource_t
95{
96  omp_pause_soft = 1,
97  omp_pause_hard = 2
98} omp_pause_resource_t;
99
100typedef __UINTPTR_TYPE__ omp_uintptr_t;
101
102#if __cplusplus >= 201103L
103# define __GOMP_UINTPTR_T_ENUM : omp_uintptr_t
104#else
105# define __GOMP_UINTPTR_T_ENUM
106#endif
107
108typedef enum omp_memspace_handle_t __GOMP_UINTPTR_T_ENUM
109{
110  omp_default_mem_space = 0,
111  omp_large_cap_mem_space = 1,
112  omp_const_mem_space = 2,
113  omp_high_bw_mem_space = 3,
114  omp_low_lat_mem_space = 4,
115  __omp_memspace_handle_t_max__ = __UINTPTR_MAX__
116} omp_memspace_handle_t;
117
118typedef enum omp_allocator_handle_t __GOMP_UINTPTR_T_ENUM
119{
120  omp_null_allocator = 0,
121  omp_default_mem_alloc = 1,
122  omp_large_cap_mem_alloc = 2,
123  omp_const_mem_alloc = 3,
124  omp_high_bw_mem_alloc = 4,
125  omp_low_lat_mem_alloc = 5,
126  omp_cgroup_mem_alloc = 6,
127  omp_pteam_mem_alloc = 7,
128  omp_thread_mem_alloc = 8,
129  __omp_allocator_handle_t_max__ = __UINTPTR_MAX__
130} omp_allocator_handle_t;
131
132typedef enum omp_alloctrait_key_t
133{
134  omp_atk_sync_hint = 1,
135  omp_atk_alignment = 2,
136  omp_atk_access = 3,
137  omp_atk_pool_size = 4,
138  omp_atk_fallback = 5,
139  omp_atk_fb_data = 6,
140  omp_atk_pinned = 7,
141  omp_atk_partition = 8
142} omp_alloctrait_key_t;
143
144typedef enum omp_alloctrait_value_t
145{
146  omp_atv_default = (__UINTPTR_TYPE__) -1,
147  omp_atv_false = 0,
148  omp_atv_true = 1,
149  omp_atv_contended = 3,
150  omp_atv_uncontended = 4,
151  omp_atv_serialized = 5,
152  omp_atv_sequential = omp_atv_serialized,
153  omp_atv_private = 6,
154  omp_atv_all = 7,
155  omp_atv_thread = 8,
156  omp_atv_pteam = 9,
157  omp_atv_cgroup = 10,
158  omp_atv_default_mem_fb = 11,
159  omp_atv_null_fb = 12,
160  omp_atv_abort_fb = 13,
161  omp_atv_allocator_fb = 14,
162  omp_atv_environment = 15,
163  omp_atv_nearest = 16,
164  omp_atv_blocked = 17,
165  omp_atv_interleaved = 18
166} omp_alloctrait_value_t;
167
168typedef struct omp_alloctrait_t
169{
170  omp_alloctrait_key_t key;
171  omp_uintptr_t value;
172} omp_alloctrait_t;
173
174typedef enum omp_event_handle_t __GOMP_UINTPTR_T_ENUM
175{
176  __omp_event_handle_t_max__ = __UINTPTR_MAX__
177} omp_event_handle_t;
178
179#ifdef __cplusplus
180extern "C" {
181# define __GOMP_NOTHROW throw ()
182# define __GOMP_DEFAULT_NULL_ALLOCATOR = omp_null_allocator
183#else
184# define __GOMP_NOTHROW __attribute__((__nothrow__))
185# define __GOMP_DEFAULT_NULL_ALLOCATOR
186#endif
187
188extern void omp_set_num_threads (int) __GOMP_NOTHROW;
189extern int omp_get_num_threads (void) __GOMP_NOTHROW;
190extern int omp_get_max_threads (void) __GOMP_NOTHROW;
191extern int omp_get_thread_num (void) __GOMP_NOTHROW;
192extern int omp_get_num_procs (void) __GOMP_NOTHROW;
193
194extern int omp_in_parallel (void) __GOMP_NOTHROW;
195
196extern void omp_set_dynamic (int) __GOMP_NOTHROW;
197extern int omp_get_dynamic (void) __GOMP_NOTHROW;
198
199extern void omp_set_nested (int) __GOMP_NOTHROW __GOMP_DEPRECATED_5_0;
200extern int omp_get_nested (void) __GOMP_NOTHROW __GOMP_DEPRECATED_5_0;
201
202extern void omp_init_lock (omp_lock_t *) __GOMP_NOTHROW;
203extern void omp_init_lock_with_hint (omp_lock_t *, omp_sync_hint_t)
204  __GOMP_NOTHROW;
205extern void omp_destroy_lock (omp_lock_t *) __GOMP_NOTHROW;
206extern void omp_set_lock (omp_lock_t *) __GOMP_NOTHROW;
207extern void omp_unset_lock (omp_lock_t *) __GOMP_NOTHROW;
208extern int omp_test_lock (omp_lock_t *) __GOMP_NOTHROW;
209
210extern void omp_init_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
211extern void omp_init_nest_lock_with_hint (omp_nest_lock_t *, omp_sync_hint_t)
212  __GOMP_NOTHROW;
213extern void omp_destroy_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
214extern void omp_set_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
215extern void omp_unset_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
216extern int omp_test_nest_lock (omp_nest_lock_t *) __GOMP_NOTHROW;
217
218extern double omp_get_wtime (void) __GOMP_NOTHROW;
219extern double omp_get_wtick (void) __GOMP_NOTHROW;
220
221extern void omp_set_schedule (omp_sched_t, int) __GOMP_NOTHROW;
222extern void omp_get_schedule (omp_sched_t *, int *) __GOMP_NOTHROW;
223extern int omp_get_thread_limit (void) __GOMP_NOTHROW;
224extern void omp_set_max_active_levels (int) __GOMP_NOTHROW;
225extern int omp_get_max_active_levels (void) __GOMP_NOTHROW;
226extern int omp_get_supported_active_levels (void) __GOMP_NOTHROW;
227extern int omp_get_level (void) __GOMP_NOTHROW;
228extern int omp_get_ancestor_thread_num (int) __GOMP_NOTHROW;
229extern int omp_get_team_size (int) __GOMP_NOTHROW;
230extern int omp_get_active_level (void) __GOMP_NOTHROW;
231
232extern int omp_in_final (void) __GOMP_NOTHROW;
233
234extern int omp_get_cancellation (void) __GOMP_NOTHROW;
235extern omp_proc_bind_t omp_get_proc_bind (void) __GOMP_NOTHROW;
236extern int omp_get_num_places (void) __GOMP_NOTHROW;
237extern int omp_get_place_num_procs (int) __GOMP_NOTHROW;
238extern void omp_get_place_proc_ids (int, int *) __GOMP_NOTHROW;
239extern int omp_get_place_num (void) __GOMP_NOTHROW;
240extern int omp_get_partition_num_places (void) __GOMP_NOTHROW;
241extern void omp_get_partition_place_nums (int *) __GOMP_NOTHROW;
242
243extern void omp_set_default_device (int) __GOMP_NOTHROW;
244extern int omp_get_default_device (void) __GOMP_NOTHROW;
245extern int omp_get_num_devices (void) __GOMP_NOTHROW;
246extern int omp_get_num_teams (void) __GOMP_NOTHROW;
247extern int omp_get_team_num (void) __GOMP_NOTHROW;
248
249extern int omp_is_initial_device (void) __GOMP_NOTHROW;
250extern int omp_get_initial_device (void) __GOMP_NOTHROW;
251extern int omp_get_max_task_priority (void) __GOMP_NOTHROW;
252
253extern void omp_fulfill_event (omp_event_handle_t) __GOMP_NOTHROW;
254
255extern void *omp_target_alloc (__SIZE_TYPE__, int) __GOMP_NOTHROW;
256extern void omp_target_free (void *, int) __GOMP_NOTHROW;
257extern int omp_target_is_present (const void *, int) __GOMP_NOTHROW;
258extern int omp_target_memcpy (void *, const void *, __SIZE_TYPE__,
259			      __SIZE_TYPE__, __SIZE_TYPE__, int, int)
260  __GOMP_NOTHROW;
261extern int omp_target_memcpy_rect (void *, const void *, __SIZE_TYPE__, int,
262				   const __SIZE_TYPE__ *,
263				   const __SIZE_TYPE__ *,
264				   const __SIZE_TYPE__ *,
265				   const __SIZE_TYPE__ *,
266				   const __SIZE_TYPE__ *, int, int)
267  __GOMP_NOTHROW;
268extern int omp_target_associate_ptr (const void *, const void *, __SIZE_TYPE__,
269				     __SIZE_TYPE__, int) __GOMP_NOTHROW;
270extern int omp_target_disassociate_ptr (const void *, int) __GOMP_NOTHROW;
271
272extern void omp_set_affinity_format (const char *) __GOMP_NOTHROW;
273extern __SIZE_TYPE__ omp_get_affinity_format (char *, __SIZE_TYPE__)
274  __GOMP_NOTHROW;
275extern void omp_display_affinity (const char *) __GOMP_NOTHROW;
276extern __SIZE_TYPE__ omp_capture_affinity (char *, __SIZE_TYPE__, const char *)
277  __GOMP_NOTHROW;
278
279extern int omp_pause_resource (omp_pause_resource_t, int) __GOMP_NOTHROW;
280extern int omp_pause_resource_all (omp_pause_resource_t) __GOMP_NOTHROW;
281
282extern omp_allocator_handle_t omp_init_allocator (omp_memspace_handle_t,
283						  int,
284						  const omp_alloctrait_t [])
285  __GOMP_NOTHROW;
286extern void omp_destroy_allocator (omp_allocator_handle_t) __GOMP_NOTHROW;
287extern void omp_set_default_allocator (omp_allocator_handle_t) __GOMP_NOTHROW;
288extern omp_allocator_handle_t omp_get_default_allocator (void) __GOMP_NOTHROW;
289extern void *omp_alloc (__SIZE_TYPE__,
290			omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR)
291  __GOMP_NOTHROW __attribute__((__malloc__, __alloc_size__ (1)));
292extern void omp_free (void *,
293		      omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR)
294  __GOMP_NOTHROW;
295
296#ifdef __cplusplus
297}
298#endif
299
300#endif /* _OMP_H */
301