14 #error The support file kmp_ftn_entry.h should not be compiled by itself.
30 #include "ompt-specific.h"
45 #ifdef KMP_GOMP_COMPAT
46 #if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_UPPER)
47 #define PASS_ARGS_BY_VALUE 1
51 #if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_APPEND)
52 #define PASS_ARGS_BY_VALUE 1
57 #ifdef PASS_ARGS_BY_VALUE
63 void FTN_STDCALL FTN_SET_STACKSIZE(
int KMP_DEREF arg) {
65 __kmps_set_stacksize(KMP_DEREF arg);
68 __kmp_aux_set_stacksize((
size_t)KMP_DEREF arg);
72 void FTN_STDCALL FTN_SET_STACKSIZE_S(
size_t KMP_DEREF arg) {
74 __kmps_set_stacksize(KMP_DEREF arg);
77 __kmp_aux_set_stacksize(KMP_DEREF arg);
81 int FTN_STDCALL FTN_GET_STACKSIZE(
void) {
83 return __kmps_get_stacksize();
85 if (!__kmp_init_serial) {
86 __kmp_serial_initialize();
88 return (
int)__kmp_stksize;
92 size_t FTN_STDCALL FTN_GET_STACKSIZE_S(
void) {
94 return __kmps_get_stacksize();
96 if (!__kmp_init_serial) {
97 __kmp_serial_initialize();
103 void FTN_STDCALL FTN_SET_BLOCKTIME(
int KMP_DEREF arg) {
105 __kmps_set_blocktime(KMP_DEREF arg);
110 gtid = __kmp_entry_gtid();
111 tid = __kmp_tid_from_gtid(gtid);
112 thread = __kmp_thread_from_gtid(gtid);
114 __kmp_aux_set_blocktime(KMP_DEREF arg, thread, tid);
118 int FTN_STDCALL FTN_GET_BLOCKTIME(
void) {
120 return __kmps_get_blocktime();
126 gtid = __kmp_entry_gtid();
127 tid = __kmp_tid_from_gtid(gtid);
128 thread = __kmp_thread_from_gtid(gtid);
129 team = __kmp_threads[gtid]->th.th_team;
132 if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
133 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
134 team->t.t_id, tid, KMP_MAX_BLOCKTIME));
135 return KMP_MAX_BLOCKTIME;
137 #ifdef KMP_ADJUST_BLOCKTIME
138 else if (__kmp_zero_bt && !get__bt_set(team, tid)) {
139 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
140 team->t.t_id, tid, 0));
145 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
146 team->t.t_id, tid, get__blocktime(team, tid)));
147 return get__blocktime(team, tid);
152 void FTN_STDCALL FTN_SET_LIBRARY_SERIAL(
void) {
154 __kmps_set_library(library_serial);
157 __kmp_user_set_library(library_serial);
161 void FTN_STDCALL FTN_SET_LIBRARY_TURNAROUND(
void) {
163 __kmps_set_library(library_turnaround);
166 __kmp_user_set_library(library_turnaround);
170 void FTN_STDCALL FTN_SET_LIBRARY_THROUGHPUT(
void) {
172 __kmps_set_library(library_throughput);
175 __kmp_user_set_library(library_throughput);
179 void FTN_STDCALL FTN_SET_LIBRARY(
int KMP_DEREF arg) {
181 __kmps_set_library(KMP_DEREF arg);
183 enum library_type lib;
184 lib = (
enum library_type)KMP_DEREF arg;
186 __kmp_user_set_library(lib);
190 int FTN_STDCALL FTN_GET_LIBRARY(
void) {
192 return __kmps_get_library();
194 if (!__kmp_init_serial) {
195 __kmp_serial_initialize();
197 return ((
int)__kmp_library);
201 void FTN_STDCALL FTN_SET_DISP_NUM_BUFFERS(
int KMP_DEREF arg) {
207 if (__kmp_init_serial == 0 && (KMP_DEREF arg) > 0)
208 __kmp_dispatch_num_buffers = KMP_DEREF arg;
212 int FTN_STDCALL FTN_SET_AFFINITY(
void **mask) {
213 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
216 if (!TCR_4(__kmp_init_middle)) {
217 __kmp_middle_initialize();
219 return __kmp_aux_set_affinity(mask);
223 int FTN_STDCALL FTN_GET_AFFINITY(
void **mask) {
224 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
227 if (!TCR_4(__kmp_init_middle)) {
228 __kmp_middle_initialize();
230 return __kmp_aux_get_affinity(mask);
234 int FTN_STDCALL FTN_GET_AFFINITY_MAX_PROC(
void) {
235 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
239 if (!TCR_4(__kmp_init_middle)) {
240 __kmp_middle_initialize();
242 return __kmp_aux_get_affinity_max_proc();
246 void FTN_STDCALL FTN_CREATE_AFFINITY_MASK(
void **mask) {
247 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
251 kmp_affin_mask_t *mask_internals;
252 if (!TCR_4(__kmp_init_middle)) {
253 __kmp_middle_initialize();
255 mask_internals = __kmp_affinity_dispatch->allocate_mask();
256 KMP_CPU_ZERO(mask_internals);
257 *mask = mask_internals;
261 void FTN_STDCALL FTN_DESTROY_AFFINITY_MASK(
void **mask) {
262 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
266 kmp_affin_mask_t *mask_internals;
267 if (!TCR_4(__kmp_init_middle)) {
268 __kmp_middle_initialize();
270 if (__kmp_env_consistency_check) {
272 KMP_FATAL(AffinityInvalidMask,
"kmp_destroy_affinity_mask");
275 mask_internals = (kmp_affin_mask_t *)(*mask);
276 __kmp_affinity_dispatch->deallocate_mask(mask_internals);
281 int FTN_STDCALL FTN_SET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
282 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
285 if (!TCR_4(__kmp_init_middle)) {
286 __kmp_middle_initialize();
288 return __kmp_aux_set_affinity_mask_proc(KMP_DEREF proc, mask);
292 int FTN_STDCALL FTN_UNSET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
293 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
296 if (!TCR_4(__kmp_init_middle)) {
297 __kmp_middle_initialize();
299 return __kmp_aux_unset_affinity_mask_proc(KMP_DEREF proc, mask);
303 int FTN_STDCALL FTN_GET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
304 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
307 if (!TCR_4(__kmp_init_middle)) {
308 __kmp_middle_initialize();
310 return __kmp_aux_get_affinity_mask_proc(KMP_DEREF proc, mask);
317 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NUM_THREADS)(
int KMP_DEREF arg) {
321 __kmp_set_num_threads(KMP_DEREF arg, __kmp_entry_gtid());
326 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_THREADS)(void) {
335 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_THREADS)(void) {
341 if (!TCR_4(__kmp_init_middle)) {
342 __kmp_middle_initialize();
344 gtid = __kmp_entry_gtid();
345 thread = __kmp_threads[gtid];
348 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);
531 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
537 #if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
538 KMP_OS_HURD || KMP_OS_KFREEBSD
539 gtid = __kmp_entry_gtid();
541 if (!__kmp_init_parallel ||
542 (gtid = (
int)((kmp_intptr_t)TlsGetValue(__kmp_gtid_threadprivate_key))) ==
550 #ifdef KMP_TDATA_GTID
551 if (__kmp_gtid_mode >= 3) {
552 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
557 if (!__kmp_init_parallel ||
558 (gtid = (kmp_intptr_t)(
559 pthread_getspecific(__kmp_gtid_threadprivate_key))) == 0) {
563 #ifdef KMP_TDATA_GTID
567 #error Unknown or unsupported OS
570 return __kmp_tid_from_gtid(gtid);
574 int FTN_STDCALL FTN_GET_NUM_KNOWN_THREADS(
void) {
578 if (!__kmp_init_serial) {
579 __kmp_serial_initialize();
583 return TCR_4(__kmp_nth);
587 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PROCS)(void) {
591 if (!TCR_4(__kmp_init_middle)) {
592 __kmp_middle_initialize();
594 return __kmp_avail_proc;
598 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NESTED)(
int KMP_DEREF flag) {
599 KMP_INFORM(APIDeprecated,
"omp_set_nested",
"omp_set_max_active_levels");
601 __kmps_set_nested(KMP_DEREF flag);
605 thread = __kmp_entry_thread();
606 __kmp_save_internal_controls(thread);
608 int max_active_levels = get__max_active_levels(thread);
609 if (max_active_levels == 1)
610 max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
611 set__max_active_levels(thread, (KMP_DEREF flag) ? max_active_levels : 1);
615 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NESTED)(void) {
616 KMP_INFORM(APIDeprecated,
"omp_get_nested",
"omp_get_max_active_levels");
618 return __kmps_get_nested();
621 thread = __kmp_entry_thread();
622 return get__max_active_levels(thread) > 1;
626 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DYNAMIC)(
int KMP_DEREF flag) {
628 __kmps_set_dynamic(KMP_DEREF flag ? TRUE : FALSE);
632 thread = __kmp_entry_thread();
634 __kmp_save_internal_controls(thread);
635 set__dynamic(thread, KMP_DEREF flag ? TRUE : FALSE);
639 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DYNAMIC)(void) {
641 return __kmps_get_dynamic();
644 thread = __kmp_entry_thread();
645 return get__dynamic(thread);
649 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IN_PARALLEL)(void) {
653 kmp_info_t *th = __kmp_entry_thread();
655 if (th->th.th_teams_microtask) {
660 return (th->th.th_team->t.t_active_level ? 1 : 0);
663 return (th->th.th_root->r.r_in_parallel ? FTN_TRUE : FTN_FALSE);
667 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_SCHEDULE)(kmp_sched_t KMP_DEREF kind,
668 int KMP_DEREF modifier) {
670 __kmps_set_schedule(KMP_DEREF kind, KMP_DEREF modifier);
673 __kmp_set_schedule(__kmp_entry_gtid(), KMP_DEREF kind, KMP_DEREF modifier);
677 void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_SCHEDULE)(kmp_sched_t *kind,
680 __kmps_get_schedule(kind, modifier);
683 __kmp_get_schedule(__kmp_entry_gtid(), kind, modifier);
687 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_MAX_ACTIVE_LEVELS)(
int KMP_DEREF arg) {
692 __kmp_set_max_active_levels(__kmp_entry_gtid(), KMP_DEREF arg);
696 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_ACTIVE_LEVELS)(void) {
701 return __kmp_get_max_active_levels(__kmp_entry_gtid());
705 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_ACTIVE_LEVEL)(void) {
710 return __kmp_entry_thread()->th.th_team->t.t_active_level;
714 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_LEVEL)(void) {
719 return __kmp_entry_thread()->th.th_team->t.t_level;
724 KMP_EXPAND_NAME(FTN_GET_ANCESTOR_THREAD_NUM)(
int KMP_DEREF level) {
726 return (KMP_DEREF level) ? (-1) : (0);
728 return __kmp_get_ancestor_thread_num(__kmp_entry_gtid(), KMP_DEREF level);
732 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_TEAM_SIZE)(
int KMP_DEREF level) {
734 return (KMP_DEREF level) ? (-1) : (1);
736 return __kmp_get_team_size(__kmp_entry_gtid(), KMP_DEREF level);
740 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_LIMIT)(void) {
746 if (!__kmp_init_serial) {
747 __kmp_serial_initialize();
750 gtid = __kmp_entry_gtid();
751 thread = __kmp_threads[gtid];
752 return thread->th.th_current_task->td_icvs.thread_limit;
756 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IN_FINAL)(void) {
760 if (!TCR_4(__kmp_init_parallel)) {
763 return __kmp_entry_thread()->th.th_current_task->td_flags.final;
769 kmp_proc_bind_t FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PROC_BIND)(void) {
771 return __kmps_get_proc_bind();
773 return get__proc_bind(__kmp_entry_thread());
778 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PLACES)(void) {
779 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
782 if (!TCR_4(__kmp_init_middle)) {
783 __kmp_middle_initialize();
785 if (!KMP_AFFINITY_CAPABLE())
787 return __kmp_affinity_num_masks;
791 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM_PROCS)(
int place_num) {
792 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
797 if (!TCR_4(__kmp_init_middle)) {
798 __kmp_middle_initialize();
800 if (!KMP_AFFINITY_CAPABLE())
802 if (place_num < 0 || place_num >= (
int)__kmp_affinity_num_masks)
804 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
805 KMP_CPU_SET_ITERATE(i, mask) {
806 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
807 (!KMP_CPU_ISSET(i, mask))) {
816 void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_PROC_IDS)(
int place_num,
818 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
822 if (!TCR_4(__kmp_init_middle)) {
823 __kmp_middle_initialize();
825 if (!KMP_AFFINITY_CAPABLE())
827 if (place_num < 0 || place_num >= (
int)__kmp_affinity_num_masks)
829 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
831 KMP_CPU_SET_ITERATE(i, mask) {
832 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
833 (!KMP_CPU_ISSET(i, mask))) {
841 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM)(void) {
842 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
847 if (!TCR_4(__kmp_init_middle)) {
848 __kmp_middle_initialize();
850 if (!KMP_AFFINITY_CAPABLE())
852 gtid = __kmp_entry_gtid();
853 thread = __kmp_thread_from_gtid(gtid);
854 if (thread->th.th_current_place < 0)
856 return thread->th.th_current_place;
860 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PARTITION_NUM_PLACES)(void) {
861 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
864 int gtid, num_places, first_place, last_place;
866 if (!TCR_4(__kmp_init_middle)) {
867 __kmp_middle_initialize();
869 if (!KMP_AFFINITY_CAPABLE())
871 gtid = __kmp_entry_gtid();
872 thread = __kmp_thread_from_gtid(gtid);
873 first_place = thread->th.th_first_place;
874 last_place = thread->th.th_last_place;
875 if (first_place < 0 || last_place < 0)
877 if (first_place <= last_place)
878 num_places = last_place - first_place + 1;
880 num_places = __kmp_affinity_num_masks - first_place + last_place + 1;
886 FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PARTITION_PLACE_NUMS)(
int *place_nums) {
887 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED
890 int i, gtid, place_num, first_place, last_place, start, end;
892 if (!TCR_4(__kmp_init_middle)) {
893 __kmp_middle_initialize();
895 if (!KMP_AFFINITY_CAPABLE())
897 gtid = __kmp_entry_gtid();
898 thread = __kmp_thread_from_gtid(gtid);
899 first_place = thread->th.th_first_place;
900 last_place = thread->th.th_last_place;
901 if (first_place < 0 || last_place < 0)
903 if (first_place <= last_place) {
910 for (i = 0, place_num = start; place_num <= end; ++place_num, ++i) {
911 place_nums[i] = place_num;
917 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_TEAMS)(void) {
921 return __kmp_aux_get_num_teams();
925 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_TEAM_NUM)(void) {
929 return __kmp_aux_get_team_num();
933 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DEFAULT_DEVICE)(void) {
934 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
937 return __kmp_entry_thread()->th.th_current_task->td_icvs.default_device;
941 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DEFAULT_DEVICE)(
int KMP_DEREF arg) {
942 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
945 __kmp_entry_thread()->th.th_current_task->td_icvs.default_device =
952 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void) KMP_WEAK_ATTRIBUTE;
953 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void) {
954 #if KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB)
958 if ((*(
void **)(&fptr) = dlsym(RTLD_DEFAULT,
"_Offload_number_of_devices"))) {
960 }
else if ((*(
void **)(&fptr) = dlsym(RTLD_NEXT,
"omp_get_num_devices"))) {
965 #endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB)
970 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IS_INITIAL_DEVICE)(void) KMP_WEAK_ATTRIBUTE;
971 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IS_INITIAL_DEVICE)(void) {
975 #endif // OMP_40_ENABLED
981 int FTN_STDCALL FTN_GET_INITIAL_DEVICE(
void) KMP_WEAK_ATTRIBUTE;
982 int FTN_STDCALL FTN_GET_INITIAL_DEVICE(
void) {
983 #if KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB)
984 return KMP_HOST_DEVICE;
987 if ((*(
void **)(&fptr) = dlsym(RTLD_NEXT,
"omp_get_initial_device"))) {
990 return KMP_HOST_DEVICE;
995 #if defined(KMP_STUB)
998 void *FTN_STDCALL FTN_TARGET_ALLOC(
size_t size,
int device_num) {
return 0; }
1000 void FTN_STDCALL FTN_TARGET_FREE(
void *device_ptr,
int device_num) {}
1002 int FTN_STDCALL FTN_TARGET_IS_PRESENT(
void *ptr,
int device_num) {
return 0; }
1004 int FTN_STDCALL FTN_TARGET_MEMCPY(
void *dst,
void *src,
size_t length,
1005 size_t dst_offset,
size_t src_offset,
1006 int dst_device,
int src_device) {
1010 int FTN_STDCALL FTN_TARGET_MEMCPY_RECT(
1011 void *dst,
void *src,
size_t element_size,
int num_dims,
1012 const size_t *volume,
const size_t *dst_offsets,
const size_t *src_offsets,
1013 const size_t *dst_dimensions,
const size_t *src_dimensions,
int dst_device,
1018 int FTN_STDCALL FTN_TARGET_ASSOCIATE_PTR(
void *host_ptr,
void *device_ptr,
1019 size_t size,
size_t device_offset,
1024 int FTN_STDCALL FTN_TARGET_DISASSOCIATE_PTR(
void *host_ptr,
int device_num) {
1027 #endif // defined(KMP_STUB)
1028 #endif // OMP_45_ENABLED
1031 typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
1034 #if KMP_USE_DYNAMIC_LOCK
1035 void FTN_STDCALL FTN_INIT_LOCK_WITH_HINT(
void **user_lock,
1036 uintptr_t KMP_DEREF hint) {
1038 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1040 int gtid = __kmp_entry_gtid();
1041 #if OMPT_SUPPORT && OMPT_OPTIONAL
1042 OMPT_STORE_RETURN_ADDRESS(gtid);
1044 __kmpc_init_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1048 void FTN_STDCALL FTN_INIT_NEST_LOCK_WITH_HINT(
void **user_lock,
1049 uintptr_t KMP_DEREF hint) {
1051 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1053 int gtid = __kmp_entry_gtid();
1054 #if OMPT_SUPPORT && OMPT_OPTIONAL
1055 OMPT_STORE_RETURN_ADDRESS(gtid);
1057 __kmpc_init_nest_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1063 void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_LOCK)(
void **user_lock) {
1065 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1067 int gtid = __kmp_entry_gtid();
1068 #if OMPT_SUPPORT && OMPT_OPTIONAL
1069 OMPT_STORE_RETURN_ADDRESS(gtid);
1071 __kmpc_init_lock(NULL, gtid, user_lock);
1076 void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_NEST_LOCK)(
void **user_lock) {
1078 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1080 int gtid = __kmp_entry_gtid();
1081 #if OMPT_SUPPORT && OMPT_OPTIONAL
1082 OMPT_STORE_RETURN_ADDRESS(gtid);
1084 __kmpc_init_nest_lock(NULL, gtid, user_lock);
1088 void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_LOCK)(
void **user_lock) {
1090 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1092 int gtid = __kmp_entry_gtid();
1093 #if OMPT_SUPPORT && OMPT_OPTIONAL
1094 OMPT_STORE_RETURN_ADDRESS(gtid);
1096 __kmpc_destroy_lock(NULL, gtid, user_lock);
1100 void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_NEST_LOCK)(
void **user_lock) {
1102 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1104 int gtid = __kmp_entry_gtid();
1105 #if OMPT_SUPPORT && OMPT_OPTIONAL
1106 OMPT_STORE_RETURN_ADDRESS(gtid);
1108 __kmpc_destroy_nest_lock(NULL, gtid, user_lock);
1112 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_LOCK)(
void **user_lock) {
1114 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1117 if (*((kmp_stub_lock_t *)user_lock) != UNLOCKED) {
1120 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1122 int gtid = __kmp_entry_gtid();
1123 #if OMPT_SUPPORT && OMPT_OPTIONAL
1124 OMPT_STORE_RETURN_ADDRESS(gtid);
1126 __kmpc_set_lock(NULL, gtid, user_lock);
1130 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NEST_LOCK)(
void **user_lock) {
1132 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1135 (*((
int *)user_lock))++;
1137 int gtid = __kmp_entry_gtid();
1138 #if OMPT_SUPPORT && OMPT_OPTIONAL
1139 OMPT_STORE_RETURN_ADDRESS(gtid);
1141 __kmpc_set_nest_lock(NULL, gtid, user_lock);
1145 void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_LOCK)(
void **user_lock) {
1147 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1150 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1153 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1155 int gtid = __kmp_entry_gtid();
1156 #if OMPT_SUPPORT && OMPT_OPTIONAL
1157 OMPT_STORE_RETURN_ADDRESS(gtid);
1159 __kmpc_unset_lock(NULL, gtid, user_lock);
1163 void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_NEST_LOCK)(
void **user_lock) {
1165 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1168 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1171 (*((
int *)user_lock))--;
1173 int gtid = __kmp_entry_gtid();
1174 #if OMPT_SUPPORT && OMPT_OPTIONAL
1175 OMPT_STORE_RETURN_ADDRESS(gtid);
1177 __kmpc_unset_nest_lock(NULL, gtid, user_lock);
1181 int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_LOCK)(
void **user_lock) {
1183 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1186 if (*((kmp_stub_lock_t *)user_lock) == LOCKED) {
1189 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1192 int gtid = __kmp_entry_gtid();
1193 #if OMPT_SUPPORT && OMPT_OPTIONAL
1194 OMPT_STORE_RETURN_ADDRESS(gtid);
1196 return __kmpc_test_lock(NULL, gtid, user_lock);
1200 int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_NEST_LOCK)(
void **user_lock) {
1202 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1205 return ++(*((
int *)user_lock));
1207 int gtid = __kmp_entry_gtid();
1208 #if OMPT_SUPPORT && OMPT_OPTIONAL
1209 OMPT_STORE_RETURN_ADDRESS(gtid);
1211 return __kmpc_test_nest_lock(NULL, gtid, user_lock);
1215 double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTIME)(void) {
1217 return __kmps_get_wtime();
1223 if (!__kmp_init_serial) {
1224 __kmp_serial_initialize();
1227 __kmp_elapsed(&data);
1232 double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTICK)(void) {
1234 return __kmps_get_wtick();
1237 if (!__kmp_init_serial) {
1238 __kmp_serial_initialize();
1240 __kmp_elapsed_tick(&data);
1247 void *FTN_STDCALL FTN_MALLOC(
size_t KMP_DEREF size) {
1249 return kmpc_malloc(KMP_DEREF size);
1252 void *FTN_STDCALL FTN_ALIGNED_MALLOC(
size_t KMP_DEREF size,
1253 size_t KMP_DEREF alignment) {
1255 return kmpc_aligned_malloc(KMP_DEREF size, KMP_DEREF alignment);
1258 void *FTN_STDCALL FTN_CALLOC(
size_t KMP_DEREF nelem,
size_t KMP_DEREF elsize) {
1260 return kmpc_calloc(KMP_DEREF nelem, KMP_DEREF elsize);
1263 void *FTN_STDCALL FTN_REALLOC(
void *KMP_DEREF ptr,
size_t KMP_DEREF size) {
1265 return kmpc_realloc(KMP_DEREF ptr, KMP_DEREF size);
1268 void FTN_STDCALL FTN_KFREE(
void *KMP_DEREF ptr) {
1270 kmpc_free(KMP_DEREF ptr);
1273 void FTN_STDCALL FTN_SET_WARNINGS_ON(
void) {
1275 __kmp_generate_warnings = kmp_warnings_explicit;
1279 void FTN_STDCALL FTN_SET_WARNINGS_OFF(
void) {
1281 __kmp_generate_warnings = FALSE;
1285 void FTN_STDCALL FTN_SET_DEFAULTS(
char const *str
1286 #ifndef PASS_ARGS_BY_VALUE
1292 #ifdef PASS_ARGS_BY_VALUE
1293 int len = (int)KMP_STRLEN(str);
1295 __kmp_aux_set_defaults(str, len);
1303 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_CANCELLATION)(void) {
1308 if (!__kmp_init_serial) {
1309 __kmp_serial_initialize();
1311 return __kmp_omp_cancellation;
1315 int FTN_STDCALL FTN_GET_CANCELLATION_STATUS(
int cancel_kind) {
1319 return __kmp_get_cancellation_status(cancel_kind);
1323 #endif // OMP_40_ENABLED
1327 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_TASK_PRIORITY)(void) {
1331 if (!__kmp_init_serial) {
1332 __kmp_serial_initialize();
1334 return __kmp_max_task_priority;
1343 int FTN_STDCALL FTN_GET_DEVICE_NUM(
void) KMP_WEAK_ATTRIBUTE;
1344 int FTN_STDCALL FTN_GET_DEVICE_NUM(
void) {
return KMP_HOST_DEVICE; }
1347 int FTN_STDCALL FTN_PAUSE_RESOURCE(kmp_pause_status_t kind,
int device_num) {
1351 if (device_num == KMP_HOST_DEVICE)
1352 return __kmpc_pause_resource(kind);
1355 int (*fptr)(kmp_pause_status_t, int);
1356 if ((*(
void **)(&fptr) = dlsym(RTLD_DEFAULT,
"tgt_pause_resource")))
1357 return (*fptr)(kind, device_num);
1366 int FTN_STDCALL FTN_PAUSE_RESOURCE_ALL(kmp_pause_status_t kind) {
1372 int (*fptr)(kmp_pause_status_t, int);
1373 if ((*(
void **)(&fptr) = dlsym(RTLD_DEFAULT,
"tgt_pause_resource")))
1374 fails = (*fptr)(kind, KMP_DEVICE_ALL);
1376 fails += __kmpc_pause_resource(kind);
1382 int FTN_STDCALL FTN_GET_SUPPORTED_ACTIVE_LEVELS(
void) {
1386 return KMP_MAX_ACTIVE_LEVELS_LIMIT;
1390 #endif // OMP_50_ENABLED
1393 #ifdef KMP_USE_VERSION_SYMBOLS
1415 KMP_VERSION_SYMBOL(FTN_SET_NUM_THREADS, 10,
"OMP_1.0");
1416 KMP_VERSION_SYMBOL(FTN_GET_NUM_THREADS, 10,
"OMP_1.0");
1417 KMP_VERSION_SYMBOL(FTN_GET_MAX_THREADS, 10,
"OMP_1.0");
1418 KMP_VERSION_SYMBOL(FTN_GET_THREAD_NUM, 10,
"OMP_1.0");
1419 KMP_VERSION_SYMBOL(FTN_GET_NUM_PROCS, 10,
"OMP_1.0");
1420 KMP_VERSION_SYMBOL(FTN_IN_PARALLEL, 10,
"OMP_1.0");
1421 KMP_VERSION_SYMBOL(FTN_SET_DYNAMIC, 10,
"OMP_1.0");
1422 KMP_VERSION_SYMBOL(FTN_GET_DYNAMIC, 10,
"OMP_1.0");
1423 KMP_VERSION_SYMBOL(FTN_SET_NESTED, 10,
"OMP_1.0");
1424 KMP_VERSION_SYMBOL(FTN_GET_NESTED, 10,
"OMP_1.0");
1425 KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 10,
"OMP_1.0");
1426 KMP_VERSION_SYMBOL(FTN_INIT_NEST_LOCK, 10,
"OMP_1.0");
1427 KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 10,
"OMP_1.0");
1428 KMP_VERSION_SYMBOL(FTN_DESTROY_NEST_LOCK, 10,
"OMP_1.0");
1429 KMP_VERSION_SYMBOL(FTN_SET_LOCK, 10,
"OMP_1.0");
1430 KMP_VERSION_SYMBOL(FTN_SET_NEST_LOCK, 10,
"OMP_1.0");
1431 KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 10,
"OMP_1.0");
1432 KMP_VERSION_SYMBOL(FTN_UNSET_NEST_LOCK, 10,
"OMP_1.0");
1433 KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 10,
"OMP_1.0");
1434 KMP_VERSION_SYMBOL(FTN_TEST_NEST_LOCK, 10,
"OMP_1.0");
1437 KMP_VERSION_SYMBOL(FTN_GET_WTICK, 20,
"OMP_2.0");
1438 KMP_VERSION_SYMBOL(FTN_GET_WTIME, 20,
"OMP_2.0");
1441 KMP_VERSION_SYMBOL(FTN_SET_SCHEDULE, 30,
"OMP_3.0");
1442 KMP_VERSION_SYMBOL(FTN_GET_SCHEDULE, 30,
"OMP_3.0");
1443 KMP_VERSION_SYMBOL(FTN_GET_THREAD_LIMIT, 30,
"OMP_3.0");
1444 KMP_VERSION_SYMBOL(FTN_SET_MAX_ACTIVE_LEVELS, 30,
"OMP_3.0");
1445 KMP_VERSION_SYMBOL(FTN_GET_MAX_ACTIVE_LEVELS, 30,
"OMP_3.0");
1446 KMP_VERSION_SYMBOL(FTN_GET_ANCESTOR_THREAD_NUM, 30,
"OMP_3.0");
1447 KMP_VERSION_SYMBOL(FTN_GET_LEVEL, 30,
"OMP_3.0");
1448 KMP_VERSION_SYMBOL(FTN_GET_TEAM_SIZE, 30,
"OMP_3.0");
1449 KMP_VERSION_SYMBOL(FTN_GET_ACTIVE_LEVEL, 30,
"OMP_3.0");
1452 KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 30,
"OMP_3.0");
1453 KMP_VERSION_SYMBOL(FTN_INIT_NEST_LOCK, 30,
"OMP_3.0");
1454 KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 30,
"OMP_3.0");
1455 KMP_VERSION_SYMBOL(FTN_DESTROY_NEST_LOCK, 30,
"OMP_3.0");
1456 KMP_VERSION_SYMBOL(FTN_SET_LOCK, 30,
"OMP_3.0");
1457 KMP_VERSION_SYMBOL(FTN_SET_NEST_LOCK, 30,
"OMP_3.0");
1458 KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 30,
"OMP_3.0");
1459 KMP_VERSION_SYMBOL(FTN_UNSET_NEST_LOCK, 30,
"OMP_3.0");
1460 KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 30,
"OMP_3.0");
1461 KMP_VERSION_SYMBOL(FTN_TEST_NEST_LOCK, 30,
"OMP_3.0");
1464 KMP_VERSION_SYMBOL(FTN_IN_FINAL, 31,
"OMP_3.1");
1468 KMP_VERSION_SYMBOL(FTN_GET_PROC_BIND, 40,
"OMP_4.0");
1469 KMP_VERSION_SYMBOL(FTN_GET_NUM_TEAMS, 40,
"OMP_4.0");
1470 KMP_VERSION_SYMBOL(FTN_GET_TEAM_NUM, 40,
"OMP_4.0");
1471 KMP_VERSION_SYMBOL(FTN_GET_CANCELLATION, 40,
"OMP_4.0");
1472 KMP_VERSION_SYMBOL(FTN_GET_DEFAULT_DEVICE, 40,
"OMP_4.0");
1473 KMP_VERSION_SYMBOL(FTN_SET_DEFAULT_DEVICE, 40,
"OMP_4.0");
1474 KMP_VERSION_SYMBOL(FTN_IS_INITIAL_DEVICE, 40,
"OMP_4.0");
1475 KMP_VERSION_SYMBOL(FTN_GET_NUM_DEVICES, 40,
"OMP_4.0");
1480 KMP_VERSION_SYMBOL(FTN_GET_MAX_TASK_PRIORITY, 45,
"OMP_4.5");
1481 KMP_VERSION_SYMBOL(FTN_GET_NUM_PLACES, 45,
"OMP_4.5");
1482 KMP_VERSION_SYMBOL(FTN_GET_PLACE_NUM_PROCS, 45,
"OMP_4.5");
1483 KMP_VERSION_SYMBOL(FTN_GET_PLACE_PROC_IDS, 45,
"OMP_4.5");
1484 KMP_VERSION_SYMBOL(FTN_GET_PLACE_NUM, 45,
"OMP_4.5");
1485 KMP_VERSION_SYMBOL(FTN_GET_PARTITION_NUM_PLACES, 45,
"OMP_4.5");
1486 KMP_VERSION_SYMBOL(FTN_GET_PARTITION_PLACE_NUMS, 45,
"OMP_4.5");
1498 #endif // KMP_USE_VERSION_SYMBOLS
1502 #endif // __cplusplus
KMP_EXPORT kmp_int32 __kmpc_bound_num_threads(ident_t *)