blob: 558860b3a4253c6e90bf786502f783c5c780a4a0 [file] [log] [blame]
George Rokos0dd6ed72018-01-29 13:59:35 +00001//===------- interface.h - NVPTX OpenMP interface definitions ---- CUDA -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.txt for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains debug macros to be used in the application.
11//
12// This file contains all the definitions that are relevant to
13// the interface. The first section contains the interface as
14// declared by OpenMP. A second section includes library private calls
15// (mostly debug, temporary?) The third section includes the compiler
16// specific interfaces.
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef _INTERFACES_H_
21#define _INTERFACES_H_
22
Jonas Hahnfeld82d20202018-09-04 15:13:17 +000023#include "option.h"
24
George Rokos0dd6ed72018-01-29 13:59:35 +000025////////////////////////////////////////////////////////////////////////////////
26// OpenMP interface
27////////////////////////////////////////////////////////////////////////////////
28
29typedef uint32_t omp_lock_t; /* arbitrary type of the right length */
30typedef uint64_t omp_nest_lock_t; /* arbitrary type of the right length */
31
32typedef enum omp_sched_t {
33 omp_sched_static = 1, /* chunkSize >0 */
34 omp_sched_dynamic = 2, /* chunkSize >0 */
35 omp_sched_guided = 3, /* chunkSize >0 */
36 omp_sched_auto = 4, /* no chunkSize */
37} omp_sched_t;
38
39typedef enum omp_proc_bind_t {
40 omp_proc_bind_false = 0,
41 omp_proc_bind_true = 1,
42 omp_proc_bind_master = 2,
43 omp_proc_bind_close = 3,
44 omp_proc_bind_spread = 4
45} omp_proc_bind_t;
46
47EXTERN double omp_get_wtick(void);
48EXTERN double omp_get_wtime(void);
49
50EXTERN void omp_set_num_threads(int num);
51EXTERN int omp_get_num_threads(void);
52EXTERN int omp_get_max_threads(void);
53EXTERN int omp_get_thread_limit(void);
54EXTERN int omp_get_thread_num(void);
55EXTERN int omp_get_num_procs(void);
56EXTERN int omp_in_parallel(void);
57EXTERN int omp_in_final(void);
58EXTERN void omp_set_dynamic(int flag);
59EXTERN int omp_get_dynamic(void);
60EXTERN void omp_set_nested(int flag);
61EXTERN int omp_get_nested(void);
62EXTERN void omp_set_max_active_levels(int level);
63EXTERN int omp_get_max_active_levels(void);
64EXTERN int omp_get_level(void);
65EXTERN int omp_get_active_level(void);
66EXTERN int omp_get_ancestor_thread_num(int level);
67EXTERN int omp_get_team_size(int level);
68
69EXTERN void omp_init_lock(omp_lock_t *lock);
70EXTERN void omp_init_nest_lock(omp_nest_lock_t *lock);
71EXTERN void omp_destroy_lock(omp_lock_t *lock);
72EXTERN void omp_destroy_nest_lock(omp_nest_lock_t *lock);
73EXTERN void omp_set_lock(omp_lock_t *lock);
74EXTERN void omp_set_nest_lock(omp_nest_lock_t *lock);
75EXTERN void omp_unset_lock(omp_lock_t *lock);
76EXTERN void omp_unset_nest_lock(omp_nest_lock_t *lock);
77EXTERN int omp_test_lock(omp_lock_t *lock);
78EXTERN int omp_test_nest_lock(omp_nest_lock_t *lock);
79
80EXTERN void omp_get_schedule(omp_sched_t *kind, int *modifier);
81EXTERN void omp_set_schedule(omp_sched_t kind, int modifier);
82EXTERN omp_proc_bind_t omp_get_proc_bind(void);
83EXTERN int omp_get_cancellation(void);
84EXTERN void omp_set_default_device(int deviceId);
85EXTERN int omp_get_default_device(void);
86EXTERN int omp_get_num_devices(void);
87EXTERN int omp_get_num_teams(void);
88EXTERN int omp_get_team_num(void);
89EXTERN int omp_is_initial_device(void);
90EXTERN int omp_get_initial_device(void);
91EXTERN int omp_get_max_task_priority(void);
92
93////////////////////////////////////////////////////////////////////////////////
George Rokos0dd6ed72018-01-29 13:59:35 +000094// file below is swiped from kmpc host interface
95////////////////////////////////////////////////////////////////////////////////
96
97////////////////////////////////////////////////////////////////////////////////
98// kmp specifc types
99////////////////////////////////////////////////////////////////////////////////
100
101typedef enum kmp_sched_t {
102 kmp_sched_static_chunk = 33,
103 kmp_sched_static_nochunk = 34,
104 kmp_sched_dynamic = 35,
105 kmp_sched_guided = 36,
106 kmp_sched_runtime = 37,
107 kmp_sched_auto = 38,
108
Alexey Bataevb7a5d382018-08-29 17:35:09 +0000109 kmp_sched_static_balanced_chunk = 45,
110
George Rokos0dd6ed72018-01-29 13:59:35 +0000111 kmp_sched_static_ordered = 65,
112 kmp_sched_static_nochunk_ordered = 66,
113 kmp_sched_dynamic_ordered = 67,
114 kmp_sched_guided_ordered = 68,
115 kmp_sched_runtime_ordered = 69,
116 kmp_sched_auto_ordered = 70,
117
118 kmp_sched_distr_static_chunk = 91,
119 kmp_sched_distr_static_nochunk = 92,
120 kmp_sched_distr_static_chunk_sched_static_chunkone = 93,
121
122 kmp_sched_default = kmp_sched_static_nochunk,
123 kmp_sched_unordered_first = kmp_sched_static_chunk,
124 kmp_sched_unordered_last = kmp_sched_auto,
125 kmp_sched_ordered_first = kmp_sched_static_ordered,
126 kmp_sched_ordered_last = kmp_sched_auto_ordered,
127 kmp_sched_distribute_first = kmp_sched_distr_static_chunk,
128 kmp_sched_distribute_last =
129 kmp_sched_distr_static_chunk_sched_static_chunkone,
130
131 /* Support for OpenMP 4.5 monotonic and nonmonotonic schedule modifiers.
132 * Since we need to distinguish the three possible cases (no modifier,
133 * monotonic modifier, nonmonotonic modifier), we need separate bits for
134 * each modifier. The absence of monotonic does not imply nonmonotonic,
135 * especially since 4.5 says that the behaviour of the "no modifier" case
136 * is implementation defined in 4.5, but will become "nonmonotonic" in 5.0.
137 *
138 * Since we're passing a full 32 bit value, we can use a couple of high
139 * bits for these flags; out of paranoia we avoid the sign bit.
140 *
141 * These modifiers can be or-ed into non-static schedules by the compiler
142 * to pass the additional information. They will be stripped early in the
143 * processing in __kmp_dispatch_init when setting up schedules, so
144 * most of the code won't ever see schedules with these bits set.
145 */
146 kmp_sched_modifier_monotonic = (1 << 29),
147 /**< Set if the monotonic schedule modifier was present */
148 kmp_sched_modifier_nonmonotonic = (1 << 30),
149/**< Set if the nonmonotonic schedule modifier was present */
150
151#define SCHEDULE_WITHOUT_MODIFIERS(s) \
152 (enum kmp_sched_t)( \
153 (s) & ~(kmp_sched_modifier_nonmonotonic | kmp_sched_modifier_monotonic))
154#define SCHEDULE_HAS_MONOTONIC(s) (((s)&kmp_sched_modifier_monotonic) != 0)
155#define SCHEDULE_HAS_NONMONOTONIC(s) \
156 (((s)&kmp_sched_modifier_nonmonotonic) != 0)
157#define SCHEDULE_HAS_NO_MODIFIERS(s) \
158 (((s) & (kmp_sched_modifier_nonmonotonic | kmp_sched_modifier_monotonic)) == \
159 0)
160
161} kmp_sched_t;
162
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000163/*!
164 * Enum for accesseing the reserved_2 field of the ident_t struct below.
165 */
166enum {
167 /*! Bit set to 1 when in SPMD mode. */
168 KMP_IDENT_SPMD_MODE = 0x01,
169 /*! Bit set to 1 when a simplified runtime is used. */
170 KMP_IDENT_SIMPLE_RT_MODE = 0x02,
171};
172
173/*!
174 * The ident structure that describes a source location.
175 * The struct is identical to the one in the kmp.h file.
176 * We maintain the same data structure for compatibility.
177 */
178typedef int kmp_int32;
179typedef struct ident {
180 kmp_int32 reserved_1; /**< might be used in Fortran; see above */
181 kmp_int32 flags; /**< also f.flags; KMP_IDENT_xxx flags; KMP_IDENT_KMPC
182 identifies this union member */
183 kmp_int32 reserved_2; /**< not really used in Fortran any more; see above */
184 kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for C++ */
185 char const *psource; /**< String describing the source location.
186 The string is composed of semi-colon separated fields
187 which describe the source file, the function and a pair
188 of line numbers that delimit the construct. */
189} ident_t;
190
George Rokos0dd6ed72018-01-29 13:59:35 +0000191// parallel defs
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000192typedef ident_t kmp_Ident;
George Rokos0dd6ed72018-01-29 13:59:35 +0000193typedef void (*kmp_ParFctPtr)(int32_t *global_tid, int32_t *bound_tid, ...);
194typedef void (*kmp_ReductFctPtr)(void *lhsData, void *rhsData);
195typedef void (*kmp_InterWarpCopyFctPtr)(void *src, int32_t warp_num);
196typedef void (*kmp_ShuffleReductFctPtr)(void *rhsData, int16_t lane_id,
197 int16_t lane_offset,
198 int16_t shortCircuit);
199typedef void (*kmp_CopyToScratchpadFctPtr)(void *reduceData, void *scratchpad,
200 int32_t index, int32_t width);
201typedef void (*kmp_LoadReduceFctPtr)(void *reduceData, void *scratchpad,
202 int32_t index, int32_t width,
203 int32_t reduce);
204
205// task defs
206typedef struct kmp_TaskDescr kmp_TaskDescr;
207typedef int32_t (*kmp_TaskFctPtr)(int32_t global_tid, kmp_TaskDescr *taskDescr);
208typedef struct kmp_TaskDescr {
209 void *sharedPointerTable; // ptr to a table of shared var ptrs
210 kmp_TaskFctPtr sub; // task subroutine
211 int32_t partId; // unused
212 kmp_TaskFctPtr destructors; // destructor of c++ first private
213} kmp_TaskDescr;
214// task dep defs
215#define KMP_TASKDEP_IN 0x1u
216#define KMP_TASKDEP_OUT 0x2u
217typedef struct kmp_TaskDep_Public {
218 void *addr;
219 size_t len;
220 uint8_t flags; // bit 0: in, bit 1: out
221} kmp_TaskDep_Public;
222
223// flags that interpret the interface part of tasking flags
224#define KMP_TASK_IS_TIED 0x1
225#define KMP_TASK_FINAL 0x2
226#define KMP_TASK_MERGED_IF0 0x4 /* unused */
227#define KMP_TASK_DESTRUCTOR_THUNK 0x8
228
229// flags for task setup return
230#define KMP_CURRENT_TASK_NOT_SUSPENDED 0
231#define KMP_CURRENT_TASK_SUSPENDED 1
232
233// sync defs
234typedef int32_t kmp_CriticalName[8];
235
236////////////////////////////////////////////////////////////////////////////////
237// flags for kstate (all bits initially off)
238////////////////////////////////////////////////////////////////////////////////
239
240// first 2 bits used by kmp_Reduction (defined in kmp_reduction.cpp)
241#define KMP_REDUCTION_MASK 0x3
242#define KMP_SKIP_NEXT_CALL 0x4
243#define KMP_SKIP_NEXT_CANCEL_BARRIER 0x8
244
245////////////////////////////////////////////////////////////////////////////////
246// data
247////////////////////////////////////////////////////////////////////////////////
248
249////////////////////////////////////////////////////////////////////////////////
250// external interface
251////////////////////////////////////////////////////////////////////////////////
252
253// query
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000254EXTERN int32_t __kmpc_global_num_threads(kmp_Ident *loc); // missing
255EXTERN int32_t __kmpc_bound_thread_num(kmp_Ident *loc); // missing
256EXTERN int32_t __kmpc_bound_num_threads(kmp_Ident *loc); // missing
257EXTERN int32_t __kmpc_in_parallel(kmp_Ident *loc); // missing
George Rokos0dd6ed72018-01-29 13:59:35 +0000258
259// parallel
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000260EXTERN int32_t __kmpc_global_thread_num(kmp_Ident *loc);
261EXTERN void __kmpc_push_num_threads(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000262 int32_t num_threads);
263// simd
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000264EXTERN void __kmpc_push_simd_limit(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000265 int32_t simd_limit);
266// aee ... not supported
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000267// EXTERN void __kmpc_fork_call(kmp_Ident *loc, int32_t argc, kmp_ParFctPtr
George Rokos0dd6ed72018-01-29 13:59:35 +0000268// microtask, ...);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000269EXTERN void __kmpc_serialized_parallel(kmp_Ident *loc, uint32_t global_tid);
270EXTERN void __kmpc_end_serialized_parallel(kmp_Ident *loc,
George Rokos0dd6ed72018-01-29 13:59:35 +0000271 uint32_t global_tid);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000272EXTERN uint16_t __kmpc_parallel_level(kmp_Ident *loc, uint32_t global_tid);
George Rokos0dd6ed72018-01-29 13:59:35 +0000273
274// proc bind
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000275EXTERN void __kmpc_push_proc_bind(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000276 int proc_bind);
277EXTERN int omp_get_num_places(void);
278EXTERN int omp_get_place_num_procs(int place_num);
279EXTERN void omp_get_place_proc_ids(int place_num, int *ids);
280EXTERN int omp_get_place_num(void);
281EXTERN int omp_get_partition_num_places(void);
282EXTERN void omp_get_partition_place_nums(int *place_nums);
283
284// for static (no chunk or chunk)
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000285EXTERN void __kmpc_for_static_init_4(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000286 int32_t sched, int32_t *plastiter,
287 int32_t *plower, int32_t *pupper,
288 int32_t *pstride, int32_t incr,
289 int32_t chunk);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000290EXTERN void __kmpc_for_static_init_4u(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000291 int32_t sched, int32_t *plastiter,
292 uint32_t *plower, uint32_t *pupper,
293 int32_t *pstride, int32_t incr,
294 int32_t chunk);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000295EXTERN void __kmpc_for_static_init_8(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000296 int32_t sched, int32_t *plastiter,
297 int64_t *plower, int64_t *pupper,
298 int64_t *pstride, int64_t incr,
299 int64_t chunk);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000300EXTERN void __kmpc_for_static_init_8u(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000301 int32_t sched, int32_t *plastiter1,
302 uint64_t *plower, uint64_t *pupper,
303 int64_t *pstride, int64_t incr,
304 int64_t chunk);
305EXTERN
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000306void __kmpc_for_static_init_4_simple_spmd(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000307 int32_t sched, int32_t *plastiter,
308 int32_t *plower, int32_t *pupper,
309 int32_t *pstride, int32_t incr,
310 int32_t chunk);
311EXTERN
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000312void __kmpc_for_static_init_4u_simple_spmd(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000313 int32_t sched, int32_t *plastiter,
314 uint32_t *plower, uint32_t *pupper,
315 int32_t *pstride, int32_t incr,
316 int32_t chunk);
317EXTERN
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000318void __kmpc_for_static_init_8_simple_spmd(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000319 int32_t sched, int32_t *plastiter,
320 int64_t *plower, int64_t *pupper,
321 int64_t *pstride, int64_t incr,
322 int64_t chunk);
323EXTERN
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000324void __kmpc_for_static_init_8u_simple_spmd(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000325 int32_t sched, int32_t *plastiter1,
326 uint64_t *plower, uint64_t *pupper,
327 int64_t *pstride, int64_t incr,
328 int64_t chunk);
329EXTERN
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000330void __kmpc_for_static_init_4_simple_generic(kmp_Ident *loc,
George Rokos0dd6ed72018-01-29 13:59:35 +0000331 int32_t global_tid, int32_t sched,
332 int32_t *plastiter,
333 int32_t *plower, int32_t *pupper,
334 int32_t *pstride, int32_t incr,
335 int32_t chunk);
336EXTERN
337void __kmpc_for_static_init_4u_simple_generic(
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000338 kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter,
George Rokos0dd6ed72018-01-29 13:59:35 +0000339 uint32_t *plower, uint32_t *pupper, int32_t *pstride, int32_t incr,
340 int32_t chunk);
341EXTERN
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000342void __kmpc_for_static_init_8_simple_generic(kmp_Ident *loc,
George Rokos0dd6ed72018-01-29 13:59:35 +0000343 int32_t global_tid, int32_t sched,
344 int32_t *plastiter,
345 int64_t *plower, int64_t *pupper,
346 int64_t *pstride, int64_t incr,
347 int64_t chunk);
348EXTERN
349void __kmpc_for_static_init_8u_simple_generic(
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000350 kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter1,
George Rokos0dd6ed72018-01-29 13:59:35 +0000351 uint64_t *plower, uint64_t *pupper, int64_t *pstride, int64_t incr,
352 int64_t chunk);
353
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000354EXTERN void __kmpc_for_static_fini(kmp_Ident *loc, int32_t global_tid);
George Rokos0dd6ed72018-01-29 13:59:35 +0000355
356// for dynamic
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000357EXTERN void __kmpc_dispatch_init_4(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000358 int32_t sched, int32_t lower, int32_t upper,
359 int32_t incr, int32_t chunk);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000360EXTERN void __kmpc_dispatch_init_4u(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000361 int32_t sched, uint32_t lower,
362 uint32_t upper, int32_t incr,
363 int32_t chunk);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000364EXTERN void __kmpc_dispatch_init_8(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000365 int32_t sched, int64_t lower, int64_t upper,
366 int64_t incr, int64_t chunk);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000367EXTERN void __kmpc_dispatch_init_8u(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000368 int32_t sched, uint64_t lower,
369 uint64_t upper, int64_t incr,
370 int64_t chunk);
371
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000372EXTERN int __kmpc_dispatch_next_4(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000373 int32_t *plastiter, int32_t *plower,
374 int32_t *pupper, int32_t *pstride);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000375EXTERN int __kmpc_dispatch_next_4u(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000376 int32_t *plastiter, uint32_t *plower,
377 uint32_t *pupper, int32_t *pstride);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000378EXTERN int __kmpc_dispatch_next_8(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000379 int32_t *plastiter, int64_t *plower,
380 int64_t *pupper, int64_t *pstride);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000381EXTERN int __kmpc_dispatch_next_8u(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000382 int32_t *plastiter, uint64_t *plower,
383 uint64_t *pupper, int64_t *pstride);
384
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000385EXTERN void __kmpc_dispatch_fini_4(kmp_Ident *loc, int32_t global_tid);
386EXTERN void __kmpc_dispatch_fini_4u(kmp_Ident *loc, int32_t global_tid);
387EXTERN void __kmpc_dispatch_fini_8(kmp_Ident *loc, int32_t global_tid);
388EXTERN void __kmpc_dispatch_fini_8u(kmp_Ident *loc, int32_t global_tid);
George Rokos0dd6ed72018-01-29 13:59:35 +0000389
390// Support for reducing conditional lastprivate variables
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000391EXTERN void __kmpc_reduce_conditional_lastprivate(kmp_Ident *loc,
George Rokos0dd6ed72018-01-29 13:59:35 +0000392 int32_t global_tid,
393 int32_t varNum, void *array);
394
395// reduction
396EXTERN void __kmpc_nvptx_end_reduce(int32_t global_tid);
397EXTERN void __kmpc_nvptx_end_reduce_nowait(int32_t global_tid);
Alexey Bataevdcf2edc2019-01-04 17:09:12 +0000398EXTERN __attribute__((deprecated)) int32_t __kmpc_nvptx_parallel_reduce_nowait(
George Rokos0dd6ed72018-01-29 13:59:35 +0000399 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
400 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
Alexey Bataevdcf2edc2019-01-04 17:09:12 +0000401EXTERN int32_t __kmpc_nvptx_parallel_reduce_nowait_v2(
402 kmp_Ident *loc, int32_t global_tid, int32_t num_vars, size_t reduce_size,
403 void *reduce_data, kmp_ShuffleReductFctPtr shflFct,
404 kmp_InterWarpCopyFctPtr cpyFct);
George Rokos0dd6ed72018-01-29 13:59:35 +0000405EXTERN int32_t __kmpc_nvptx_parallel_reduce_nowait_simple_spmd(
406 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
407 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
408EXTERN int32_t __kmpc_nvptx_parallel_reduce_nowait_simple_generic(
409 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
410 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
411EXTERN int32_t __kmpc_nvptx_simd_reduce_nowait(
412 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
413 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
414EXTERN int32_t __kmpc_nvptx_teams_reduce_nowait(
415 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
416 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct,
417 kmp_CopyToScratchpadFctPtr sratchFct, kmp_LoadReduceFctPtr ldFct);
418EXTERN int32_t __kmpc_nvptx_teams_reduce_nowait_simple_spmd(
419 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
420 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct,
421 kmp_CopyToScratchpadFctPtr sratchFct, kmp_LoadReduceFctPtr ldFct);
422EXTERN int32_t __kmpc_nvptx_teams_reduce_nowait_simple_generic(
423 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
424 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct,
425 kmp_CopyToScratchpadFctPtr sratchFct, kmp_LoadReduceFctPtr ldFct);
Alexey Bataevd4de4392018-11-27 21:06:09 +0000426EXTERN int32_t __kmpc_nvptx_teams_reduce_nowait_simple(kmp_Ident *loc,
427 int32_t global_tid,
428 kmp_CriticalName *crit);
429EXTERN void __kmpc_nvptx_teams_end_reduce_nowait_simple(kmp_Ident *loc,
430 int32_t global_tid,
431 kmp_CriticalName *crit);
George Rokos0dd6ed72018-01-29 13:59:35 +0000432EXTERN int32_t __kmpc_shuffle_int32(int32_t val, int16_t delta, int16_t size);
433EXTERN int64_t __kmpc_shuffle_int64(int64_t val, int16_t delta, int16_t size);
434
435// sync barrier
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000436EXTERN void __kmpc_barrier(kmp_Ident *loc_ref, int32_t tid);
437EXTERN void __kmpc_barrier_simple_spmd(kmp_Ident *loc_ref, int32_t tid);
438EXTERN void __kmpc_barrier_simple_generic(kmp_Ident *loc_ref, int32_t tid);
439EXTERN int32_t __kmpc_cancel_barrier(kmp_Ident *loc, int32_t global_tid);
George Rokos0dd6ed72018-01-29 13:59:35 +0000440
441// single
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000442EXTERN int32_t __kmpc_single(kmp_Ident *loc, int32_t global_tid);
443EXTERN void __kmpc_end_single(kmp_Ident *loc, int32_t global_tid);
George Rokos0dd6ed72018-01-29 13:59:35 +0000444
445// sync
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000446EXTERN int32_t __kmpc_master(kmp_Ident *loc, int32_t global_tid);
447EXTERN void __kmpc_end_master(kmp_Ident *loc, int32_t global_tid);
448EXTERN void __kmpc_ordered(kmp_Ident *loc, int32_t global_tid);
449EXTERN void __kmpc_end_ordered(kmp_Ident *loc, int32_t global_tid);
450EXTERN void __kmpc_critical(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000451 kmp_CriticalName *crit);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000452EXTERN void __kmpc_end_critical(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000453 kmp_CriticalName *crit);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000454EXTERN void __kmpc_flush(kmp_Ident *loc);
George Rokos0dd6ed72018-01-29 13:59:35 +0000455
456// vote
457EXTERN int32_t __kmpc_warp_active_thread_mask();
458
459// tasks
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000460EXTERN kmp_TaskDescr *__kmpc_omp_task_alloc(kmp_Ident *loc,
George Rokos0dd6ed72018-01-29 13:59:35 +0000461 uint32_t global_tid, int32_t flag,
462 size_t sizeOfTaskInclPrivate,
463 size_t sizeOfSharedTable,
464 kmp_TaskFctPtr sub);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000465EXTERN int32_t __kmpc_omp_task(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000466 kmp_TaskDescr *newLegacyTaskDescr);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000467EXTERN int32_t __kmpc_omp_task_with_deps(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000468 kmp_TaskDescr *newLegacyTaskDescr,
469 int32_t depNum, void *depList,
470 int32_t noAliasDepNum,
471 void *noAliasDepList);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000472EXTERN void __kmpc_omp_task_begin_if0(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000473 kmp_TaskDescr *newLegacyTaskDescr);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000474EXTERN void __kmpc_omp_task_complete_if0(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000475 kmp_TaskDescr *newLegacyTaskDescr);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000476EXTERN void __kmpc_omp_wait_deps(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000477 int32_t depNum, void *depList,
478 int32_t noAliasDepNum, void *noAliasDepList);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000479EXTERN void __kmpc_taskgroup(kmp_Ident *loc, uint32_t global_tid);
480EXTERN void __kmpc_end_taskgroup(kmp_Ident *loc, uint32_t global_tid);
481EXTERN int32_t __kmpc_omp_taskyield(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000482 int end_part);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000483EXTERN int32_t __kmpc_omp_taskwait(kmp_Ident *loc, uint32_t global_tid);
484EXTERN void __kmpc_taskloop(kmp_Ident *loc, uint32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000485 kmp_TaskDescr *newKmpTaskDescr, int if_val,
486 uint64_t *lb, uint64_t *ub, int64_t st, int nogroup,
487 int32_t sched, uint64_t grainsize, void *task_dup);
488
489// cancel
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000490EXTERN int32_t __kmpc_cancellationpoint(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000491 int32_t cancelVal);
Gheorghe-Teodor Berceaad8632a2018-11-27 19:45:10 +0000492EXTERN int32_t __kmpc_cancel(kmp_Ident *loc, int32_t global_tid,
George Rokos0dd6ed72018-01-29 13:59:35 +0000493 int32_t cancelVal);
494
495// non standard
496EXTERN void __kmpc_kernel_init_params(void *ReductionScratchpadPtr);
497EXTERN void __kmpc_kernel_init(int ThreadLimit, int16_t RequiresOMPRuntime);
498EXTERN void __kmpc_kernel_deinit(int16_t IsOMPRuntimeInitialized);
499EXTERN void __kmpc_spmd_kernel_init(int ThreadLimit, int16_t RequiresOMPRuntime,
500 int16_t RequiresDataSharing);
Gheorghe-Teodor Bercea31c15892018-11-27 21:23:40 +0000501EXTERN __attribute__((deprecated)) void __kmpc_spmd_kernel_deinit();
502EXTERN void __kmpc_spmd_kernel_deinit_v2(int16_t RequiresOMPRuntime);
George Rokos0dd6ed72018-01-29 13:59:35 +0000503EXTERN void __kmpc_kernel_prepare_parallel(void *WorkFn,
504 int16_t IsOMPRuntimeInitialized);
Gheorghe-Teodor Bercea7a5fa212018-03-07 22:10:10 +0000505EXTERN bool __kmpc_kernel_parallel(void **WorkFn,
George Rokos0dd6ed72018-01-29 13:59:35 +0000506 int16_t IsOMPRuntimeInitialized);
507EXTERN void __kmpc_kernel_end_parallel();
508EXTERN bool __kmpc_kernel_convergent_parallel(void *buffer, uint32_t Mask,
509 bool *IsFinal,
510 int32_t *LaneSource);
511EXTERN void __kmpc_kernel_end_convergent_parallel(void *buffer);
512EXTERN bool __kmpc_kernel_convergent_simd(void *buffer, uint32_t Mask,
513 bool *IsFinal, int32_t *LaneSource,
514 int32_t *LaneId, int32_t *NumLanes);
515EXTERN void __kmpc_kernel_end_convergent_simd(void *buffer);
516
Gheorghe-Teodor Bercea49b62642018-03-13 19:44:53 +0000517
518EXTERN void __kmpc_data_sharing_init_stack();
Gheorghe-Teodor Bercea9e943262018-07-13 16:14:22 +0000519EXTERN void __kmpc_data_sharing_init_stack_spmd();
Gheorghe-Teodor Berceab10bacf2018-11-01 18:08:12 +0000520EXTERN void *__kmpc_data_sharing_coalesced_push_stack(size_t size,
521 int16_t UseSharedMemory);
Gheorghe-Teodor Bercea49b62642018-03-13 19:44:53 +0000522EXTERN void *__kmpc_data_sharing_push_stack(size_t size, int16_t UseSharedMemory);
523EXTERN void __kmpc_data_sharing_pop_stack(void *a);
524EXTERN void __kmpc_begin_sharing_variables(void ***GlobalArgs, size_t nArgs);
525EXTERN void __kmpc_end_sharing_variables();
526EXTERN void __kmpc_get_shared_variables(void ***GlobalArgs);
527
George Rokos0dd6ed72018-01-29 13:59:35 +0000528// The slot used for data sharing by the master and worker threads. We use a
529// complete (default size version and an incomplete one so that we allow sizes
530// greater than the default).
531struct __kmpc_data_sharing_slot {
532 __kmpc_data_sharing_slot *Next;
Gheorghe-Teodor Bercea49b62642018-03-13 19:44:53 +0000533 __kmpc_data_sharing_slot *Prev;
Gheorghe-Teodor Berceaf3de2222018-03-15 15:56:04 +0000534 void *PrevSlotStackPtr;
George Rokos0dd6ed72018-01-29 13:59:35 +0000535 void *DataEnd;
536 char Data[];
537};
538EXTERN void
539__kmpc_initialize_data_sharing_environment(__kmpc_data_sharing_slot *RootS,
540 size_t InitialDataSize);
541EXTERN void *__kmpc_data_sharing_environment_begin(
542 __kmpc_data_sharing_slot **SavedSharedSlot, void **SavedSharedStack,
543 void **SavedSharedFrame, int32_t *SavedActiveThreads,
544 size_t SharingDataSize, size_t SharingDefaultDataSize,
545 int16_t IsOMPRuntimeInitialized);
546EXTERN void __kmpc_data_sharing_environment_end(
547 __kmpc_data_sharing_slot **SavedSharedSlot, void **SavedSharedStack,
548 void **SavedSharedFrame, int32_t *SavedActiveThreads, int32_t IsEntryPoint);
549
550EXTERN void *
551__kmpc_get_data_sharing_environment_frame(int32_t SourceThreadID,
552 int16_t IsOMPRuntimeInitialized);
Gheorghe-Teodor Bercea787a3502018-05-15 15:16:43 +0000553
554// SPMD execution mode interrogation function.
555EXTERN int8_t __kmpc_is_spmd_exec_mode();
Alexey Bataev463e9f32018-11-02 14:43:23 +0000556
Alexey Bataevdcf2edc2019-01-04 17:09:12 +0000557EXTERN void __kmpc_get_team_static_memory(int16_t isSPMDExecutionMode,
558 const void *buf, size_t size,
Alexey Bataev463e9f32018-11-02 14:43:23 +0000559 int16_t is_shared, const void **res);
560
Alexey Bataevdcf2edc2019-01-04 17:09:12 +0000561EXTERN void __kmpc_restore_team_static_memory(int16_t isSPMDExecutionMode,
562 int16_t is_shared);
Alexey Bataev463e9f32018-11-02 14:43:23 +0000563
George Rokos0dd6ed72018-01-29 13:59:35 +0000564#endif