LLVM OpenMP 19.0.0git
kmp_ftn_entry.h
Go to the documentation of this file.
1/*
2 * kmp_ftn_entry.h -- Fortran entry linkage support for OpenMP.
3 */
4
5//===----------------------------------------------------------------------===//
6//
7// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8// See https://llvm.org/LICENSE.txt for license information.
9// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef FTN_STDCALL
14#error The support file kmp_ftn_entry.h should not be compiled by itself.
15#endif
16
17#ifdef KMP_STUB
18#include "kmp_stub.h"
19#endif
20
21#include "kmp_i18n.h"
22
23// For affinity format functions
24#include "kmp_io.h"
25#include "kmp_str.h"
26
27#if OMPT_SUPPORT
28#include "ompt-specific.h"
29#endif
30
31#ifdef __cplusplus
32extern "C" {
33#endif // __cplusplus
34
35/* For compatibility with the Gnu/MS Open MP codegen, omp_set_num_threads(),
36 * omp_set_nested(), and omp_set_dynamic() [in lowercase on MS, and w/o
37 * a trailing underscore on Linux* OS] take call by value integer arguments.
38 * + omp_set_max_active_levels()
39 * + omp_set_schedule()
40 *
41 * For backward compatibility with 9.1 and previous Intel compiler, these
42 * entry points take call by reference integer arguments. */
43#ifdef KMP_GOMP_COMPAT
44#if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_UPPER)
45#define PASS_ARGS_BY_VALUE 1
46#endif
47#endif
48#if KMP_OS_WINDOWS
49#if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_APPEND)
50#define PASS_ARGS_BY_VALUE 1
51#endif
52#endif
53
54// This macro helps to reduce code duplication.
55#ifdef PASS_ARGS_BY_VALUE
56#define KMP_DEREF
57#else
58#define KMP_DEREF *
59#endif
60
61// For API with specific C vs. Fortran interfaces (ompc_* exists in
62// kmp_csupport.cpp), only create GOMP versioned symbols of the API for the
63// APPEND Fortran entries in this file. The GOMP versioned symbols of the C API
64// will take place where the ompc_* functions are defined.
65#if KMP_FTN_ENTRIES == KMP_FTN_APPEND
66#define KMP_EXPAND_NAME_IF_APPEND(name) KMP_EXPAND_NAME(name)
67#else
68#define KMP_EXPAND_NAME_IF_APPEND(name) name
69#endif
70
71void FTN_STDCALL FTN_SET_STACKSIZE(int KMP_DEREF arg) {
72#ifdef KMP_STUB
74#else
75 // __kmp_aux_set_stacksize initializes the library if needed
77#endif
78}
79
80void FTN_STDCALL FTN_SET_STACKSIZE_S(size_t KMP_DEREF arg) {
81#ifdef KMP_STUB
83#else
84 // __kmp_aux_set_stacksize initializes the library if needed
86#endif
87}
88
89int FTN_STDCALL FTN_GET_STACKSIZE(void) {
90#ifdef KMP_STUB
91 return (int)__kmps_get_stacksize();
92#else
93 if (!__kmp_init_serial) {
95 }
96 return (int)__kmp_stksize;
97#endif
98}
99
100size_t FTN_STDCALL FTN_GET_STACKSIZE_S(void) {
101#ifdef KMP_STUB
102 return __kmps_get_stacksize();
103#else
104 if (!__kmp_init_serial) {
106 }
107 return __kmp_stksize;
108#endif
109}
110
111void FTN_STDCALL FTN_SET_BLOCKTIME(int KMP_DEREF arg) {
112#ifdef KMP_STUB
114#else
115 int gtid, tid, bt = (KMP_DEREF arg);
116 kmp_info_t *thread;
117
118 gtid = __kmp_entry_gtid();
119 tid = __kmp_tid_from_gtid(gtid);
120 thread = __kmp_thread_from_gtid(gtid);
121
123 __kmp_aux_set_blocktime(bt, thread, tid);
124#endif
125}
126
127// Gets blocktime in units used for KMP_BLOCKTIME, ms otherwise
128int FTN_STDCALL FTN_GET_BLOCKTIME(void) {
129#ifdef KMP_STUB
130 return __kmps_get_blocktime();
131#else
132 int gtid, tid;
133 kmp_team_p *team;
134
135 gtid = __kmp_entry_gtid();
136 tid = __kmp_tid_from_gtid(gtid);
137 team = __kmp_threads[gtid]->th.th_team;
138
139 /* These must match the settings used in __kmp_wait_sleep() */
141 KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d%cs\n", gtid,
142 team->t.t_id, tid, KMP_MAX_BLOCKTIME, __kmp_blocktime_units));
143 return KMP_MAX_BLOCKTIME;
144 }
145#ifdef KMP_ADJUST_BLOCKTIME
146 else if (__kmp_zero_bt && !get__bt_set(team, tid)) {
147 KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d%cs\n", gtid,
148 team->t.t_id, tid, 0, __kmp_blocktime_units));
149 return 0;
150 }
151#endif /* KMP_ADJUST_BLOCKTIME */
152 else {
153 int bt = get__blocktime(team, tid);
154 if (__kmp_blocktime_units == 'm')
155 bt = bt / 1000;
156 KF_TRACE(10, ("kmp_get_blocktime: T#%d(%d:%d), blocktime=%d%cs\n", gtid,
157 team->t.t_id, tid, bt, __kmp_blocktime_units));
158 return bt;
159 }
160#endif
161}
162
163void FTN_STDCALL FTN_SET_LIBRARY_SERIAL(void) {
164#ifdef KMP_STUB
166#else
167 // __kmp_user_set_library initializes the library if needed
169#endif
170}
171
172void FTN_STDCALL FTN_SET_LIBRARY_TURNAROUND(void) {
173#ifdef KMP_STUB
175#else
176 // __kmp_user_set_library initializes the library if needed
178#endif
179}
180
181void FTN_STDCALL FTN_SET_LIBRARY_THROUGHPUT(void) {
182#ifdef KMP_STUB
184#else
185 // __kmp_user_set_library initializes the library if needed
187#endif
188}
189
190void FTN_STDCALL FTN_SET_LIBRARY(int KMP_DEREF arg) {
191#ifdef KMP_STUB
193#else
194 enum library_type lib;
195 lib = (enum library_type)KMP_DEREF arg;
196 // __kmp_user_set_library initializes the library if needed
198#endif
199}
200
201int FTN_STDCALL FTN_GET_LIBRARY(void) {
202#ifdef KMP_STUB
203 return __kmps_get_library();
204#else
205 if (!__kmp_init_serial) {
207 }
208 return ((int)__kmp_library);
209#endif
210}
211
212void FTN_STDCALL FTN_SET_DISP_NUM_BUFFERS(int KMP_DEREF arg) {
213#ifdef KMP_STUB
214 ; // empty routine
215#else
216 // ignore after initialization because some teams have already
217 // allocated dispatch buffers
218 int num_buffers = KMP_DEREF arg;
219 if (__kmp_init_serial == FALSE && num_buffers >= KMP_MIN_DISP_NUM_BUFF &&
220 num_buffers <= KMP_MAX_DISP_NUM_BUFF) {
221 __kmp_dispatch_num_buffers = num_buffers;
222 }
223#endif
224}
225
226int FTN_STDCALL FTN_SET_AFFINITY(void **mask) {
227#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
228 return -1;
229#else
230 if (!TCR_4(__kmp_init_middle)) {
232 }
234 return __kmp_aux_set_affinity(mask);
235#endif
236}
237
238int FTN_STDCALL FTN_GET_AFFINITY(void **mask) {
239#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
240 return -1;
241#else
242 if (!TCR_4(__kmp_init_middle)) {
244 }
246 int gtid = __kmp_get_gtid();
247 if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
248 __kmp_affinity.flags.reset) {
250 }
251 return __kmp_aux_get_affinity(mask);
252#endif
253}
254
255int FTN_STDCALL FTN_GET_AFFINITY_MAX_PROC(void) {
256#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
257 return 0;
258#else
259 // We really only NEED serial initialization here.
260 if (!TCR_4(__kmp_init_middle)) {
262 }
264 return __kmp_aux_get_affinity_max_proc();
265#endif
266}
267
268void FTN_STDCALL FTN_CREATE_AFFINITY_MASK(void **mask) {
269#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
270 *mask = NULL;
271#else
272 // We really only NEED serial initialization here.
273 kmp_affin_mask_t *mask_internals;
274 if (!TCR_4(__kmp_init_middle)) {
276 }
278 mask_internals = __kmp_affinity_dispatch->allocate_mask();
279 KMP_CPU_ZERO(mask_internals);
280 *mask = mask_internals;
281#endif
282}
283
284void FTN_STDCALL FTN_DESTROY_AFFINITY_MASK(void **mask) {
285#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
286// Nothing
287#else
288 // We really only NEED serial initialization here.
289 kmp_affin_mask_t *mask_internals;
290 if (!TCR_4(__kmp_init_middle)) {
292 }
295 if (*mask == NULL) {
296 KMP_FATAL(AffinityInvalidMask, "kmp_destroy_affinity_mask");
297 }
298 }
299 mask_internals = (kmp_affin_mask_t *)(*mask);
300 __kmp_affinity_dispatch->deallocate_mask(mask_internals);
301 *mask = NULL;
302#endif
303}
304
305int FTN_STDCALL FTN_SET_AFFINITY_MASK_PROC(int KMP_DEREF proc, void **mask) {
306#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
307 return -1;
308#else
309 if (!TCR_4(__kmp_init_middle)) {
311 }
313 return __kmp_aux_set_affinity_mask_proc(KMP_DEREF proc, mask);
314#endif
315}
316
317int FTN_STDCALL FTN_UNSET_AFFINITY_MASK_PROC(int KMP_DEREF proc, void **mask) {
318#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
319 return -1;
320#else
321 if (!TCR_4(__kmp_init_middle)) {
323 }
325 return __kmp_aux_unset_affinity_mask_proc(KMP_DEREF proc, mask);
326#endif
327}
328
329int FTN_STDCALL FTN_GET_AFFINITY_MASK_PROC(int KMP_DEREF proc, void **mask) {
330#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
331 return -1;
332#else
333 if (!TCR_4(__kmp_init_middle)) {
335 }
337 return __kmp_aux_get_affinity_mask_proc(KMP_DEREF proc, mask);
338#endif
339}
340
341/* ------------------------------------------------------------------------ */
342
343/* sets the requested number of threads for the next parallel region */
345#ifdef KMP_STUB
346// Nothing.
347#else
349#endif
350}
351
352/* returns the number of threads in current team */
354#ifdef KMP_STUB
355 return 1;
356#else
357 // __kmpc_bound_num_threads initializes the library if needed
358 return __kmpc_bound_num_threads(NULL);
359#endif
360}
361
363#ifdef KMP_STUB
364 return 1;
365#else
366 int gtid;
367 kmp_info_t *thread;
368 if (!TCR_4(__kmp_init_middle)) {
370 }
371 gtid = __kmp_entry_gtid();
372 thread = __kmp_threads[gtid];
373#if KMP_AFFINITY_SUPPORTED
374 if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
376 }
377#endif
378 // return thread -> th.th_team -> t.t_current_task[
379 // thread->th.th_info.ds.ds_tid ] -> icvs.nproc;
380 return thread->th.th_current_task->td_icvs.nproc;
381#endif
382}
383
384int FTN_STDCALL FTN_CONTROL_TOOL(int command, int modifier, void *arg) {
385#if defined(KMP_STUB) || !OMPT_SUPPORT
386 return -2;
387#else
388 OMPT_STORE_RETURN_ADDRESS(__kmp_entry_gtid());
389 if (!TCR_4(__kmp_init_middle)) {
390 return -2;
391 }
393 ompt_task_info_t *parent_task_info = OMPT_CUR_TASK_INFO(this_thr);
394 parent_task_info->frame.enter_frame.ptr = OMPT_GET_FRAME_ADDRESS(0);
395 int ret = __kmp_control_tool(command, modifier, arg);
396 parent_task_info->frame.enter_frame.ptr = 0;
397 return ret;
398#endif
399}
400
401/* OpenMP 5.0 Memory Management support */
402omp_allocator_handle_t FTN_STDCALL
404 omp_alloctrait_t tr[]) {
405#ifdef KMP_STUB
406 return NULL;
407#else
409 KMP_DEREF ntraits, tr);
410#endif
411}
412
414#ifndef KMP_STUB
416#endif
417}
419#ifndef KMP_STUB
421#endif
422}
424#ifdef KMP_STUB
425 return NULL;
426#else
428#endif
429}
430
431/* OpenMP 5.0 affinity format support */
432#ifndef KMP_STUB
433static void __kmp_fortran_strncpy_truncate(char *buffer, size_t buf_size,
434 char const *csrc, size_t csrc_size) {
435 size_t capped_src_size = csrc_size;
436 if (csrc_size >= buf_size) {
437 capped_src_size = buf_size - 1;
438 }
439 KMP_STRNCPY_S(buffer, buf_size, csrc, capped_src_size);
440 if (csrc_size >= buf_size) {
441 KMP_DEBUG_ASSERT(buffer[buf_size - 1] == '\0');
442 buffer[buf_size - 1] = csrc[buf_size - 1];
443 } else {
444 for (size_t i = csrc_size; i < buf_size; ++i)
445 buffer[i] = ' ';
446 }
447}
448
449// Convert a Fortran string to a C string by adding null byte
451 char *buf;
452 kmp_info_t *th;
453
454public:
455 ConvertedString(char const *fortran_str, size_t size) {
456 th = __kmp_get_thread();
457 buf = (char *)__kmp_thread_malloc(th, size + 1);
458 KMP_STRNCPY_S(buf, size + 1, fortran_str, size);
459 buf[size] = '\0';
460 }
462 const char *get() const { return buf; }
463};
464#endif // KMP_STUB
465
466/*
467 * Set the value of the affinity-format-var ICV on the current device to the
468 * format specified in the argument.
469 */
471 char const *format, size_t size) {
472#ifdef KMP_STUB
473 return;
474#else
475 if (!__kmp_init_serial) {
477 }
478 ConvertedString cformat(format, size);
479 // Since the __kmp_affinity_format variable is a C string, do not
480 // use the fortran strncpy function
482 cformat.get(), KMP_STRLEN(cformat.get()));
483#endif
484}
485
486/*
487 * Returns the number of characters required to hold the entire affinity format
488 * specification (not including null byte character) and writes the value of the
489 * affinity-format-var ICV on the current device to buffer. If the return value
490 * is larger than size, the affinity format specification is truncated.
491 */
493 char *buffer, size_t size) {
494#ifdef KMP_STUB
495 return 0;
496#else
497 size_t format_size;
498 if (!__kmp_init_serial) {
500 }
501 format_size = KMP_STRLEN(__kmp_affinity_format);
502 if (buffer && size) {
504 format_size);
505 }
506 return format_size;
507#endif
508}
509
510/*
511 * Prints the thread affinity information of the current thread in the format
512 * specified by the format argument. If the format is NULL or a zero-length
513 * string, the value of the affinity-format-var ICV is used.
514 */
516 char const *format, size_t size) {
517#ifdef KMP_STUB
518 return;
519#else
520 int gtid;
521 if (!TCR_4(__kmp_init_middle)) {
523 }
525 gtid = __kmp_get_gtid();
526#if KMP_AFFINITY_SUPPORTED
527 if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
528 __kmp_affinity.flags.reset) {
530 }
531#endif
532 ConvertedString cformat(format, size);
533 __kmp_aux_display_affinity(gtid, cformat.get());
534#endif
535}
536
537/*
538 * Returns the number of characters required to hold the entire affinity format
539 * specification (not including null byte) and prints the thread affinity
540 * information of the current thread into the character string buffer with the
541 * size of size in the format specified by the format argument. If the format is
542 * NULL or a zero-length string, the value of the affinity-format-var ICV is
543 * used. The buffer must be allocated prior to calling the routine. If the
544 * return value is larger than size, the affinity format specification is
545 * truncated.
546 */
548 char *buffer, char const *format, size_t buf_size, size_t for_size) {
549#if defined(KMP_STUB)
550 return 0;
551#else
552 int gtid;
553 size_t num_required;
554 kmp_str_buf_t capture_buf;
555 if (!TCR_4(__kmp_init_middle)) {
557 }
559 gtid = __kmp_get_gtid();
560#if KMP_AFFINITY_SUPPORTED
561 if (__kmp_threads[gtid]->th.th_team->t.t_level == 0 &&
562 __kmp_affinity.flags.reset) {
564 }
565#endif
566 __kmp_str_buf_init(&capture_buf);
567 ConvertedString cformat(format, for_size);
568 num_required = __kmp_aux_capture_affinity(gtid, cformat.get(), &capture_buf);
569 if (buffer && buf_size) {
570 __kmp_fortran_strncpy_truncate(buffer, buf_size, capture_buf.str,
571 capture_buf.used);
572 }
573 __kmp_str_buf_free(&capture_buf);
574 return num_required;
575#endif
576}
577
579#ifdef KMP_STUB
580 return 0;
581#else
582 int gtid;
583
584#if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
585 KMP_OS_OPENBSD || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX
586 gtid = __kmp_entry_gtid();
587#elif KMP_OS_WINDOWS
588 if (!__kmp_init_parallel ||
589 (gtid = (int)((kmp_intptr_t)TlsGetValue(__kmp_gtid_threadprivate_key))) ==
590 0) {
591 // Either library isn't initialized or thread is not registered
592 // 0 is the correct TID in this case
593 return 0;
594 }
595 --gtid; // We keep (gtid+1) in TLS
596#elif KMP_OS_LINUX || KMP_OS_WASI
597#ifdef KMP_TDATA_GTID
598 if (__kmp_gtid_mode >= 3) {
599 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
600 return 0;
601 }
602 } else {
603#endif
604 if (!__kmp_init_parallel ||
605 (gtid = (int)((kmp_intptr_t)(
606 pthread_getspecific(__kmp_gtid_threadprivate_key)))) == 0) {
607 return 0;
608 }
609 --gtid;
610#ifdef KMP_TDATA_GTID
611 }
612#endif
613#else
614#error Unknown or unsupported OS
615#endif
616
617 return __kmp_tid_from_gtid(gtid);
618#endif
619}
620
621int FTN_STDCALL FTN_GET_NUM_KNOWN_THREADS(void) {
622#ifdef KMP_STUB
623 return 1;
624#else
625 if (!__kmp_init_serial) {
627 }
628 /* NOTE: this is not syncronized, so it can change at any moment */
629 /* NOTE: this number also includes threads preallocated in hot-teams */
630 return TCR_4(__kmp_nth);
631#endif
632}
633
635#ifdef KMP_STUB
636 return 1;
637#else
638 if (!TCR_4(__kmp_init_middle)) {
640 }
641#if KMP_AFFINITY_SUPPORTED
642 if (!__kmp_affinity.flags.reset) {
643 // only bind root here if its affinity reset is not requested
644 int gtid = __kmp_entry_gtid();
645 kmp_info_t *thread = __kmp_threads[gtid];
646 if (thread->th.th_team->t.t_level == 0) {
648 }
649 }
650#endif
651 return __kmp_avail_proc;
652#endif
653}
654
656#ifdef KMP_STUB
658#else
659 kmp_info_t *thread;
660 /* For the thread-private internal controls implementation */
661 thread = __kmp_entry_thread();
662 KMP_INFORM(APIDeprecated, "omp_set_nested", "omp_set_max_active_levels");
664 // Somewhat arbitrarily decide where to get a value for max_active_levels
665 int max_active_levels = get__max_active_levels(thread);
666 if (max_active_levels == 1)
667 max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
668 set__max_active_levels(thread, (KMP_DEREF flag) ? max_active_levels : 1);
669#endif
670}
671
673#ifdef KMP_STUB
674 return __kmps_get_nested();
675#else
676 kmp_info_t *thread;
677 thread = __kmp_entry_thread();
678 KMP_INFORM(APIDeprecated, "omp_get_nested", "omp_get_max_active_levels");
679 return get__max_active_levels(thread) > 1;
680#endif
681}
682
684#ifdef KMP_STUB
686#else
687 kmp_info_t *thread;
688 /* For the thread-private implementation of the internal controls */
689 thread = __kmp_entry_thread();
690 // !!! What if foreign thread calls it?
692 set__dynamic(thread, KMP_DEREF flag ? true : false);
693#endif
694}
695
697#ifdef KMP_STUB
698 return __kmps_get_dynamic();
699#else
700 kmp_info_t *thread;
701 thread = __kmp_entry_thread();
702 return get__dynamic(thread);
703#endif
704}
705
707#ifdef KMP_STUB
708 return 0;
709#else
711 if (th->th.th_teams_microtask) {
712 // AC: r_in_parallel does not work inside teams construct where real
713 // parallel is inactive, but all threads have same root, so setting it in
714 // one team affects other teams.
715 // The solution is to use per-team nesting level
716 return (th->th.th_team->t.t_active_level ? 1 : 0);
717 } else
718 return (th->th.th_root->r.r_in_parallel ? FTN_TRUE : FTN_FALSE);
719#endif
720}
721
723 int KMP_DEREF modifier) {
724#ifdef KMP_STUB
726#else
727 /* TO DO: For the per-task implementation of the internal controls */
729#endif
730}
731
733 int *modifier) {
734#ifdef KMP_STUB
735 __kmps_get_schedule(kind, modifier);
736#else
737 /* TO DO: For the per-task implementation of the internal controls */
738 __kmp_get_schedule(__kmp_entry_gtid(), kind, modifier);
739#endif
740}
741
743#ifdef KMP_STUB
744// Nothing.
745#else
746 /* TO DO: We want per-task implementation of this internal control */
748#endif
749}
750
752#ifdef KMP_STUB
753 return 0;
754#else
755 /* TO DO: We want per-task implementation of this internal control */
756 if (!TCR_4(__kmp_init_middle)) {
758 }
760#endif
761}
762
764#ifdef KMP_STUB
765 return 0; // returns 0 if it is called from the sequential part of the program
766#else
767 /* TO DO: For the per-task implementation of the internal controls */
768 return __kmp_entry_thread()->th.th_team->t.t_active_level;
769#endif
770}
771
773#ifdef KMP_STUB
774 return 0; // returns 0 if it is called from the sequential part of the program
775#else
776 /* TO DO: For the per-task implementation of the internal controls */
777 return __kmp_entry_thread()->th.th_team->t.t_level;
778#endif
779}
780
781int FTN_STDCALL
783#ifdef KMP_STUB
784 return (KMP_DEREF level) ? (-1) : (0);
785#else
787#endif
788}
789
791#ifdef KMP_STUB
792 return (KMP_DEREF level) ? (-1) : (1);
793#else
795#endif
796}
797
799#ifdef KMP_STUB
800 return 1; // TO DO: clarify whether it returns 1 or 0?
801#else
802 int gtid;
803 kmp_info_t *thread;
804 if (!__kmp_init_serial) {
806 }
807
808 gtid = __kmp_entry_gtid();
809 thread = __kmp_threads[gtid];
810 // If thread_limit for the target task is defined, return that instead of the
811 // regular task thread_limit
812 if (int thread_limit = thread->th.th_current_task->td_icvs.task_thread_limit)
813 return thread_limit;
814 return thread->th.th_current_task->td_icvs.thread_limit;
815#endif
816}
817
819#ifdef KMP_STUB
820 return 0; // TO DO: clarify whether it returns 1 or 0?
821#else
823 return 0;
824 }
825 return __kmp_entry_thread()->th.th_current_task->td_flags.final;
826#endif
827}
828
830#ifdef KMP_STUB
831 return __kmps_get_proc_bind();
832#else
834#endif
835}
836
838#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
839 return 0;
840#else
841 if (!TCR_4(__kmp_init_middle)) {
843 }
844 if (!KMP_AFFINITY_CAPABLE())
845 return 0;
846 if (!__kmp_affinity.flags.reset) {
847 // only bind root here if its affinity reset is not requested
848 int gtid = __kmp_entry_gtid();
849 kmp_info_t *thread = __kmp_threads[gtid];
850 if (thread->th.th_team->t.t_level == 0) {
852 }
853 }
854 return __kmp_affinity.num_masks;
855#endif
856}
857
858int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM_PROCS)(int place_num) {
859#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
860 return 0;
861#else
862 int i;
863 int retval = 0;
864 if (!TCR_4(__kmp_init_middle)) {
866 }
867 if (!KMP_AFFINITY_CAPABLE())
868 return 0;
869 if (!__kmp_affinity.flags.reset) {
870 // only bind root here if its affinity reset is not requested
871 int gtid = __kmp_entry_gtid();
872 kmp_info_t *thread = __kmp_threads[gtid];
873 if (thread->th.th_team->t.t_level == 0) {
875 }
876 }
877 if (place_num < 0 || place_num >= (int)__kmp_affinity.num_masks)
878 return 0;
879 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity.masks, place_num);
880 KMP_CPU_SET_ITERATE(i, mask) {
881 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
882 (!KMP_CPU_ISSET(i, mask))) {
883 continue;
884 }
885 ++retval;
886 }
887 return retval;
888#endif
889}
890
891void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_PROC_IDS)(int place_num,
892 int *ids) {
893#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
894// Nothing.
895#else
896 int i, j;
897 if (!TCR_4(__kmp_init_middle)) {
899 }
900 if (!KMP_AFFINITY_CAPABLE())
901 return;
902 if (!__kmp_affinity.flags.reset) {
903 // only bind root here if its affinity reset is not requested
904 int gtid = __kmp_entry_gtid();
905 kmp_info_t *thread = __kmp_threads[gtid];
906 if (thread->th.th_team->t.t_level == 0) {
908 }
909 }
910 if (place_num < 0 || place_num >= (int)__kmp_affinity.num_masks)
911 return;
912 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity.masks, place_num);
913 j = 0;
914 KMP_CPU_SET_ITERATE(i, mask) {
915 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
916 (!KMP_CPU_ISSET(i, mask))) {
917 continue;
918 }
919 ids[j++] = i;
920 }
921#endif
922}
923
925#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
926 return -1;
927#else
928 int gtid;
929 kmp_info_t *thread;
930 if (!TCR_4(__kmp_init_middle)) {
932 }
933 if (!KMP_AFFINITY_CAPABLE())
934 return -1;
935 gtid = __kmp_entry_gtid();
936 thread = __kmp_thread_from_gtid(gtid);
937 if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
939 }
940 if (thread->th.th_current_place < 0)
941 return -1;
942 return thread->th.th_current_place;
943#endif
944}
945
947#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
948 return 0;
949#else
950 int gtid, num_places, first_place, last_place;
951 kmp_info_t *thread;
952 if (!TCR_4(__kmp_init_middle)) {
954 }
955 if (!KMP_AFFINITY_CAPABLE())
956 return 0;
957 gtid = __kmp_entry_gtid();
958 thread = __kmp_thread_from_gtid(gtid);
959 if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
961 }
962 first_place = thread->th.th_first_place;
963 last_place = thread->th.th_last_place;
964 if (first_place < 0 || last_place < 0)
965 return 0;
966 if (first_place <= last_place)
967 num_places = last_place - first_place + 1;
968 else
969 num_places = __kmp_affinity.num_masks - first_place + last_place + 1;
970 return num_places;
971#endif
972}
973
974void FTN_STDCALL
976#if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
977// Nothing.
978#else
979 int i, gtid, place_num, first_place, last_place, start, end;
980 kmp_info_t *thread;
981 if (!TCR_4(__kmp_init_middle)) {
983 }
984 if (!KMP_AFFINITY_CAPABLE())
985 return;
986 gtid = __kmp_entry_gtid();
987 thread = __kmp_thread_from_gtid(gtid);
988 if (thread->th.th_team->t.t_level == 0 && !__kmp_affinity.flags.reset) {
990 }
991 first_place = thread->th.th_first_place;
992 last_place = thread->th.th_last_place;
993 if (first_place < 0 || last_place < 0)
994 return;
995 if (first_place <= last_place) {
996 start = first_place;
997 end = last_place;
998 } else {
999 start = last_place;
1000 end = first_place;
1001 }
1002 for (i = 0, place_num = start; place_num <= end; ++place_num, ++i) {
1003 place_nums[i] = place_num;
1004 }
1005#endif
1006}
1007
1009#ifdef KMP_STUB
1010 return 1;
1011#else
1012 return __kmp_aux_get_num_teams();
1013#endif
1014}
1015
1017#ifdef KMP_STUB
1018 return 0;
1019#else
1020 return __kmp_aux_get_team_num();
1021#endif
1022}
1023
1025#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
1026 return 0;
1027#else
1028 return __kmp_entry_thread()->th.th_current_task->td_icvs.default_device;
1029#endif
1030}
1031
1033#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
1034// Nothing.
1035#else
1036 __kmp_entry_thread()->th.th_current_task->td_icvs.default_device =
1037 KMP_DEREF arg;
1038#endif
1039}
1040
1041// Get number of NON-HOST devices.
1042// libomptarget, if loaded, provides this function in api.cpp.
1046#if KMP_MIC || KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1047 return 0;
1048#else
1049 int (*fptr)();
1050 if ((*(void **)(&fptr) = KMP_DLSYM("__tgt_get_num_devices"))) {
1051 return (*fptr)();
1052 } else if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_devices"))) {
1053 return (*fptr)();
1054 } else if ((*(void **)(&fptr) = KMP_DLSYM("_Offload_number_of_devices"))) {
1055 return (*fptr)();
1056 } else { // liboffload & libomptarget don't exist
1057 return 0;
1058 }
1059#endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB)
1060}
1061
1062// This function always returns true when called on host device.
1063// Compiler/libomptarget should handle when it is called inside target region.
1067 return 1; // This is the host
1068}
1069
1070// libomptarget, if loaded, provides this function
1074 // same as omp_get_num_devices()
1076}
1077
1078#if defined(KMP_STUB)
1079// Entries for stubs library
1080// As all *target* functions are C-only parameters always passed by value
1081void *FTN_STDCALL FTN_TARGET_ALLOC(size_t size, int device_num) { return 0; }
1082
1083void FTN_STDCALL FTN_TARGET_FREE(void *device_ptr, int device_num) {}
1084
1085int FTN_STDCALL FTN_TARGET_IS_PRESENT(void *ptr, int device_num) { return 0; }
1086
1087int FTN_STDCALL FTN_TARGET_MEMCPY(void *dst, void *src, size_t length,
1088 size_t dst_offset, size_t src_offset,
1089 int dst_device, int src_device) {
1090 return -1;
1091}
1092
1093int FTN_STDCALL FTN_TARGET_MEMCPY_RECT(
1094 void *dst, void *src, size_t element_size, int num_dims,
1095 const size_t *volume, const size_t *dst_offsets, const size_t *src_offsets,
1096 const size_t *dst_dimensions, const size_t *src_dimensions, int dst_device,
1097 int src_device) {
1098 return -1;
1099}
1100
1101int FTN_STDCALL FTN_TARGET_ASSOCIATE_PTR(void *host_ptr, void *device_ptr,
1102 size_t size, size_t device_offset,
1103 int device_num) {
1104 return -1;
1105}
1106
1107int FTN_STDCALL FTN_TARGET_DISASSOCIATE_PTR(void *host_ptr, int device_num) {
1108 return -1;
1109}
1110#endif // defined(KMP_STUB)
1111
1112#ifdef KMP_STUB
1113typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
1114#endif /* KMP_STUB */
1115
1116#if KMP_USE_DYNAMIC_LOCK
1117void FTN_STDCALL FTN_INIT_LOCK_WITH_HINT(void **user_lock,
1118 uintptr_t KMP_DEREF hint) {
1119#ifdef KMP_STUB
1120 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1121#else
1122 int gtid = __kmp_entry_gtid();
1123#if OMPT_SUPPORT && OMPT_OPTIONAL
1124 OMPT_STORE_RETURN_ADDRESS(gtid);
1125#endif
1126 __kmpc_init_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1127#endif
1128}
1129
1130void FTN_STDCALL FTN_INIT_NEST_LOCK_WITH_HINT(void **user_lock,
1131 uintptr_t KMP_DEREF hint) {
1132#ifdef KMP_STUB
1133 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1134#else
1135 int gtid = __kmp_entry_gtid();
1136#if OMPT_SUPPORT && OMPT_OPTIONAL
1137 OMPT_STORE_RETURN_ADDRESS(gtid);
1138#endif
1139 __kmpc_init_nest_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1140#endif
1141}
1142#endif
1143
1144/* initialize the lock */
1145void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_LOCK)(void **user_lock) {
1146#ifdef KMP_STUB
1147 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1148#else
1149 int gtid = __kmp_entry_gtid();
1150#if OMPT_SUPPORT && OMPT_OPTIONAL
1151 OMPT_STORE_RETURN_ADDRESS(gtid);
1152#endif
1153 __kmpc_init_lock(NULL, gtid, user_lock);
1154#endif
1155}
1156
1157/* initialize the lock */
1158void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_NEST_LOCK)(void **user_lock) {
1159#ifdef KMP_STUB
1160 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1161#else
1162 int gtid = __kmp_entry_gtid();
1163#if OMPT_SUPPORT && OMPT_OPTIONAL
1164 OMPT_STORE_RETURN_ADDRESS(gtid);
1165#endif
1166 __kmpc_init_nest_lock(NULL, gtid, user_lock);
1167#endif
1168}
1169
1170void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_LOCK)(void **user_lock) {
1171#ifdef KMP_STUB
1172 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1173#else
1174 int gtid = __kmp_entry_gtid();
1175#if OMPT_SUPPORT && OMPT_OPTIONAL
1176 OMPT_STORE_RETURN_ADDRESS(gtid);
1177#endif
1178 __kmpc_destroy_lock(NULL, gtid, user_lock);
1179#endif
1180}
1181
1182void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_NEST_LOCK)(void **user_lock) {
1183#ifdef KMP_STUB
1184 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1185#else
1186 int gtid = __kmp_entry_gtid();
1187#if OMPT_SUPPORT && OMPT_OPTIONAL
1188 OMPT_STORE_RETURN_ADDRESS(gtid);
1189#endif
1190 __kmpc_destroy_nest_lock(NULL, gtid, user_lock);
1191#endif
1192}
1193
1194void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_LOCK)(void **user_lock) {
1195#ifdef KMP_STUB
1196 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1197 // TODO: Issue an error.
1198 }
1199 if (*((kmp_stub_lock_t *)user_lock) != UNLOCKED) {
1200 // TODO: Issue an error.
1201 }
1202 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1203#else
1204 int gtid = __kmp_entry_gtid();
1205#if OMPT_SUPPORT && OMPT_OPTIONAL
1206 OMPT_STORE_RETURN_ADDRESS(gtid);
1207#endif
1208 __kmpc_set_lock(NULL, gtid, user_lock);
1209#endif
1210}
1211
1212void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NEST_LOCK)(void **user_lock) {
1213#ifdef KMP_STUB
1214 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1215 // TODO: Issue an error.
1216 }
1217 (*((int *)user_lock))++;
1218#else
1219 int gtid = __kmp_entry_gtid();
1220#if OMPT_SUPPORT && OMPT_OPTIONAL
1221 OMPT_STORE_RETURN_ADDRESS(gtid);
1222#endif
1223 __kmpc_set_nest_lock(NULL, gtid, user_lock);
1224#endif
1225}
1226
1227void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_LOCK)(void **user_lock) {
1228#ifdef KMP_STUB
1229 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1230 // TODO: Issue an error.
1231 }
1232 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1233 // TODO: Issue an error.
1234 }
1235 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1236#else
1237 int gtid = __kmp_entry_gtid();
1238#if OMPT_SUPPORT && OMPT_OPTIONAL
1239 OMPT_STORE_RETURN_ADDRESS(gtid);
1240#endif
1241 __kmpc_unset_lock(NULL, gtid, user_lock);
1242#endif
1243}
1244
1245void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_NEST_LOCK)(void **user_lock) {
1246#ifdef KMP_STUB
1247 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1248 // TODO: Issue an error.
1249 }
1250 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1251 // TODO: Issue an error.
1252 }
1253 (*((int *)user_lock))--;
1254#else
1255 int gtid = __kmp_entry_gtid();
1256#if OMPT_SUPPORT && OMPT_OPTIONAL
1257 OMPT_STORE_RETURN_ADDRESS(gtid);
1258#endif
1259 __kmpc_unset_nest_lock(NULL, gtid, user_lock);
1260#endif
1261}
1262
1263int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_LOCK)(void **user_lock) {
1264#ifdef KMP_STUB
1265 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1266 // TODO: Issue an error.
1267 }
1268 if (*((kmp_stub_lock_t *)user_lock) == LOCKED) {
1269 return 0;
1270 }
1271 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1272 return 1;
1273#else
1274 int gtid = __kmp_entry_gtid();
1275#if OMPT_SUPPORT && OMPT_OPTIONAL
1276 OMPT_STORE_RETURN_ADDRESS(gtid);
1277#endif
1278 return __kmpc_test_lock(NULL, gtid, user_lock);
1279#endif
1280}
1281
1282int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_NEST_LOCK)(void **user_lock) {
1283#ifdef KMP_STUB
1284 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1285 // TODO: Issue an error.
1286 }
1287 return ++(*((int *)user_lock));
1288#else
1289 int gtid = __kmp_entry_gtid();
1290#if OMPT_SUPPORT && OMPT_OPTIONAL
1291 OMPT_STORE_RETURN_ADDRESS(gtid);
1292#endif
1293 return __kmpc_test_nest_lock(NULL, gtid, user_lock);
1294#endif
1295}
1296
1297double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTIME)(void) {
1298#ifdef KMP_STUB
1299 return __kmps_get_wtime();
1300#else
1301 double data;
1302#if !KMP_OS_LINUX
1303 // We don't need library initialization to get the time on Linux* OS. The
1304 // routine can be used to measure library initialization time on Linux* OS now
1305 if (!__kmp_init_serial) {
1307 }
1308#endif
1310 return data;
1311#endif
1312}
1313
1314double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTICK)(void) {
1315#ifdef KMP_STUB
1316 return __kmps_get_wtick();
1317#else
1318 double data;
1319 if (!__kmp_init_serial) {
1321 }
1323 return data;
1324#endif
1325}
1326
1327/* ------------------------------------------------------------------------ */
1328
1329void *FTN_STDCALL FTN_MALLOC(size_t KMP_DEREF size) {
1330 // kmpc_malloc initializes the library if needed
1331 return kmpc_malloc(KMP_DEREF size);
1332}
1333
1334void *FTN_STDCALL FTN_ALIGNED_MALLOC(size_t KMP_DEREF size,
1335 size_t KMP_DEREF alignment) {
1336 // kmpc_aligned_malloc initializes the library if needed
1338}
1339
1340void *FTN_STDCALL FTN_CALLOC(size_t KMP_DEREF nelem, size_t KMP_DEREF elsize) {
1341 // kmpc_calloc initializes the library if needed
1342 return kmpc_calloc(KMP_DEREF nelem, KMP_DEREF elsize);
1343}
1344
1345void *FTN_STDCALL FTN_REALLOC(void *KMP_DEREF ptr, size_t KMP_DEREF size) {
1346 // kmpc_realloc initializes the library if needed
1347 return kmpc_realloc(KMP_DEREF ptr, KMP_DEREF size);
1348}
1349
1350void FTN_STDCALL FTN_KFREE(void *KMP_DEREF ptr) {
1351 // does nothing if the library is not initialized
1352 kmpc_free(KMP_DEREF ptr);
1353}
1354
1355void FTN_STDCALL FTN_SET_WARNINGS_ON(void) {
1356#ifndef KMP_STUB
1358#endif
1359}
1360
1361void FTN_STDCALL FTN_SET_WARNINGS_OFF(void) {
1362#ifndef KMP_STUB
1364#endif
1365}
1366
1367void FTN_STDCALL FTN_SET_DEFAULTS(char const *str
1368#ifndef PASS_ARGS_BY_VALUE
1369 ,
1370 int len
1371#endif
1372) {
1373#ifndef KMP_STUB
1374#ifdef PASS_ARGS_BY_VALUE
1375 int len = (int)KMP_STRLEN(str);
1376#endif
1377 __kmp_aux_set_defaults(str, len);
1378#endif
1379}
1380
1381/* ------------------------------------------------------------------------ */
1382
1383/* returns the status of cancellation */
1385#ifdef KMP_STUB
1386 return 0 /* false */;
1387#else
1388 // initialize the library if needed
1389 if (!__kmp_init_serial) {
1391 }
1393#endif
1394}
1395
1396int FTN_STDCALL FTN_GET_CANCELLATION_STATUS(int cancel_kind) {
1397#ifdef KMP_STUB
1398 return 0 /* false */;
1399#else
1400 return __kmp_get_cancellation_status(cancel_kind);
1401#endif
1402}
1403
1404/* returns the maximum allowed task priority */
1406#ifdef KMP_STUB
1407 return 0;
1408#else
1409 if (!__kmp_init_serial) {
1411 }
1413#endif
1414}
1415
1416// This function will be defined in libomptarget. When libomptarget is not
1417// loaded, we assume we are on the host and return KMP_HOST_DEVICE.
1418// Compiler/libomptarget will handle this if called inside target.
1420int FTN_STDCALL FTN_GET_DEVICE_NUM(void) {
1422}
1423
1424// Compiler will ensure that this is only called from host in sequential region
1426 int device_num) {
1427#ifdef KMP_STUB
1428 return 1; // just fail
1429#else
1430 if (device_num == KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)())
1431 return __kmpc_pause_resource(kind);
1432 else {
1433 int (*fptr)(kmp_pause_status_t, int);
1434 if ((*(void **)(&fptr) = KMP_DLSYM("tgt_pause_resource")))
1435 return (*fptr)(kind, device_num);
1436 else
1437 return 1; // just fail if there is no libomptarget
1438 }
1439#endif
1440}
1441
1442// Compiler will ensure that this is only called from host in sequential region
1443int FTN_STDCALL
1445#ifdef KMP_STUB
1446 return 1; // just fail
1447#else
1448 int fails = 0;
1449 int (*fptr)(kmp_pause_status_t, int);
1450 if ((*(void **)(&fptr) = KMP_DLSYM("tgt_pause_resource")))
1451 fails = (*fptr)(kind, KMP_DEVICE_ALL); // pause devices
1452 fails += __kmpc_pause_resource(kind); // pause host
1453 return fails;
1454#endif
1455}
1456
1457// Returns the maximum number of nesting levels supported by implementation
1458int FTN_STDCALL FTN_GET_SUPPORTED_ACTIVE_LEVELS(void) {
1459#ifdef KMP_STUB
1460 return 1;
1461#else
1463#endif
1464}
1465
1467#ifndef KMP_STUB
1469#endif
1470}
1471
1472// nteams-var per-device ICV
1473void FTN_STDCALL FTN_SET_NUM_TEAMS(int KMP_DEREF num_teams) {
1474#ifdef KMP_STUB
1475// Nothing.
1476#else
1477 if (!__kmp_init_serial) {
1479 }
1480 __kmp_set_num_teams(KMP_DEREF num_teams);
1481#endif
1482}
1483int FTN_STDCALL FTN_GET_MAX_TEAMS(void) {
1484#ifdef KMP_STUB
1485 return 1;
1486#else
1487 if (!__kmp_init_serial) {
1489 }
1490 return __kmp_get_max_teams();
1491#endif
1492}
1493// teams-thread-limit-var per-device ICV
1494void FTN_STDCALL FTN_SET_TEAMS_THREAD_LIMIT(int KMP_DEREF limit) {
1495#ifdef KMP_STUB
1496// Nothing.
1497#else
1498 if (!__kmp_init_serial) {
1500 }
1502#endif
1503}
1504int FTN_STDCALL FTN_GET_TEAMS_THREAD_LIMIT(void) {
1505#ifdef KMP_STUB
1506 return 1;
1507#else
1508 if (!__kmp_init_serial) {
1510 }
1512#endif
1513}
1514
1515/// TODO: Include the `omp.h` of the current build
1516/* OpenMP 5.1 interop */
1517typedef intptr_t omp_intptr_t;
1518
1519/* 0..omp_get_num_interop_properties()-1 are reserved for implementation-defined
1520 * properties */
1531 omp_ipr_first = -9
1533
1534#define omp_interop_none 0
1535
1536typedef enum omp_interop_rc {
1544 omp_irc_other = -6
1546
1547typedef enum omp_interop_fr {
1554 omp_ifr_last = 7
1556
1557typedef void *omp_interop_t;
1558
1559// libomptarget, if loaded, provides this function
1560int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) {
1561#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1562 return 0;
1563#else
1564 int (*fptr)(const omp_interop_t);
1565 if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_num_interop_properties")))
1566 return (*fptr)(interop);
1567 return 0;
1568#endif
1569}
1570
1571/// TODO Convert FTN_GET_INTEROP_XXX functions into a macro like interop.cpp
1572// libomptarget, if loaded, provides this function
1573intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop,
1574 omp_interop_property_t property_id,
1575 int *err) {
1576#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1577 return 0;
1578#else
1579 intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *);
1580 if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_int")))
1581 return (*fptr)(interop, property_id, err);
1582 return 0;
1583#endif
1584}
1585
1586// libomptarget, if loaded, provides this function
1587void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop,
1588 omp_interop_property_t property_id,
1589 int *err) {
1590#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1591 return nullptr;
1592#else
1593 void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *);
1594 if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_ptr")))
1595 return (*fptr)(interop, property_id, err);
1596 return nullptr;
1597#endif
1598}
1599
1600// libomptarget, if loaded, provides this function
1601const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop,
1602 omp_interop_property_t property_id,
1603 int *err) {
1604#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1605 return nullptr;
1606#else
1607 const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *);
1608 if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_str")))
1609 return (*fptr)(interop, property_id, err);
1610 return nullptr;
1611#endif
1612}
1613
1614// libomptarget, if loaded, provides this function
1615const char *FTN_STDCALL FTN_GET_INTEROP_NAME(
1616 const omp_interop_t interop, omp_interop_property_t property_id) {
1617#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1618 return nullptr;
1619#else
1620 const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
1621 if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_name")))
1622 return (*fptr)(interop, property_id);
1623 return nullptr;
1624#endif
1625}
1626
1627// libomptarget, if loaded, provides this function
1628const char *FTN_STDCALL FTN_GET_INTEROP_TYPE_DESC(
1629 const omp_interop_t interop, omp_interop_property_t property_id) {
1630#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1631 return nullptr;
1632#else
1633 const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
1634 if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_type_desc")))
1635 return (*fptr)(interop, property_id);
1636 return nullptr;
1637#endif
1638}
1639
1640// libomptarget, if loaded, provides this function
1641const char *FTN_STDCALL FTN_GET_INTEROP_RC_DESC(
1642 const omp_interop_t interop, omp_interop_property_t property_id) {
1643#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
1644 return nullptr;
1645#else
1646 const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
1647 if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_interop_rec_desc")))
1648 return (*fptr)(interop, property_id);
1649 return nullptr;
1650#endif
1651}
1652
1653// display environment variables when requested
1654void FTN_STDCALL FTN_DISPLAY_ENV(int verbose) {
1655#ifndef KMP_STUB
1656 __kmp_omp_display_env(verbose);
1657#endif
1658}
1659
1660int FTN_STDCALL FTN_IN_EXPLICIT_TASK(void) {
1661#ifdef KMP_STUB
1662 return 0;
1663#else
1664 int gtid = __kmp_entry_gtid();
1665 return __kmp_thread_from_gtid(gtid)->th.th_current_task->td_flags.tasktype;
1666#endif
1667}
1668
1669// GCC compatibility (versioned symbols)
1670#ifdef KMP_USE_VERSION_SYMBOLS
1671
1672/* These following sections create versioned symbols for the
1673 omp_* routines. The KMP_VERSION_SYMBOL macro expands the API name and
1674 then maps it to a versioned symbol.
1675 libgomp ``versions'' its symbols (OMP_1.0, OMP_2.0, OMP_3.0, ...) while also
1676 retaining the default version which libomp uses: VERSION (defined in
1677 exports_so.txt). If you want to see the versioned symbols for libgomp.so.1
1678 then just type:
1679
1680 objdump -T /path/to/libgomp.so.1 | grep omp_
1681
1682 Example:
1683 Step 1) Create __kmp_api_omp_set_num_threads_10_alias which is alias of
1684 __kmp_api_omp_set_num_threads
1685 Step 2) Set __kmp_api_omp_set_num_threads_10_alias to version:
1686 omp_set_num_threads@OMP_1.0
1687 Step 2B) Set __kmp_api_omp_set_num_threads to default version:
1688 omp_set_num_threads@@VERSION
1689*/
1690
1691// OMP_1.0 versioned symbols
1697KMP_VERSION_SYMBOL(FTN_IN_PARALLEL, 10, "OMP_1.0");
1698KMP_VERSION_SYMBOL(FTN_SET_DYNAMIC, 10, "OMP_1.0");
1699KMP_VERSION_SYMBOL(FTN_GET_DYNAMIC, 10, "OMP_1.0");
1700KMP_VERSION_SYMBOL(FTN_SET_NESTED, 10, "OMP_1.0");
1701KMP_VERSION_SYMBOL(FTN_GET_NESTED, 10, "OMP_1.0");
1702KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 10, "OMP_1.0");
1704KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 10, "OMP_1.0");
1706KMP_VERSION_SYMBOL(FTN_SET_LOCK, 10, "OMP_1.0");
1708KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 10, "OMP_1.0");
1710KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 10, "OMP_1.0");
1712
1713// OMP_2.0 versioned symbols
1714KMP_VERSION_SYMBOL(FTN_GET_WTICK, 20, "OMP_2.0");
1715KMP_VERSION_SYMBOL(FTN_GET_WTIME, 20, "OMP_2.0");
1716
1717// OMP_3.0 versioned symbols
1718KMP_VERSION_SYMBOL(FTN_SET_SCHEDULE, 30, "OMP_3.0");
1719KMP_VERSION_SYMBOL(FTN_GET_SCHEDULE, 30, "OMP_3.0");
1724KMP_VERSION_SYMBOL(FTN_GET_LEVEL, 30, "OMP_3.0");
1727
1728// the lock routines have a 1.0 and 3.0 version
1729KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 30, "OMP_3.0");
1731KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 30, "OMP_3.0");
1733KMP_VERSION_SYMBOL(FTN_SET_LOCK, 30, "OMP_3.0");
1735KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 30, "OMP_3.0");
1737KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 30, "OMP_3.0");
1739
1740// OMP_3.1 versioned symbol
1741KMP_VERSION_SYMBOL(FTN_IN_FINAL, 31, "OMP_3.1");
1742
1743// OMP_4.0 versioned symbols
1746KMP_VERSION_SYMBOL(FTN_GET_TEAM_NUM, 40, "OMP_4.0");
1752
1753// OMP_4.5 versioned symbols
1762
1763// OMP_5.0 versioned symbols
1764// KMP_VERSION_SYMBOL(FTN_GET_DEVICE_NUM, 50, "OMP_5.0");
1767// The C versions (KMP_FTN_PLAIN) of these symbols are in kmp_csupport.c
1768#if KMP_FTN_ENTRIES == KMP_FTN_APPEND
1773#endif
1774// KMP_VERSION_SYMBOL(FTN_GET_SUPPORTED_ACTIVE_LEVELS, 50, "OMP_5.0");
1775// KMP_VERSION_SYMBOL(FTN_FULFILL_EVENT, 50, "OMP_5.0");
1776
1777#endif // KMP_USE_VERSION_SYMBOLS
1778
1779#ifdef __cplusplus
1780} // extern "C"
1781#endif // __cplusplus
1782
1783// end of file //
char buf[BUFFER_SIZE]
const char * get() const
ConvertedString(char const *fortran_str, size_t size)
KMP_EXPORT kmp_int32 __kmpc_bound_num_threads(ident_t *)
void
Definition: ittnotify.h:3324
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void * data
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int mask
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp end
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t length
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event event
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d int
KMP_EXPORT void __kmpc_destroy_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
void * omp_memspace_handle_t
Definition: kmp.h:1073
void * omp_allocator_handle_t
Definition: kmp.h:1088
int __kmp_generate_warnings
Definition: kmp_global.cpp:120
omp_allocator_handle_t __kmpc_init_allocator(int gtid, omp_memspace_handle_t, int ntraits, omp_alloctrait_t traits[])
Definition: kmp_alloc.cpp:1379
#define get__blocktime(xteam, xtid)
Definition: kmp.h:2360
void __kmp_aux_set_defaults(char const *str, size_t len)
void __kmp_set_schedule(int gtid, kmp_sched_t new_sched, int chunk)
KMP_EXPORT void * kmpc_malloc(size_t size)
Definition: kmp_alloc.cpp:1096
void __kmp_elapsed_tick(double *)
#define KMP_MAX_BLOCKTIME
Definition: kmp.h:1228
KMP_EXPORT void __kmpc_init_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
kmp_pause_status_t
Definition: kmp.h:4524
int __kmp_aux_get_num_teams()
KMP_EXPORT int __kmpc_test_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
int __kmp_get_max_active_levels(int gtid)
KMP_EXPORT void * kmpc_aligned_malloc(size_t size, size_t alignment)
Definition: kmp_alloc.cpp:1109
#define __kmp_assign_root_init_mask()
Definition: kmp.h:3948
#define get__dynamic(xthread)
Definition: kmp.h:2391
omp_allocator_handle_t __kmpc_get_default_allocator(int gtid)
Definition: kmp_alloc.cpp:1489
char * __kmp_affinity_format
Definition: kmp_global.cpp:295
int __kmp_dflt_blocktime
Definition: kmp_global.cpp:158
KMP_EXPORT void __kmpc_set_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
int __kmp_omp_cancellation
Definition: kmp_global.cpp:215
size_t __kmp_stksize
Definition: kmp_global.cpp:69
#define get__max_active_levels(xthread)
Definition: kmp.h:2403
KMP_EXPORT void __kmpc_destroy_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
int __kmp_get_team_size(int gtid, int level)
#define __kmp_get_thread()
Definition: kmp.h:3604
KMP_EXPORT int __kmp_get_cancellation_status(int cancel_kind)
Definition: kmp_cancel.cpp:309
void __kmpc_destroy_allocator(int gtid, omp_allocator_handle_t al)
Definition: kmp_alloc.cpp:1478
#define set__dynamic(xthread, xval)
Definition: kmp.h:2389
#define __kmp_entry_gtid()
Definition: kmp.h:3601
void __kmp_set_max_active_levels(int gtid, int new_max_active_levels)
static int __kmp_tid_from_gtid(int gtid)
Definition: kmp.h:3619
#define get__proc_bind(xthread)
Definition: kmp.h:2411
KMP_EXPORT void __kmp_set_num_teams(int num_teams)
void __kmp_user_set_library(enum library_type arg)
KMP_EXPORT void __kmpc_init_nest_lock_with_hint(ident_t *loc, kmp_int32 gtid, void **user_lock, uintptr_t hint)
void __kmpc_set_default_allocator(int gtid, omp_allocator_handle_t al)
Definition: kmp_alloc.cpp:1483
void __kmp_elapsed(double *)
int __kmp_aux_get_team_num()
volatile int __kmp_init_middle
Definition: kmp_global.cpp:48
void __kmp_set_num_threads(int new_nth, int gtid)
volatile int __kmp_nth
Definition: kmp_global.cpp:456
static kmp_info_t * __kmp_entry_thread()
Definition: kmp.h:3731
int __kmp_get_ancestor_thread_num(int gtid, int level)
#define __kmp_thread_malloc(th, size)
Definition: kmp.h:3776
void __kmp_omp_display_env(int verbose)
void __kmp_middle_initialize(void)
kmp_info_t ** __kmp_threads
Definition: kmp_global.cpp:450
static void __kmp_reset_root_init_mask(int gtid)
Definition: kmp.h:3949
int __kmp_dispatch_num_buffers
Definition: kmp_global.cpp:135
KMP_EXPORT void __kmpc_unset_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
KMP_EXPORT void __kmp_set_teams_thread_limit(int limit)
#define set__max_active_levels(xthread, xval)
Definition: kmp.h:2400
#define get__bt_set(xteam, xtid)
Definition: kmp.h:2362
KMP_EXPORT void __kmpc_set_nest_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
volatile int __kmp_init_parallel
Definition: kmp_global.cpp:49
enum kmp_sched kmp_sched_t
void __kmp_aux_set_stacksize(size_t arg)
static const size_t KMP_AFFINITY_FORMAT_SIZE
Definition: kmp.h:979
#define TRUE
Definition: kmp.h:1324
enum library_type __kmp_library
Definition: kmp_global.cpp:143
#define FALSE
Definition: kmp.h:1323
size_t __kmp_aux_capture_affinity(int gtid, const char *format, kmp_str_buf_t *buffer)
KMP_EXPORT int __kmp_get_max_teams(void)
void __kmp_get_schedule(int gtid, kmp_sched_t *sched, int *chunk)
kmp_key_t __kmp_gtid_threadprivate_key
Definition: kmp_global.cpp:19
KMP_EXPORT void * kmpc_calloc(size_t nelem, size_t elsize)
Definition: kmp_alloc.cpp:1131
int __kmp_env_consistency_check
Definition: kmp_global.cpp:423
void __kmp_aux_display_affinity(int gtid, const char *format)
void __kmp_fulfill_event(kmp_event_t *event)
char __kmp_blocktime_units
Definition: kmp_global.cpp:159
#define KMP_DEVICE_ALL
Definition: kmp.h:4518
KMP_EXPORT void kmpc_free(void *ptr)
Definition: kmp_alloc.cpp:1172
KMP_EXPORT int __kmpc_test_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
void __kmp_save_internal_controls(kmp_info_t *thread)
static void __kmp_aux_convert_blocktime(int *bt)
Definition: kmp.h:3469
KMP_EXPORT int __kmp_get_teams_thread_limit(void)
#define __kmp_get_gtid()
Definition: kmp.h:3600
void __kmp_serial_initialize(void)
int __kmp_avail_proc
Definition: kmp_global.cpp:123
KMP_EXPORT void __kmpc_init_lock_with_hint(ident_t *loc, kmp_int32 gtid, void **user_lock, uintptr_t hint)
kmp_int32 __kmp_max_task_priority
Definition: kmp_global.cpp:300
KMP_EXPORT void * kmpc_realloc(void *ptr, size_t size)
Definition: kmp_alloc.cpp:1142
KMP_EXPORT void __kmpc_init_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
kmp_proc_bind_t
Definition: kmp.h:958
static kmp_info_t * __kmp_thread_from_gtid(int gtid)
Definition: kmp.h:3634
#define KMP_MIN_DISP_NUM_BUFF
Definition: kmp.h:1290
int __kmp_gtid_mode
Definition: kmp_global.cpp:182
library_type
Definition: kmp.h:517
@ library_turnaround
Definition: kmp.h:520
@ library_throughput
Definition: kmp.h:521
@ library_serial
Definition: kmp.h:519
volatile int __kmp_init_serial
Definition: kmp_global.cpp:44
#define KMP_MAX_DISP_NUM_BUFF
Definition: kmp.h:1292
#define KMP_MAX_ACTIVE_LEVELS_LIMIT
Definition: kmp.h:1300
KMP_EXPORT void __kmpc_unset_lock(ident_t *loc, kmp_int32 gtid, void **user_lock)
#define KMP_GTID_DNE
Definition: kmp.h:1027
int __kmpc_pause_resource(kmp_pause_status_t level)
union KMP_ALIGN_CACHE kmp_info kmp_info_t
void __kmp_aux_set_blocktime(int arg, kmp_info_t *thread, int tid)
#define __kmp_thread_free(th, ptr)
Definition: kmp.h:3782
static int alignment
Definition: kmp_alloc.cpp:1500
#define KF_TRACE(d, x)
Definition: kmp_debug.h:162
#define KMP_DEBUG_ASSERT(cond)
Definition: kmp_debug.h:61
double FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_WTICK(void)
int FTN_STDCALL FTN_GET_TEAMS_THREAD_LIMIT(void)
int FTN_STDCALL FTN_GET_LIBRARY(void)
intptr_t omp_intptr_t
TODO: Include the omp.h of the current build.
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_NUM_TEAMS(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_MAX_TASK_PRIORITY(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_IN_FINAL(void)
int FTN_STDCALL FTN_GET_SUPPORTED_ACTIVE_LEVELS(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_CANCELLATION(void)
void FTN_STDCALL FTN_SET_LIBRARY_SERIAL(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_NUM_DEVICES(void) KMP_WEAK_ATTRIBUTE_EXTERNAL
enum omp_interop_property omp_interop_property_t
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_DEFAULT_DEVICE(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_MAX_ACTIVE_LEVELS(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_LEVEL(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_NUM_PROCS(void)
int FTN_STDCALL FTN_GET_NUM_KNOWN_THREADS(void)
size_t FTN_STDCALL FTN_GET_STACKSIZE_S(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_MAX_THREADS(void)
#define KMP_DEREF
Definition: kmp_ftn_entry.h:58
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_NESTED(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_IN_PARALLEL(void)
enum omp_interop_fr omp_interop_fr_t
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_THREAD_NUM(void)
static void __kmp_fortran_strncpy_truncate(char *buffer, size_t buf_size, char const *csrc, size_t csrc_size)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_NUM_PLACES(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_DYNAMIC(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_PLACE_NUM(void)
omp_allocator_handle_t FTN_STDCALL FTN_GET_DEFAULT_ALLOCATOR(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_ACTIVE_LEVEL(void)
void * omp_interop_t
int FTN_STDCALL FTN_GET_DEVICE_NUM(void) KMP_WEAK_ATTRIBUTE_EXTERNAL
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_TEAM_NUM(void)
int FTN_STDCALL FTN_GET_AFFINITY_MAX_PROC(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_NUM_THREADS(void)
double FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_WTIME(void)
omp_interop_property
@ omp_ipr_device_num
@ omp_ipr_vendor
@ omp_ipr_fr_name
@ omp_ipr_platform
@ omp_ipr_vendor_name
@ omp_ipr_first
@ omp_ipr_fr_id
@ omp_ipr_device_context
@ omp_ipr_targetsync
@ omp_ipr_device
int FTN_STDCALL FTN_IN_EXPLICIT_TASK(void)
omp_interop_fr
@ omp_ifr_hip
@ omp_ifr_level_zero
@ omp_ifr_cuda
@ omp_ifr_opencl
@ omp_ifr_sycl
@ omp_ifr_last
@ omp_ifr_cuda_driver
int FTN_STDCALL FTN_GET_BLOCKTIME(void)
int FTN_STDCALL FTN_GET_MAX_TEAMS(void)
void FTN_STDCALL FTN_SET_LIBRARY_TURNAROUND(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_IS_INITIAL_DEVICE(void) KMP_WEAK_ATTRIBUTE_EXTERNAL
#define KMP_EXPAND_NAME_IF_APPEND(name)
Definition: kmp_ftn_entry.h:66
void FTN_STDCALL FTN_SET_WARNINGS_OFF(void)
int FTN_STDCALL FTN_GET_STACKSIZE(void)
Definition: kmp_ftn_entry.h:89
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_THREAD_LIMIT(void)
enum omp_interop_rc omp_interop_rc_t
void FTN_STDCALL FTN_SET_WARNINGS_ON(void)
kmp_proc_bind_t FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_PROC_BIND(void)
void FTN_STDCALL FTN_SET_LIBRARY_THROUGHPUT(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_PARTITION_NUM_PLACES(void)
int FTN_STDCALL KMP_EXPAND_NAME() FTN_GET_INITIAL_DEVICE(void) KMP_WEAK_ATTRIBUTE_EXTERNAL
omp_interop_rc
@ omp_irc_type_str
@ omp_irc_empty
@ omp_irc_no_value
@ omp_irc_out_of_range
@ omp_irc_other
@ omp_irc_success
@ omp_irc_type_int
@ omp_irc_type_ptr
#define FTN_SET_TEAMS_THREAD_LIMIT
Definition: kmp_ftn_os.h:552
#define FTN_GET_PLACE_NUM_PROCS
Definition: kmp_ftn_os.h:516
#define FTN_SET_AFFINITY_MASK_PROC
Definition: kmp_ftn_os.h:450
#define FTN_GET_ANCESTOR_THREAD_NUM
Definition: kmp_ftn_os.h:479
#define FTN_CONTROL_TOOL
Definition: kmp_ftn_os.h:532
#define FTN_GET_CANCELLATION_STATUS
Definition: kmp_ftn_os.h:512
#define FTN_INIT_LOCK
Definition: kmp_ftn_os.h:485
#define FTN_DESTROY_ALLOCATOR
Definition: kmp_ftn_os.h:534
#define FTN_CALLOC
Definition: kmp_ftn_os.h:456
#define FTN_SET_STACKSIZE_S
Definition: kmp_ftn_os.h:433
#define FTN_SET_MAX_ACTIVE_LEVELS
Definition: kmp_ftn_os.h:475
#define FTN_FULFILL_EVENT
Definition: kmp_ftn_os.h:549
#define FTN_SET_NUM_THREADS
Definition: kmp_ftn_os.h:462
#define FTN_PAUSE_RESOURCE_ALL
Definition: kmp_ftn_os.h:545
#define FTN_DESTROY_LOCK
Definition: kmp_ftn_os.h:490
#define FTN_GET_INTEROP_TYPE_DESC
Definition: kmp_ftn_os.h:560
#define FTN_GET_AFFINITY
Definition: kmp_ftn_os.h:446
#define FTN_SET_DEFAULT_DEVICE
Definition: kmp_ftn_os.h:508
#define FTN_GET_INTEROP_NAME
Definition: kmp_ftn_os.h:559
#define FTN_INIT_NEST_LOCK
Definition: kmp_ftn_os.h:494
#define FTN_SET_LIBRARY
Definition: kmp_ftn_os.h:441
#define FTN_REALLOC
Definition: kmp_ftn_os.h:457
#define FTN_GET_INTEROP_INT
Definition: kmp_ftn_os.h:556
#define FTN_SET_AFFINITY
Definition: kmp_ftn_os.h:445
#define FTN_SET_LOCK
Definition: kmp_ftn_os.h:491
#define FTN_GET_TEAM_SIZE
Definition: kmp_ftn_os.h:480
#define FTN_GET_INTEROP_RC_DESC
Definition: kmp_ftn_os.h:561
#define FTN_GET_PLACE_PROC_IDS
Definition: kmp_ftn_os.h:517
#define FTN_UNSET_LOCK
Definition: kmp_ftn_os.h:492
#define FTN_SET_NUM_TEAMS
Definition: kmp_ftn_os.h:550
#define FTN_DISPLAY_ENV
Definition: kmp_ftn_os.h:547
#define FTN_PAUSE_RESOURCE
Definition: kmp_ftn_os.h:544
#define FTN_UNSET_AFFINITY_MASK_PROC
Definition: kmp_ftn_os.h:451
#define FTN_TEST_NEST_LOCK
Definition: kmp_ftn_os.h:498
#define FTN_ALIGNED_MALLOC
Definition: kmp_ftn_os.h:455
#define FTN_SET_SCHEDULE
Definition: kmp_ftn_os.h:473
#define FTN_GET_NUM_INTEROP_PROPERTIES
Definition: kmp_ftn_os.h:555
#define FTN_GET_PARTITION_PLACE_NUMS
Definition: kmp_ftn_os.h:520
#define FTN_GET_INTEROP_STR
Definition: kmp_ftn_os.h:558
#define FTN_INIT_ALLOCATOR
Definition: kmp_ftn_os.h:533
#define FTN_TEST_LOCK
Definition: kmp_ftn_os.h:493
#define FTN_CREATE_AFFINITY_MASK
Definition: kmp_ftn_os.h:448
#define FTN_DISPLAY_AFFINITY
Definition: kmp_ftn_os.h:542
#define FTN_SET_DISP_NUM_BUFFERS
Definition: kmp_ftn_os.h:444
#define FTN_GET_AFFINITY_FORMAT
Definition: kmp_ftn_os.h:541
#define FTN_SET_BLOCKTIME
Definition: kmp_ftn_os.h:436
#define FTN_CAPTURE_AFFINITY
Definition: kmp_ftn_os.h:543
#define FTN_KFREE
Definition: kmp_ftn_os.h:458
#define FTN_SET_NEST_LOCK
Definition: kmp_ftn_os.h:496
#define FTN_SET_DEFAULTS
Definition: kmp_ftn_os.h:443
#define FTN_SET_DEFAULT_ALLOCATOR
Definition: kmp_ftn_os.h:535
#define FTN_SET_NESTED
Definition: kmp_ftn_os.h:469
#define FTN_GET_AFFINITY_MASK_PROC
Definition: kmp_ftn_os.h:452
#define FTN_SET_DYNAMIC
Definition: kmp_ftn_os.h:467
#define FTN_SET_AFFINITY_FORMAT
Definition: kmp_ftn_os.h:540
#define FTN_MALLOC
Definition: kmp_ftn_os.h:454
#define FTN_DESTROY_NEST_LOCK
Definition: kmp_ftn_os.h:495
#define FTN_DESTROY_AFFINITY_MASK
Definition: kmp_ftn_os.h:449
#define FTN_SET_STACKSIZE
Definition: kmp_ftn_os.h:432
#define FTN_UNSET_NEST_LOCK
Definition: kmp_ftn_os.h:497
#define FTN_GET_INTEROP_PTR
Definition: kmp_ftn_os.h:557
#define FTN_GET_SCHEDULE
Definition: kmp_ftn_os.h:474
#define KMP_INFORM(...)
Definition: kmp_i18n.h:142
#define KMP_FATAL(...)
Definition: kmp_i18n.h:146
#define KMP_VERSION_SYMBOL(api_name, ver_num, ver_str)
Definition: kmp_os.h:445
#define FTN_TRUE
Definition: kmp_os.h:1176
long kmp_intptr_t
Definition: kmp_os.h:204
@ kmp_warnings_explicit
Definition: kmp_os.h:1241
#define KMP_DLSYM_NEXT(name)
Definition: kmp_os.h:1301
#define FTN_FALSE
Definition: kmp_os.h:1180
#define TCR_4(a)
Definition: kmp_os.h:1135
#define KMP_WEAK_ATTRIBUTE_EXTERNAL
Definition: kmp_os.h:400
#define KMP_DLSYM(name)
Definition: kmp_os.h:1300
#define KMP_EXPAND_NAME(api_name)
Definition: kmp_os.h:444
#define KMP_STRNCPY_S(dst, bsz, src, cnt)
static void __kmp_strncpy_truncate(char *buffer, size_t buf_size, char const *src, size_t src_size)
#define KMP_STRLEN
void __kmp_str_buf_free(kmp_str_buf_t *buffer)
Definition: kmp_str.cpp:123
#define __kmp_str_buf_init(b)
Definition: kmp_str.h:40
void __kmps_set_library(int arg)
Definition: kmp_stub.cpp:229
#define i
Definition: kmp_stub.cpp:87
double __kmps_get_wtime(void)
Definition: kmp_stub.cpp:283
void __kmps_set_nested(int arg)
Definition: kmp_stub.cpp:241
int __kmps_get_blocktime(void)
Definition: kmp_stub.cpp:210
void __kmps_set_schedule(kmp_sched_t kind, int modifier)
Definition: kmp_stub.cpp:266
int __kmps_get_dynamic(void)
Definition: kmp_stub.cpp:222
int __kmps_get_nested(void)
Definition: kmp_stub.cpp:246
void __kmps_set_blocktime(int arg)
Definition: kmp_stub.cpp:205
void __kmps_set_dynamic(int arg)
Definition: kmp_stub.cpp:217
int __kmps_get_library(void)
Definition: kmp_stub.cpp:234
double __kmps_get_wtick(void)
Definition: kmp_stub.cpp:309
void __kmps_set_stacksize(size_t arg)
Definition: kmp_stub.cpp:253
void __kmps_get_schedule(kmp_sched_t *kind, int *modifier)
Definition: kmp_stub.cpp:272
kmp_proc_bind_t __kmps_get_proc_bind(void)
Definition: kmp_stub.cpp:278
size_t __kmps_get_stacksize(void)
Definition: kmp_stub.cpp:258
return ret
int __kmp_control_tool(uint64_t command, uint64_t modifier, void *arg)
#define OMPT_GET_FRAME_ADDRESS(level)
volatile int flag
int used
Definition: kmp_str.h:35
char * str
Definition: kmp_str.h:33
ompt_frame_t frame
Definition: ompt-internal.h:56
static int err
Definition: teams-no-par.c:16
Definition: kmp.h:3215
kmp_base_team_t t
Definition: kmp.h:3216