blob: bf36a5a3e6a5e081e16fadfcd950e140603e4ed8 [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
163// parallel defs
164typedef void kmp_Indent;
165typedef void (*kmp_ParFctPtr)(int32_t *global_tid, int32_t *bound_tid, ...);
166typedef void (*kmp_ReductFctPtr)(void *lhsData, void *rhsData);
167typedef void (*kmp_InterWarpCopyFctPtr)(void *src, int32_t warp_num);
168typedef void (*kmp_ShuffleReductFctPtr)(void *rhsData, int16_t lane_id,
169 int16_t lane_offset,
170 int16_t shortCircuit);
171typedef void (*kmp_CopyToScratchpadFctPtr)(void *reduceData, void *scratchpad,
172 int32_t index, int32_t width);
173typedef void (*kmp_LoadReduceFctPtr)(void *reduceData, void *scratchpad,
174 int32_t index, int32_t width,
175 int32_t reduce);
176
177// task defs
178typedef struct kmp_TaskDescr kmp_TaskDescr;
179typedef int32_t (*kmp_TaskFctPtr)(int32_t global_tid, kmp_TaskDescr *taskDescr);
180typedef struct kmp_TaskDescr {
181 void *sharedPointerTable; // ptr to a table of shared var ptrs
182 kmp_TaskFctPtr sub; // task subroutine
183 int32_t partId; // unused
184 kmp_TaskFctPtr destructors; // destructor of c++ first private
185} kmp_TaskDescr;
186// task dep defs
187#define KMP_TASKDEP_IN 0x1u
188#define KMP_TASKDEP_OUT 0x2u
189typedef struct kmp_TaskDep_Public {
190 void *addr;
191 size_t len;
192 uint8_t flags; // bit 0: in, bit 1: out
193} kmp_TaskDep_Public;
194
195// flags that interpret the interface part of tasking flags
196#define KMP_TASK_IS_TIED 0x1
197#define KMP_TASK_FINAL 0x2
198#define KMP_TASK_MERGED_IF0 0x4 /* unused */
199#define KMP_TASK_DESTRUCTOR_THUNK 0x8
200
201// flags for task setup return
202#define KMP_CURRENT_TASK_NOT_SUSPENDED 0
203#define KMP_CURRENT_TASK_SUSPENDED 1
204
205// sync defs
206typedef int32_t kmp_CriticalName[8];
207
208////////////////////////////////////////////////////////////////////////////////
209// flags for kstate (all bits initially off)
210////////////////////////////////////////////////////////////////////////////////
211
212// first 2 bits used by kmp_Reduction (defined in kmp_reduction.cpp)
213#define KMP_REDUCTION_MASK 0x3
214#define KMP_SKIP_NEXT_CALL 0x4
215#define KMP_SKIP_NEXT_CANCEL_BARRIER 0x8
216
217////////////////////////////////////////////////////////////////////////////////
218// data
219////////////////////////////////////////////////////////////////////////////////
220
221////////////////////////////////////////////////////////////////////////////////
222// external interface
223////////////////////////////////////////////////////////////////////////////////
224
225// query
226EXTERN int32_t __kmpc_global_num_threads(kmp_Indent *loc); // missing
227EXTERN int32_t __kmpc_bound_thread_num(kmp_Indent *loc); // missing
228EXTERN int32_t __kmpc_bound_num_threads(kmp_Indent *loc); // missing
229EXTERN int32_t __kmpc_in_parallel(kmp_Indent *loc); // missing
230
231// parallel
232EXTERN int32_t __kmpc_global_thread_num(kmp_Indent *loc);
233EXTERN void __kmpc_push_num_threads(kmp_Indent *loc, int32_t global_tid,
234 int32_t num_threads);
235// simd
236EXTERN void __kmpc_push_simd_limit(kmp_Indent *loc, int32_t global_tid,
237 int32_t simd_limit);
238// aee ... not supported
239// EXTERN void __kmpc_fork_call(kmp_Indent *loc, int32_t argc, kmp_ParFctPtr
240// microtask, ...);
241EXTERN void __kmpc_serialized_parallel(kmp_Indent *loc, uint32_t global_tid);
242EXTERN void __kmpc_end_serialized_parallel(kmp_Indent *loc,
243 uint32_t global_tid);
244EXTERN uint16_t __kmpc_parallel_level(kmp_Indent *loc, uint32_t global_tid);
245
246// proc bind
247EXTERN void __kmpc_push_proc_bind(kmp_Indent *loc, uint32_t global_tid,
248 int proc_bind);
249EXTERN int omp_get_num_places(void);
250EXTERN int omp_get_place_num_procs(int place_num);
251EXTERN void omp_get_place_proc_ids(int place_num, int *ids);
252EXTERN int omp_get_place_num(void);
253EXTERN int omp_get_partition_num_places(void);
254EXTERN void omp_get_partition_place_nums(int *place_nums);
255
256// for static (no chunk or chunk)
257EXTERN void __kmpc_for_static_init_4(kmp_Indent *loc, int32_t global_tid,
258 int32_t sched, int32_t *plastiter,
259 int32_t *plower, int32_t *pupper,
260 int32_t *pstride, int32_t incr,
261 int32_t chunk);
262EXTERN void __kmpc_for_static_init_4u(kmp_Indent *loc, int32_t global_tid,
263 int32_t sched, int32_t *plastiter,
264 uint32_t *plower, uint32_t *pupper,
265 int32_t *pstride, int32_t incr,
266 int32_t chunk);
267EXTERN void __kmpc_for_static_init_8(kmp_Indent *loc, int32_t global_tid,
268 int32_t sched, int32_t *plastiter,
269 int64_t *plower, int64_t *pupper,
270 int64_t *pstride, int64_t incr,
271 int64_t chunk);
272EXTERN void __kmpc_for_static_init_8u(kmp_Indent *loc, int32_t global_tid,
273 int32_t sched, int32_t *plastiter1,
274 uint64_t *plower, uint64_t *pupper,
275 int64_t *pstride, int64_t incr,
276 int64_t chunk);
277EXTERN
278void __kmpc_for_static_init_4_simple_spmd(kmp_Indent *loc, int32_t global_tid,
279 int32_t sched, int32_t *plastiter,
280 int32_t *plower, int32_t *pupper,
281 int32_t *pstride, int32_t incr,
282 int32_t chunk);
283EXTERN
284void __kmpc_for_static_init_4u_simple_spmd(kmp_Indent *loc, int32_t global_tid,
285 int32_t sched, int32_t *plastiter,
286 uint32_t *plower, uint32_t *pupper,
287 int32_t *pstride, int32_t incr,
288 int32_t chunk);
289EXTERN
290void __kmpc_for_static_init_8_simple_spmd(kmp_Indent *loc, int32_t global_tid,
291 int32_t sched, int32_t *plastiter,
292 int64_t *plower, int64_t *pupper,
293 int64_t *pstride, int64_t incr,
294 int64_t chunk);
295EXTERN
296void __kmpc_for_static_init_8u_simple_spmd(kmp_Indent *loc, int32_t global_tid,
297 int32_t sched, int32_t *plastiter1,
298 uint64_t *plower, uint64_t *pupper,
299 int64_t *pstride, int64_t incr,
300 int64_t chunk);
301EXTERN
302void __kmpc_for_static_init_4_simple_generic(kmp_Indent *loc,
303 int32_t global_tid, int32_t sched,
304 int32_t *plastiter,
305 int32_t *plower, int32_t *pupper,
306 int32_t *pstride, int32_t incr,
307 int32_t chunk);
308EXTERN
309void __kmpc_for_static_init_4u_simple_generic(
310 kmp_Indent *loc, int32_t global_tid, int32_t sched, int32_t *plastiter,
311 uint32_t *plower, uint32_t *pupper, int32_t *pstride, int32_t incr,
312 int32_t chunk);
313EXTERN
314void __kmpc_for_static_init_8_simple_generic(kmp_Indent *loc,
315 int32_t global_tid, int32_t sched,
316 int32_t *plastiter,
317 int64_t *plower, int64_t *pupper,
318 int64_t *pstride, int64_t incr,
319 int64_t chunk);
320EXTERN
321void __kmpc_for_static_init_8u_simple_generic(
322 kmp_Indent *loc, int32_t global_tid, int32_t sched, int32_t *plastiter1,
323 uint64_t *plower, uint64_t *pupper, int64_t *pstride, int64_t incr,
324 int64_t chunk);
325
326EXTERN void __kmpc_for_static_fini(kmp_Indent *loc, int32_t global_tid);
327
328// for dynamic
329EXTERN void __kmpc_dispatch_init_4(kmp_Indent *loc, int32_t global_tid,
330 int32_t sched, int32_t lower, int32_t upper,
331 int32_t incr, int32_t chunk);
332EXTERN void __kmpc_dispatch_init_4u(kmp_Indent *loc, int32_t global_tid,
333 int32_t sched, uint32_t lower,
334 uint32_t upper, int32_t incr,
335 int32_t chunk);
336EXTERN void __kmpc_dispatch_init_8(kmp_Indent *loc, int32_t global_tid,
337 int32_t sched, int64_t lower, int64_t upper,
338 int64_t incr, int64_t chunk);
339EXTERN void __kmpc_dispatch_init_8u(kmp_Indent *loc, int32_t global_tid,
340 int32_t sched, uint64_t lower,
341 uint64_t upper, int64_t incr,
342 int64_t chunk);
343
344EXTERN int __kmpc_dispatch_next_4(kmp_Indent *loc, int32_t global_tid,
345 int32_t *plastiter, int32_t *plower,
346 int32_t *pupper, int32_t *pstride);
347EXTERN int __kmpc_dispatch_next_4u(kmp_Indent *loc, int32_t global_tid,
348 int32_t *plastiter, uint32_t *plower,
349 uint32_t *pupper, int32_t *pstride);
350EXTERN int __kmpc_dispatch_next_8(kmp_Indent *loc, int32_t global_tid,
351 int32_t *plastiter, int64_t *plower,
352 int64_t *pupper, int64_t *pstride);
353EXTERN int __kmpc_dispatch_next_8u(kmp_Indent *loc, int32_t global_tid,
354 int32_t *plastiter, uint64_t *plower,
355 uint64_t *pupper, int64_t *pstride);
356
357EXTERN void __kmpc_dispatch_fini_4(kmp_Indent *loc, int32_t global_tid);
358EXTERN void __kmpc_dispatch_fini_4u(kmp_Indent *loc, int32_t global_tid);
359EXTERN void __kmpc_dispatch_fini_8(kmp_Indent *loc, int32_t global_tid);
360EXTERN void __kmpc_dispatch_fini_8u(kmp_Indent *loc, int32_t global_tid);
361
362// Support for reducing conditional lastprivate variables
363EXTERN void __kmpc_reduce_conditional_lastprivate(kmp_Indent *loc,
364 int32_t global_tid,
365 int32_t varNum, void *array);
366
367// reduction
368EXTERN void __kmpc_nvptx_end_reduce(int32_t global_tid);
369EXTERN void __kmpc_nvptx_end_reduce_nowait(int32_t global_tid);
370EXTERN int32_t __kmpc_nvptx_parallel_reduce_nowait(
371 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
372 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
373EXTERN int32_t __kmpc_nvptx_parallel_reduce_nowait_simple_spmd(
374 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
375 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
376EXTERN int32_t __kmpc_nvptx_parallel_reduce_nowait_simple_generic(
377 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
378 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
379EXTERN int32_t __kmpc_nvptx_simd_reduce_nowait(
380 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
381 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct);
382EXTERN int32_t __kmpc_nvptx_teams_reduce_nowait(
383 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
384 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct,
385 kmp_CopyToScratchpadFctPtr sratchFct, kmp_LoadReduceFctPtr ldFct);
386EXTERN int32_t __kmpc_nvptx_teams_reduce_nowait_simple_spmd(
387 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
388 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct,
389 kmp_CopyToScratchpadFctPtr sratchFct, kmp_LoadReduceFctPtr ldFct);
390EXTERN int32_t __kmpc_nvptx_teams_reduce_nowait_simple_generic(
391 int32_t global_tid, int32_t num_vars, size_t reduce_size, void *reduce_data,
392 kmp_ShuffleReductFctPtr shflFct, kmp_InterWarpCopyFctPtr cpyFct,
393 kmp_CopyToScratchpadFctPtr sratchFct, kmp_LoadReduceFctPtr ldFct);
394EXTERN int32_t __kmpc_shuffle_int32(int32_t val, int16_t delta, int16_t size);
395EXTERN int64_t __kmpc_shuffle_int64(int64_t val, int16_t delta, int16_t size);
396
397// sync barrier
398EXTERN void __kmpc_barrier(kmp_Indent *loc_ref, int32_t tid);
399EXTERN void __kmpc_barrier_simple_spmd(kmp_Indent *loc_ref, int32_t tid);
400EXTERN void __kmpc_barrier_simple_generic(kmp_Indent *loc_ref, int32_t tid);
401EXTERN int32_t __kmpc_cancel_barrier(kmp_Indent *loc, int32_t global_tid);
402
403// single
404EXTERN int32_t __kmpc_single(kmp_Indent *loc, int32_t global_tid);
405EXTERN void __kmpc_end_single(kmp_Indent *loc, int32_t global_tid);
406
407// sync
408EXTERN int32_t __kmpc_master(kmp_Indent *loc, int32_t global_tid);
409EXTERN void __kmpc_end_master(kmp_Indent *loc, int32_t global_tid);
410EXTERN void __kmpc_ordered(kmp_Indent *loc, int32_t global_tid);
411EXTERN void __kmpc_end_ordered(kmp_Indent *loc, int32_t global_tid);
412EXTERN void __kmpc_critical(kmp_Indent *loc, int32_t global_tid,
413 kmp_CriticalName *crit);
414EXTERN void __kmpc_end_critical(kmp_Indent *loc, int32_t global_tid,
415 kmp_CriticalName *crit);
416EXTERN void __kmpc_flush(kmp_Indent *loc);
417
418// vote
419EXTERN int32_t __kmpc_warp_active_thread_mask();
420
421// tasks
422EXTERN kmp_TaskDescr *__kmpc_omp_task_alloc(kmp_Indent *loc,
423 uint32_t global_tid, int32_t flag,
424 size_t sizeOfTaskInclPrivate,
425 size_t sizeOfSharedTable,
426 kmp_TaskFctPtr sub);
427EXTERN int32_t __kmpc_omp_task(kmp_Indent *loc, uint32_t global_tid,
428 kmp_TaskDescr *newLegacyTaskDescr);
429EXTERN int32_t __kmpc_omp_task_with_deps(kmp_Indent *loc, uint32_t global_tid,
430 kmp_TaskDescr *newLegacyTaskDescr,
431 int32_t depNum, void *depList,
432 int32_t noAliasDepNum,
433 void *noAliasDepList);
434EXTERN void __kmpc_omp_task_begin_if0(kmp_Indent *loc, uint32_t global_tid,
435 kmp_TaskDescr *newLegacyTaskDescr);
436EXTERN void __kmpc_omp_task_complete_if0(kmp_Indent *loc, uint32_t global_tid,
437 kmp_TaskDescr *newLegacyTaskDescr);
438EXTERN void __kmpc_omp_wait_deps(kmp_Indent *loc, uint32_t global_tid,
439 int32_t depNum, void *depList,
440 int32_t noAliasDepNum, void *noAliasDepList);
441EXTERN void __kmpc_taskgroup(kmp_Indent *loc, uint32_t global_tid);
442EXTERN void __kmpc_end_taskgroup(kmp_Indent *loc, uint32_t global_tid);
443EXTERN int32_t __kmpc_omp_taskyield(kmp_Indent *loc, uint32_t global_tid,
444 int end_part);
445EXTERN int32_t __kmpc_omp_taskwait(kmp_Indent *loc, uint32_t global_tid);
446EXTERN void __kmpc_taskloop(kmp_Indent *loc, uint32_t global_tid,
447 kmp_TaskDescr *newKmpTaskDescr, int if_val,
448 uint64_t *lb, uint64_t *ub, int64_t st, int nogroup,
449 int32_t sched, uint64_t grainsize, void *task_dup);
450
451// cancel
452EXTERN int32_t __kmpc_cancellationpoint(kmp_Indent *loc, int32_t global_tid,
453 int32_t cancelVal);
454EXTERN int32_t __kmpc_cancel(kmp_Indent *loc, int32_t global_tid,
455 int32_t cancelVal);
456
457// non standard
458EXTERN void __kmpc_kernel_init_params(void *ReductionScratchpadPtr);
459EXTERN void __kmpc_kernel_init(int ThreadLimit, int16_t RequiresOMPRuntime);
460EXTERN void __kmpc_kernel_deinit(int16_t IsOMPRuntimeInitialized);
461EXTERN void __kmpc_spmd_kernel_init(int ThreadLimit, int16_t RequiresOMPRuntime,
462 int16_t RequiresDataSharing);
463EXTERN void __kmpc_spmd_kernel_deinit();
464EXTERN void __kmpc_kernel_prepare_parallel(void *WorkFn,
465 int16_t IsOMPRuntimeInitialized);
Gheorghe-Teodor Bercea7a5fa212018-03-07 22:10:10 +0000466EXTERN bool __kmpc_kernel_parallel(void **WorkFn,
George Rokos0dd6ed72018-01-29 13:59:35 +0000467 int16_t IsOMPRuntimeInitialized);
468EXTERN void __kmpc_kernel_end_parallel();
469EXTERN bool __kmpc_kernel_convergent_parallel(void *buffer, uint32_t Mask,
470 bool *IsFinal,
471 int32_t *LaneSource);
472EXTERN void __kmpc_kernel_end_convergent_parallel(void *buffer);
473EXTERN bool __kmpc_kernel_convergent_simd(void *buffer, uint32_t Mask,
474 bool *IsFinal, int32_t *LaneSource,
475 int32_t *LaneId, int32_t *NumLanes);
476EXTERN void __kmpc_kernel_end_convergent_simd(void *buffer);
477
Gheorghe-Teodor Bercea49b62642018-03-13 19:44:53 +0000478
479EXTERN void __kmpc_data_sharing_init_stack();
Gheorghe-Teodor Bercea9e943262018-07-13 16:14:22 +0000480EXTERN void __kmpc_data_sharing_init_stack_spmd();
Gheorghe-Teodor Berceab10bacf2018-11-01 18:08:12 +0000481EXTERN void *__kmpc_data_sharing_coalesced_push_stack(size_t size,
482 int16_t UseSharedMemory);
Gheorghe-Teodor Bercea49b62642018-03-13 19:44:53 +0000483EXTERN void *__kmpc_data_sharing_push_stack(size_t size, int16_t UseSharedMemory);
484EXTERN void __kmpc_data_sharing_pop_stack(void *a);
485EXTERN void __kmpc_begin_sharing_variables(void ***GlobalArgs, size_t nArgs);
486EXTERN void __kmpc_end_sharing_variables();
487EXTERN void __kmpc_get_shared_variables(void ***GlobalArgs);
488
George Rokos0dd6ed72018-01-29 13:59:35 +0000489// The slot used for data sharing by the master and worker threads. We use a
490// complete (default size version and an incomplete one so that we allow sizes
491// greater than the default).
492struct __kmpc_data_sharing_slot {
493 __kmpc_data_sharing_slot *Next;
Gheorghe-Teodor Bercea49b62642018-03-13 19:44:53 +0000494 __kmpc_data_sharing_slot *Prev;
Gheorghe-Teodor Berceaf3de2222018-03-15 15:56:04 +0000495 void *PrevSlotStackPtr;
George Rokos0dd6ed72018-01-29 13:59:35 +0000496 void *DataEnd;
497 char Data[];
498};
499EXTERN void
500__kmpc_initialize_data_sharing_environment(__kmpc_data_sharing_slot *RootS,
501 size_t InitialDataSize);
502EXTERN void *__kmpc_data_sharing_environment_begin(
503 __kmpc_data_sharing_slot **SavedSharedSlot, void **SavedSharedStack,
504 void **SavedSharedFrame, int32_t *SavedActiveThreads,
505 size_t SharingDataSize, size_t SharingDefaultDataSize,
506 int16_t IsOMPRuntimeInitialized);
507EXTERN void __kmpc_data_sharing_environment_end(
508 __kmpc_data_sharing_slot **SavedSharedSlot, void **SavedSharedStack,
509 void **SavedSharedFrame, int32_t *SavedActiveThreads, int32_t IsEntryPoint);
510
511EXTERN void *
512__kmpc_get_data_sharing_environment_frame(int32_t SourceThreadID,
513 int16_t IsOMPRuntimeInitialized);
Gheorghe-Teodor Bercea787a3502018-05-15 15:16:43 +0000514
515// SPMD execution mode interrogation function.
516EXTERN int8_t __kmpc_is_spmd_exec_mode();
George Rokos0dd6ed72018-01-29 13:59:35 +0000517#endif