14 #error The support file kmp_ftn_entry.h should not be compiled by itself.
28 #include "ompt-specific.h"
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
49 #if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_APPEND)
50 #define PASS_ARGS_BY_VALUE 1
55 #ifdef PASS_ARGS_BY_VALUE
61 void FTN_STDCALL FTN_SET_STACKSIZE(
int KMP_DEREF arg) {
63 __kmps_set_stacksize(KMP_DEREF arg);
66 __kmp_aux_set_stacksize((
size_t)KMP_DEREF arg);
70 void FTN_STDCALL FTN_SET_STACKSIZE_S(
size_t KMP_DEREF arg) {
72 __kmps_set_stacksize(KMP_DEREF arg);
75 __kmp_aux_set_stacksize(KMP_DEREF arg);
79 int FTN_STDCALL FTN_GET_STACKSIZE(
void) {
81 return (
int)__kmps_get_stacksize();
83 if (!__kmp_init_serial) {
84 __kmp_serial_initialize();
86 return (
int)__kmp_stksize;
90 size_t FTN_STDCALL FTN_GET_STACKSIZE_S(
void) {
92 return __kmps_get_stacksize();
94 if (!__kmp_init_serial) {
95 __kmp_serial_initialize();
101 void FTN_STDCALL FTN_SET_BLOCKTIME(
int KMP_DEREF arg) {
103 __kmps_set_blocktime(KMP_DEREF arg);
108 gtid = __kmp_entry_gtid();
109 tid = __kmp_tid_from_gtid(gtid);
110 thread = __kmp_thread_from_gtid(gtid);
112 __kmp_aux_set_blocktime(KMP_DEREF arg, thread, tid);
116 int FTN_STDCALL FTN_GET_BLOCKTIME(
void) {
118 return __kmps_get_blocktime();
124 gtid = __kmp_entry_gtid();
125 tid = __kmp_tid_from_gtid(gtid);
126 thread = __kmp_thread_from_gtid(gtid);
127 team = __kmp_threads[gtid]->th.th_team;
130 if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
131 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
132 team->t.t_id, tid, KMP_MAX_BLOCKTIME));
133 return KMP_MAX_BLOCKTIME;
135 #ifdef KMP_ADJUST_BLOCKTIME
136 else if (__kmp_zero_bt && !get__bt_set(team, tid)) {
137 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
138 team->t.t_id, tid, 0));
143 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
144 team->t.t_id, tid, get__blocktime(team, tid)));
145 return get__blocktime(team, tid);
150 void FTN_STDCALL FTN_SET_LIBRARY_SERIAL(
void) {
152 __kmps_set_library(library_serial);
155 __kmp_user_set_library(library_serial);
159 void FTN_STDCALL FTN_SET_LIBRARY_TURNAROUND(
void) {
161 __kmps_set_library(library_turnaround);
164 __kmp_user_set_library(library_turnaround);
168 void FTN_STDCALL FTN_SET_LIBRARY_THROUGHPUT(
void) {
170 __kmps_set_library(library_throughput);
173 __kmp_user_set_library(library_throughput);
177 void FTN_STDCALL FTN_SET_LIBRARY(
int KMP_DEREF arg) {
179 __kmps_set_library(KMP_DEREF arg);
181 enum library_type lib;
182 lib = (
enum library_type)KMP_DEREF arg;
184 __kmp_user_set_library(lib);
188 int FTN_STDCALL FTN_GET_LIBRARY(
void) {
190 return __kmps_get_library();
192 if (!__kmp_init_serial) {
193 __kmp_serial_initialize();
195 return ((
int)__kmp_library);
199 void FTN_STDCALL FTN_SET_DISP_NUM_BUFFERS(
int KMP_DEREF arg) {
205 int num_buffers = KMP_DEREF arg;
206 if (__kmp_init_serial == FALSE && num_buffers >= KMP_MIN_DISP_NUM_BUFF &&
207 num_buffers <= KMP_MAX_DISP_NUM_BUFF) {
208 __kmp_dispatch_num_buffers = num_buffers;
213 int FTN_STDCALL FTN_SET_AFFINITY(
void **mask) {
214 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
217 if (!TCR_4(__kmp_init_middle)) {
218 __kmp_middle_initialize();
220 return __kmp_aux_set_affinity(mask);
224 int FTN_STDCALL FTN_GET_AFFINITY(
void **mask) {
225 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
228 if (!TCR_4(__kmp_init_middle)) {
229 __kmp_middle_initialize();
231 return __kmp_aux_get_affinity(mask);
235 int FTN_STDCALL FTN_GET_AFFINITY_MAX_PROC(
void) {
236 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
240 if (!TCR_4(__kmp_init_middle)) {
241 __kmp_middle_initialize();
243 return __kmp_aux_get_affinity_max_proc();
247 void FTN_STDCALL FTN_CREATE_AFFINITY_MASK(
void **mask) {
248 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
252 kmp_affin_mask_t *mask_internals;
253 if (!TCR_4(__kmp_init_middle)) {
254 __kmp_middle_initialize();
256 mask_internals = __kmp_affinity_dispatch->allocate_mask();
257 KMP_CPU_ZERO(mask_internals);
258 *mask = mask_internals;
262 void FTN_STDCALL FTN_DESTROY_AFFINITY_MASK(
void **mask) {
263 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
267 kmp_affin_mask_t *mask_internals;
268 if (!TCR_4(__kmp_init_middle)) {
269 __kmp_middle_initialize();
271 if (__kmp_env_consistency_check) {
273 KMP_FATAL(AffinityInvalidMask,
"kmp_destroy_affinity_mask");
276 mask_internals = (kmp_affin_mask_t *)(*mask);
277 __kmp_affinity_dispatch->deallocate_mask(mask_internals);
282 int FTN_STDCALL FTN_SET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
283 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
286 if (!TCR_4(__kmp_init_middle)) {
287 __kmp_middle_initialize();
289 return __kmp_aux_set_affinity_mask_proc(KMP_DEREF proc, mask);
293 int FTN_STDCALL FTN_UNSET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
294 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
297 if (!TCR_4(__kmp_init_middle)) {
298 __kmp_middle_initialize();
300 return __kmp_aux_unset_affinity_mask_proc(KMP_DEREF proc, mask);
304 int FTN_STDCALL FTN_GET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
305 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
308 if (!TCR_4(__kmp_init_middle)) {
309 __kmp_middle_initialize();
311 return __kmp_aux_get_affinity_mask_proc(KMP_DEREF proc, mask);
318 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NUM_THREADS)(
int KMP_DEREF arg) {
322 __kmp_set_num_threads(KMP_DEREF arg, __kmp_entry_gtid());
327 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_THREADS)(void) {
336 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_THREADS)(void) {
342 if (!TCR_4(__kmp_init_middle)) {
343 __kmp_middle_initialize();
345 gtid = __kmp_entry_gtid();
346 thread = __kmp_threads[gtid];
349 return thread->th.th_current_task->td_icvs.nproc;
353 int FTN_STDCALL FTN_CONTROL_TOOL(
int command,
int modifier,
void *arg) {
354 #if defined(KMP_STUB) || !OMPT_SUPPORT
357 OMPT_STORE_RETURN_ADDRESS(__kmp_entry_gtid());
358 if (!TCR_4(__kmp_init_middle)) {
361 kmp_info_t *this_thr = __kmp_threads[__kmp_entry_gtid()];
362 ompt_task_info_t *parent_task_info = OMPT_CUR_TASK_INFO(this_thr);
363 parent_task_info->frame.enter_frame.ptr = OMPT_GET_FRAME_ADDRESS(0);
364 int ret = __kmp_control_tool(command, modifier, arg);
365 parent_task_info->frame.enter_frame.ptr = 0;
371 omp_allocator_handle_t FTN_STDCALL
372 FTN_INIT_ALLOCATOR(omp_memspace_handle_t KMP_DEREF m,
int KMP_DEREF ntraits,
373 omp_alloctrait_t tr[]) {
377 return __kmpc_init_allocator(__kmp_entry_gtid(), KMP_DEREF m,
378 KMP_DEREF ntraits, tr);
382 void FTN_STDCALL FTN_DESTROY_ALLOCATOR(omp_allocator_handle_t al) {
384 __kmpc_destroy_allocator(__kmp_entry_gtid(), al);
387 void FTN_STDCALL FTN_SET_DEFAULT_ALLOCATOR(omp_allocator_handle_t al) {
389 __kmpc_set_default_allocator(__kmp_entry_gtid(), al);
392 omp_allocator_handle_t FTN_STDCALL FTN_GET_DEFAULT_ALLOCATOR(
void) {
396 return __kmpc_get_default_allocator(__kmp_entry_gtid());
402 static void __kmp_fortran_strncpy_truncate(
char *buffer,
size_t buf_size,
403 char const *csrc,
size_t csrc_size) {
404 size_t capped_src_size = csrc_size;
405 if (csrc_size >= buf_size) {
406 capped_src_size = buf_size - 1;
408 KMP_STRNCPY_S(buffer, buf_size, csrc, capped_src_size);
409 if (csrc_size >= buf_size) {
410 KMP_DEBUG_ASSERT(buffer[buf_size - 1] ==
'\0');
411 buffer[buf_size - 1] = csrc[buf_size - 1];
413 for (
size_t i = csrc_size; i < buf_size; ++i)
419 class ConvertedString {
424 ConvertedString(
char const *fortran_str,
size_t size) {
425 th = __kmp_get_thread();
426 buf = (
char *)__kmp_thread_malloc(th, size + 1);
427 KMP_STRNCPY_S(buf, size + 1, fortran_str, size);
430 ~ConvertedString() { __kmp_thread_free(th, buf); }
431 const char *get()
const {
return buf; }
439 void FTN_STDCALL FTN_SET_AFFINITY_FORMAT(
char const *format,
size_t size) {
443 if (!__kmp_init_serial) {
444 __kmp_serial_initialize();
446 ConvertedString cformat(format, size);
449 __kmp_strncpy_truncate(__kmp_affinity_format, KMP_AFFINITY_FORMAT_SIZE,
450 cformat.get(), KMP_STRLEN(cformat.get()));
460 size_t FTN_STDCALL FTN_GET_AFFINITY_FORMAT(
char *buffer,
size_t size) {
465 if (!__kmp_init_serial) {
466 __kmp_serial_initialize();
468 format_size = KMP_STRLEN(__kmp_affinity_format);
469 if (buffer && size) {
470 __kmp_fortran_strncpy_truncate(buffer, size, __kmp_affinity_format,
482 void FTN_STDCALL FTN_DISPLAY_AFFINITY(
char const *format,
size_t size) {
487 if (!TCR_4(__kmp_init_middle)) {
488 __kmp_middle_initialize();
490 gtid = __kmp_get_gtid();
491 ConvertedString cformat(format, size);
492 __kmp_aux_display_affinity(gtid, cformat.get());
506 size_t FTN_STDCALL FTN_CAPTURE_AFFINITY(
char *buffer,
char const *format,
507 size_t buf_size,
size_t for_size) {
508 #if defined(KMP_STUB)
513 kmp_str_buf_t capture_buf;
514 if (!TCR_4(__kmp_init_middle)) {
515 __kmp_middle_initialize();
517 gtid = __kmp_get_gtid();
518 __kmp_str_buf_init(&capture_buf);
519 ConvertedString cformat(format, for_size);
520 num_required = __kmp_aux_capture_affinity(gtid, cformat.get(), &capture_buf);
521 if (buffer && buf_size) {
522 __kmp_fortran_strncpy_truncate(buffer, buf_size, capture_buf.str,
525 __kmp_str_buf_free(&capture_buf);
530 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
536 #if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
537 KMP_OS_HURD || KMP_OS_OPENBSD
538 gtid = __kmp_entry_gtid();
540 if (!__kmp_init_parallel ||
541 (gtid = (
int)((kmp_intptr_t)TlsGetValue(__kmp_gtid_threadprivate_key))) ==
549 #ifdef KMP_TDATA_GTID
550 if (__kmp_gtid_mode >= 3) {
551 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
556 if (!__kmp_init_parallel ||
557 (gtid = (
int)((kmp_intptr_t)(
558 pthread_getspecific(__kmp_gtid_threadprivate_key)))) == 0) {
562 #ifdef KMP_TDATA_GTID
566 #error Unknown or unsupported OS
569 return __kmp_tid_from_gtid(gtid);
573 int FTN_STDCALL FTN_GET_NUM_KNOWN_THREADS(
void) {
577 if (!__kmp_init_serial) {
578 __kmp_serial_initialize();
582 return TCR_4(__kmp_nth);
586 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PROCS)(void) {
590 if (!TCR_4(__kmp_init_middle)) {
591 __kmp_middle_initialize();
593 return __kmp_avail_proc;
597 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NESTED)(
int KMP_DEREF flag) {
598 KMP_INFORM(APIDeprecated,
"omp_set_nested",
"omp_set_max_active_levels");
600 __kmps_set_nested(KMP_DEREF flag);
604 thread = __kmp_entry_thread();
605 __kmp_save_internal_controls(thread);
607 int max_active_levels = get__max_active_levels(thread);
608 if (max_active_levels == 1)
609 max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
610 set__max_active_levels(thread, (KMP_DEREF flag) ? max_active_levels : 1);
614 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NESTED)(void) {
615 KMP_INFORM(APIDeprecated,
"omp_get_nested",
"omp_get_max_active_levels");
617 return __kmps_get_nested();
620 thread = __kmp_entry_thread();
621 return get__max_active_levels(thread) > 1;
625 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DYNAMIC)(
int KMP_DEREF flag) {
627 __kmps_set_dynamic(KMP_DEREF flag ? TRUE : FALSE);
631 thread = __kmp_entry_thread();
633 __kmp_save_internal_controls(thread);
634 set__dynamic(thread, KMP_DEREF flag ?
true :
false);
638 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DYNAMIC)(void) {
640 return __kmps_get_dynamic();
643 thread = __kmp_entry_thread();
644 return get__dynamic(thread);
648 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IN_PARALLEL)(void) {
652 kmp_info_t *th = __kmp_entry_thread();
653 if (th->th.th_teams_microtask) {
658 return (th->th.th_team->t.t_active_level ? 1 : 0);
660 return (th->th.th_root->r.r_in_parallel ? FTN_TRUE : FTN_FALSE);
664 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_SCHEDULE)(kmp_sched_t KMP_DEREF kind,
665 int KMP_DEREF modifier) {
667 __kmps_set_schedule(KMP_DEREF kind, KMP_DEREF modifier);
670 __kmp_set_schedule(__kmp_entry_gtid(), KMP_DEREF kind, KMP_DEREF modifier);
674 void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_SCHEDULE)(kmp_sched_t *kind,
677 __kmps_get_schedule(kind, modifier);
680 __kmp_get_schedule(__kmp_entry_gtid(), kind, modifier);
684 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_MAX_ACTIVE_LEVELS)(
int KMP_DEREF arg) {
689 __kmp_set_max_active_levels(__kmp_entry_gtid(), KMP_DEREF arg);
693 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_ACTIVE_LEVELS)(void) {
698 return __kmp_get_max_active_levels(__kmp_entry_gtid());
702 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_ACTIVE_LEVEL)(void) {
707 return __kmp_entry_thread()->th.th_team->t.t_active_level;
711 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_LEVEL)(void) {
716 return __kmp_entry_thread()->th.th_team->t.t_level;
721 KMP_EXPAND_NAME(FTN_GET_ANCESTOR_THREAD_NUM)(
int KMP_DEREF level) {
723 return (KMP_DEREF level) ? (-1) : (0);
725 return __kmp_get_ancestor_thread_num(__kmp_entry_gtid(), KMP_DEREF level);
729 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_TEAM_SIZE)(
int KMP_DEREF level) {
731 return (KMP_DEREF level) ? (-1) : (1);
733 return __kmp_get_team_size(__kmp_entry_gtid(), KMP_DEREF level);
737 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_LIMIT)(void) {
743 if (!__kmp_init_serial) {
744 __kmp_serial_initialize();
747 gtid = __kmp_entry_gtid();
748 thread = __kmp_threads[gtid];
749 return thread->th.th_current_task->td_icvs.thread_limit;
753 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IN_FINAL)(void) {
757 if (!TCR_4(__kmp_init_parallel)) {
760 return __kmp_entry_thread()->th.th_current_task->td_flags.final;
764 kmp_proc_bind_t FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PROC_BIND)(void) {
766 return __kmps_get_proc_bind();
768 return get__proc_bind(__kmp_entry_thread());
772 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PLACES)(void) {
773 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
776 if (!TCR_4(__kmp_init_middle)) {
777 __kmp_middle_initialize();
779 if (!KMP_AFFINITY_CAPABLE())
781 return __kmp_affinity_num_masks;
785 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM_PROCS)(
int place_num) {
786 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
791 if (!TCR_4(__kmp_init_middle)) {
792 __kmp_middle_initialize();
794 if (!KMP_AFFINITY_CAPABLE())
796 if (place_num < 0 || place_num >= (
int)__kmp_affinity_num_masks)
798 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
799 KMP_CPU_SET_ITERATE(i, mask) {
800 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
801 (!KMP_CPU_ISSET(i, mask))) {
810 void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_PROC_IDS)(
int place_num,
812 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
816 if (!TCR_4(__kmp_init_middle)) {
817 __kmp_middle_initialize();
819 if (!KMP_AFFINITY_CAPABLE())
821 if (place_num < 0 || place_num >= (
int)__kmp_affinity_num_masks)
823 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
825 KMP_CPU_SET_ITERATE(i, mask) {
826 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
827 (!KMP_CPU_ISSET(i, mask))) {
835 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM)(void) {
836 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
841 if (!TCR_4(__kmp_init_middle)) {
842 __kmp_middle_initialize();
844 if (!KMP_AFFINITY_CAPABLE())
846 gtid = __kmp_entry_gtid();
847 thread = __kmp_thread_from_gtid(gtid);
848 if (thread->th.th_current_place < 0)
850 return thread->th.th_current_place;
854 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PARTITION_NUM_PLACES)(void) {
855 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
858 int gtid, num_places, first_place, last_place;
860 if (!TCR_4(__kmp_init_middle)) {
861 __kmp_middle_initialize();
863 if (!KMP_AFFINITY_CAPABLE())
865 gtid = __kmp_entry_gtid();
866 thread = __kmp_thread_from_gtid(gtid);
867 first_place = thread->th.th_first_place;
868 last_place = thread->th.th_last_place;
869 if (first_place < 0 || last_place < 0)
871 if (first_place <= last_place)
872 num_places = last_place - first_place + 1;
874 num_places = __kmp_affinity_num_masks - first_place + last_place + 1;
880 KMP_EXPAND_NAME(FTN_GET_PARTITION_PLACE_NUMS)(
int *place_nums) {
881 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
884 int i, gtid, place_num, first_place, last_place, start, end;
886 if (!TCR_4(__kmp_init_middle)) {
887 __kmp_middle_initialize();
889 if (!KMP_AFFINITY_CAPABLE())
891 gtid = __kmp_entry_gtid();
892 thread = __kmp_thread_from_gtid(gtid);
893 first_place = thread->th.th_first_place;
894 last_place = thread->th.th_last_place;
895 if (first_place < 0 || last_place < 0)
897 if (first_place <= last_place) {
904 for (i = 0, place_num = start; place_num <= end; ++place_num, ++i) {
905 place_nums[i] = place_num;
910 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_TEAMS)(void) {
914 return __kmp_aux_get_num_teams();
918 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_TEAM_NUM)(void) {
922 return __kmp_aux_get_team_num();
926 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DEFAULT_DEVICE)(void) {
927 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
930 return __kmp_entry_thread()->th.th_current_task->td_icvs.default_device;
934 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DEFAULT_DEVICE)(
int KMP_DEREF arg) {
935 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
938 __kmp_entry_thread()->th.th_current_task->td_icvs.default_device =
945 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void)
946 KMP_WEAK_ATTRIBUTE_EXTERNAL;
947 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void) {
948 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
952 if ((*(
void **)(&fptr) = KMP_DLSYM(
"__tgt_get_num_devices"))) {
954 }
else if ((*(
void **)(&fptr) = KMP_DLSYM_NEXT(
"omp_get_num_devices"))) {
956 }
else if ((*(
void **)(&fptr) = KMP_DLSYM(
"_Offload_number_of_devices"))) {
966 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IS_INITIAL_DEVICE)(void)
967 KMP_WEAK_ATTRIBUTE_EXTERNAL;
968 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IS_INITIAL_DEVICE)(void) {
973 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)(void)
974 KMP_WEAK_ATTRIBUTE_EXTERNAL;
975 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)(void) {
977 return KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)();
980 #if defined(KMP_STUB)
983 void *FTN_STDCALL FTN_TARGET_ALLOC(
size_t size,
int device_num) {
return 0; }
985 void FTN_STDCALL FTN_TARGET_FREE(
void *device_ptr,
int device_num) {}
987 int FTN_STDCALL FTN_TARGET_IS_PRESENT(
void *ptr,
int device_num) {
return 0; }
989 int FTN_STDCALL FTN_TARGET_MEMCPY(
void *dst,
void *src,
size_t length,
990 size_t dst_offset,
size_t src_offset,
991 int dst_device,
int src_device) {
995 int FTN_STDCALL FTN_TARGET_MEMCPY_RECT(
996 void *dst,
void *src,
size_t element_size,
int num_dims,
997 const size_t *volume,
const size_t *dst_offsets,
const size_t *src_offsets,
998 const size_t *dst_dimensions,
const size_t *src_dimensions,
int dst_device,
1003 int FTN_STDCALL FTN_TARGET_ASSOCIATE_PTR(
void *host_ptr,
void *device_ptr,
1004 size_t size,
size_t device_offset,
1009 int FTN_STDCALL FTN_TARGET_DISASSOCIATE_PTR(
void *host_ptr,
int device_num) {
1015 typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
1018 #if KMP_USE_DYNAMIC_LOCK
1019 void FTN_STDCALL FTN_INIT_LOCK_WITH_HINT(
void **user_lock,
1020 uintptr_t KMP_DEREF hint) {
1022 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1024 int gtid = __kmp_entry_gtid();
1025 #if OMPT_SUPPORT && OMPT_OPTIONAL
1026 OMPT_STORE_RETURN_ADDRESS(gtid);
1028 __kmpc_init_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1032 void FTN_STDCALL FTN_INIT_NEST_LOCK_WITH_HINT(
void **user_lock,
1033 uintptr_t KMP_DEREF hint) {
1035 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1037 int gtid = __kmp_entry_gtid();
1038 #if OMPT_SUPPORT && OMPT_OPTIONAL
1039 OMPT_STORE_RETURN_ADDRESS(gtid);
1041 __kmpc_init_nest_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1047 void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_LOCK)(
void **user_lock) {
1049 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1051 int gtid = __kmp_entry_gtid();
1052 #if OMPT_SUPPORT && OMPT_OPTIONAL
1053 OMPT_STORE_RETURN_ADDRESS(gtid);
1055 __kmpc_init_lock(NULL, gtid, user_lock);
1060 void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_NEST_LOCK)(
void **user_lock) {
1062 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1064 int gtid = __kmp_entry_gtid();
1065 #if OMPT_SUPPORT && OMPT_OPTIONAL
1066 OMPT_STORE_RETURN_ADDRESS(gtid);
1068 __kmpc_init_nest_lock(NULL, gtid, user_lock);
1072 void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_LOCK)(
void **user_lock) {
1074 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1076 int gtid = __kmp_entry_gtid();
1077 #if OMPT_SUPPORT && OMPT_OPTIONAL
1078 OMPT_STORE_RETURN_ADDRESS(gtid);
1080 __kmpc_destroy_lock(NULL, gtid, user_lock);
1084 void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_NEST_LOCK)(
void **user_lock) {
1086 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1088 int gtid = __kmp_entry_gtid();
1089 #if OMPT_SUPPORT && OMPT_OPTIONAL
1090 OMPT_STORE_RETURN_ADDRESS(gtid);
1092 __kmpc_destroy_nest_lock(NULL, gtid, user_lock);
1096 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_LOCK)(
void **user_lock) {
1098 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1101 if (*((kmp_stub_lock_t *)user_lock) != UNLOCKED) {
1104 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1106 int gtid = __kmp_entry_gtid();
1107 #if OMPT_SUPPORT && OMPT_OPTIONAL
1108 OMPT_STORE_RETURN_ADDRESS(gtid);
1110 __kmpc_set_lock(NULL, gtid, user_lock);
1114 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NEST_LOCK)(
void **user_lock) {
1116 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1119 (*((
int *)user_lock))++;
1121 int gtid = __kmp_entry_gtid();
1122 #if OMPT_SUPPORT && OMPT_OPTIONAL
1123 OMPT_STORE_RETURN_ADDRESS(gtid);
1125 __kmpc_set_nest_lock(NULL, gtid, user_lock);
1129 void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_LOCK)(
void **user_lock) {
1131 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1134 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1137 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1139 int gtid = __kmp_entry_gtid();
1140 #if OMPT_SUPPORT && OMPT_OPTIONAL
1141 OMPT_STORE_RETURN_ADDRESS(gtid);
1143 __kmpc_unset_lock(NULL, gtid, user_lock);
1147 void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_NEST_LOCK)(
void **user_lock) {
1149 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1152 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1155 (*((
int *)user_lock))--;
1157 int gtid = __kmp_entry_gtid();
1158 #if OMPT_SUPPORT && OMPT_OPTIONAL
1159 OMPT_STORE_RETURN_ADDRESS(gtid);
1161 __kmpc_unset_nest_lock(NULL, gtid, user_lock);
1165 int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_LOCK)(
void **user_lock) {
1167 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1170 if (*((kmp_stub_lock_t *)user_lock) == LOCKED) {
1173 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1176 int gtid = __kmp_entry_gtid();
1177 #if OMPT_SUPPORT && OMPT_OPTIONAL
1178 OMPT_STORE_RETURN_ADDRESS(gtid);
1180 return __kmpc_test_lock(NULL, gtid, user_lock);
1184 int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_NEST_LOCK)(
void **user_lock) {
1186 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1189 return ++(*((
int *)user_lock));
1191 int gtid = __kmp_entry_gtid();
1192 #if OMPT_SUPPORT && OMPT_OPTIONAL
1193 OMPT_STORE_RETURN_ADDRESS(gtid);
1195 return __kmpc_test_nest_lock(NULL, gtid, user_lock);
1199 double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTIME)(void) {
1201 return __kmps_get_wtime();
1207 if (!__kmp_init_serial) {
1208 __kmp_serial_initialize();
1211 __kmp_elapsed(&data);
1216 double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTICK)(void) {
1218 return __kmps_get_wtick();
1221 if (!__kmp_init_serial) {
1222 __kmp_serial_initialize();
1224 __kmp_elapsed_tick(&data);
1231 void *FTN_STDCALL FTN_MALLOC(
size_t KMP_DEREF size) {
1233 return kmpc_malloc(KMP_DEREF size);
1236 void *FTN_STDCALL FTN_ALIGNED_MALLOC(
size_t KMP_DEREF size,
1237 size_t KMP_DEREF alignment) {
1239 return kmpc_aligned_malloc(KMP_DEREF size, KMP_DEREF alignment);
1242 void *FTN_STDCALL FTN_CALLOC(
size_t KMP_DEREF nelem,
size_t KMP_DEREF elsize) {
1244 return kmpc_calloc(KMP_DEREF nelem, KMP_DEREF elsize);
1247 void *FTN_STDCALL FTN_REALLOC(
void *KMP_DEREF ptr,
size_t KMP_DEREF size) {
1249 return kmpc_realloc(KMP_DEREF ptr, KMP_DEREF size);
1252 void FTN_STDCALL FTN_KFREE(
void *KMP_DEREF ptr) {
1254 kmpc_free(KMP_DEREF ptr);
1257 void FTN_STDCALL FTN_SET_WARNINGS_ON(
void) {
1259 __kmp_generate_warnings = kmp_warnings_explicit;
1263 void FTN_STDCALL FTN_SET_WARNINGS_OFF(
void) {
1265 __kmp_generate_warnings = FALSE;
1269 void FTN_STDCALL FTN_SET_DEFAULTS(
char const *str
1270 #ifndef PASS_ARGS_BY_VALUE
1276 #ifdef PASS_ARGS_BY_VALUE
1277 int len = (int)KMP_STRLEN(str);
1279 __kmp_aux_set_defaults(str, len);
1286 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_CANCELLATION)(void) {
1291 if (!__kmp_init_serial) {
1292 __kmp_serial_initialize();
1294 return __kmp_omp_cancellation;
1298 int FTN_STDCALL FTN_GET_CANCELLATION_STATUS(
int cancel_kind) {
1302 return __kmp_get_cancellation_status(cancel_kind);
1307 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_TASK_PRIORITY)(void) {
1311 if (!__kmp_init_serial) {
1312 __kmp_serial_initialize();
1314 return __kmp_max_task_priority;
1321 int FTN_STDCALL FTN_GET_DEVICE_NUM(
void) KMP_WEAK_ATTRIBUTE_EXTERNAL;
1322 int FTN_STDCALL FTN_GET_DEVICE_NUM(
void) {
1323 return KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)();
1327 int FTN_STDCALL FTN_PAUSE_RESOURCE(kmp_pause_status_t kind,
int device_num) {
1331 if (device_num == KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)())
1332 return __kmpc_pause_resource(kind);
1334 int (*fptr)(kmp_pause_status_t, int);
1335 if ((*(
void **)(&fptr) = KMP_DLSYM(
"tgt_pause_resource")))
1336 return (*fptr)(kind, device_num);
1344 int FTN_STDCALL FTN_PAUSE_RESOURCE_ALL(kmp_pause_status_t kind) {
1349 int (*fptr)(kmp_pause_status_t, int);
1350 if ((*(
void **)(&fptr) = KMP_DLSYM(
"tgt_pause_resource")))
1351 fails = (*fptr)(kind, KMP_DEVICE_ALL);
1352 fails += __kmpc_pause_resource(kind);
1358 int FTN_STDCALL FTN_GET_SUPPORTED_ACTIVE_LEVELS(
void) {
1362 return KMP_MAX_ACTIVE_LEVELS_LIMIT;
1366 void FTN_STDCALL FTN_FULFILL_EVENT(kmp_event_t *event) {
1368 __kmp_fulfill_event(event);
1373 void FTN_STDCALL FTN_SET_NUM_TEAMS(
int KMP_DEREF num_teams) {
1377 if (!__kmp_init_serial) {
1378 __kmp_serial_initialize();
1380 __kmp_set_num_teams(KMP_DEREF num_teams);
1383 int FTN_STDCALL FTN_GET_MAX_TEAMS(
void) {
1387 if (!__kmp_init_serial) {
1388 __kmp_serial_initialize();
1390 return __kmp_get_max_teams();
1394 void FTN_STDCALL FTN_SET_TEAMS_THREAD_LIMIT(
int KMP_DEREF limit) {
1398 if (!__kmp_init_serial) {
1399 __kmp_serial_initialize();
1401 __kmp_set_teams_thread_limit(KMP_DEREF limit);
1404 int FTN_STDCALL FTN_GET_TEAMS_THREAD_LIMIT(
void) {
1408 if (!__kmp_init_serial) {
1409 __kmp_serial_initialize();
1411 return __kmp_get_teams_thread_limit();
1416 void FTN_STDCALL FTN_DISPLAY_ENV(
int verbose) {
1418 __kmp_omp_display_env(verbose);
1423 #ifdef KMP_USE_VERSION_SYMBOLS
1445 KMP_VERSION_SYMBOL(FTN_SET_NUM_THREADS, 10,
"OMP_1.0");
1446 KMP_VERSION_SYMBOL(FTN_GET_NUM_THREADS, 10,
"OMP_1.0");
1447 KMP_VERSION_SYMBOL(FTN_GET_MAX_THREADS, 10,
"OMP_1.0");
1448 KMP_VERSION_SYMBOL(FTN_GET_THREAD_NUM, 10,
"OMP_1.0");
1449 KMP_VERSION_SYMBOL(FTN_GET_NUM_PROCS, 10,
"OMP_1.0");
1450 KMP_VERSION_SYMBOL(FTN_IN_PARALLEL, 10,
"OMP_1.0");
1451 KMP_VERSION_SYMBOL(FTN_SET_DYNAMIC, 10,
"OMP_1.0");
1452 KMP_VERSION_SYMBOL(FTN_GET_DYNAMIC, 10,
"OMP_1.0");
1453 KMP_VERSION_SYMBOL(FTN_SET_NESTED, 10,
"OMP_1.0");
1454 KMP_VERSION_SYMBOL(FTN_GET_NESTED, 10,
"OMP_1.0");
1455 KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 10,
"OMP_1.0");
1456 KMP_VERSION_SYMBOL(FTN_INIT_NEST_LOCK, 10,
"OMP_1.0");
1457 KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 10,
"OMP_1.0");
1458 KMP_VERSION_SYMBOL(FTN_DESTROY_NEST_LOCK, 10,
"OMP_1.0");
1459 KMP_VERSION_SYMBOL(FTN_SET_LOCK, 10,
"OMP_1.0");
1460 KMP_VERSION_SYMBOL(FTN_SET_NEST_LOCK, 10,
"OMP_1.0");
1461 KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 10,
"OMP_1.0");
1462 KMP_VERSION_SYMBOL(FTN_UNSET_NEST_LOCK, 10,
"OMP_1.0");
1463 KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 10,
"OMP_1.0");
1464 KMP_VERSION_SYMBOL(FTN_TEST_NEST_LOCK, 10,
"OMP_1.0");
1467 KMP_VERSION_SYMBOL(FTN_GET_WTICK, 20,
"OMP_2.0");
1468 KMP_VERSION_SYMBOL(FTN_GET_WTIME, 20,
"OMP_2.0");
1471 KMP_VERSION_SYMBOL(FTN_SET_SCHEDULE, 30,
"OMP_3.0");
1472 KMP_VERSION_SYMBOL(FTN_GET_SCHEDULE, 30,
"OMP_3.0");
1473 KMP_VERSION_SYMBOL(FTN_GET_THREAD_LIMIT, 30,
"OMP_3.0");
1474 KMP_VERSION_SYMBOL(FTN_SET_MAX_ACTIVE_LEVELS, 30,
"OMP_3.0");
1475 KMP_VERSION_SYMBOL(FTN_GET_MAX_ACTIVE_LEVELS, 30,
"OMP_3.0");
1476 KMP_VERSION_SYMBOL(FTN_GET_ANCESTOR_THREAD_NUM, 30,
"OMP_3.0");
1477 KMP_VERSION_SYMBOL(FTN_GET_LEVEL, 30,
"OMP_3.0");
1478 KMP_VERSION_SYMBOL(FTN_GET_TEAM_SIZE, 30,
"OMP_3.0");
1479 KMP_VERSION_SYMBOL(FTN_GET_ACTIVE_LEVEL, 30,
"OMP_3.0");
1482 KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 30,
"OMP_3.0");
1483 KMP_VERSION_SYMBOL(FTN_INIT_NEST_LOCK, 30,
"OMP_3.0");
1484 KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 30,
"OMP_3.0");
1485 KMP_VERSION_SYMBOL(FTN_DESTROY_NEST_LOCK, 30,
"OMP_3.0");
1486 KMP_VERSION_SYMBOL(FTN_SET_LOCK, 30,
"OMP_3.0");
1487 KMP_VERSION_SYMBOL(FTN_SET_NEST_LOCK, 30,
"OMP_3.0");
1488 KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 30,
"OMP_3.0");
1489 KMP_VERSION_SYMBOL(FTN_UNSET_NEST_LOCK, 30,
"OMP_3.0");
1490 KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 30,
"OMP_3.0");
1491 KMP_VERSION_SYMBOL(FTN_TEST_NEST_LOCK, 30,
"OMP_3.0");
1494 KMP_VERSION_SYMBOL(FTN_IN_FINAL, 31,
"OMP_3.1");
1497 KMP_VERSION_SYMBOL(FTN_GET_PROC_BIND, 40,
"OMP_4.0");
1498 KMP_VERSION_SYMBOL(FTN_GET_NUM_TEAMS, 40,
"OMP_4.0");
1499 KMP_VERSION_SYMBOL(FTN_GET_TEAM_NUM, 40,
"OMP_4.0");
1500 KMP_VERSION_SYMBOL(FTN_GET_CANCELLATION, 40,
"OMP_4.0");
1501 KMP_VERSION_SYMBOL(FTN_GET_DEFAULT_DEVICE, 40,
"OMP_4.0");
1502 KMP_VERSION_SYMBOL(FTN_SET_DEFAULT_DEVICE, 40,
"OMP_4.0");
1503 KMP_VERSION_SYMBOL(FTN_IS_INITIAL_DEVICE, 40,
"OMP_4.0");
1504 KMP_VERSION_SYMBOL(FTN_GET_NUM_DEVICES, 40,
"OMP_4.0");
1507 KMP_VERSION_SYMBOL(FTN_GET_MAX_TASK_PRIORITY, 45,
"OMP_4.5");
1508 KMP_VERSION_SYMBOL(FTN_GET_NUM_PLACES, 45,
"OMP_4.5");
1509 KMP_VERSION_SYMBOL(FTN_GET_PLACE_NUM_PROCS, 45,
"OMP_4.5");
1510 KMP_VERSION_SYMBOL(FTN_GET_PLACE_PROC_IDS, 45,
"OMP_4.5");
1511 KMP_VERSION_SYMBOL(FTN_GET_PLACE_NUM, 45,
"OMP_4.5");
1512 KMP_VERSION_SYMBOL(FTN_GET_PARTITION_NUM_PLACES, 45,
"OMP_4.5");
1513 KMP_VERSION_SYMBOL(FTN_GET_PARTITION_PLACE_NUMS, 45,
"OMP_4.5");
1514 KMP_VERSION_SYMBOL(FTN_GET_INITIAL_DEVICE, 45,
"OMP_4.5");
KMP_EXPORT kmp_int32 __kmpc_bound_num_threads(ident_t *)