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 65 #if KMP_FTN_ENTRIES == KMP_FTN_APPEND 66 #define KMP_EXPAND_NAME_IF_APPEND(name) KMP_EXPAND_NAME(name) 68 #define KMP_EXPAND_NAME_IF_APPEND(name) name 71 void FTN_STDCALL FTN_SET_STACKSIZE(
int KMP_DEREF arg) {
73 __kmps_set_stacksize(KMP_DEREF arg);
76 __kmp_aux_set_stacksize((
size_t)KMP_DEREF arg);
80 void FTN_STDCALL FTN_SET_STACKSIZE_S(
size_t KMP_DEREF arg) {
82 __kmps_set_stacksize(KMP_DEREF arg);
85 __kmp_aux_set_stacksize(KMP_DEREF arg);
89 int FTN_STDCALL FTN_GET_STACKSIZE(
void) {
91 return (
int)__kmps_get_stacksize();
93 if (!__kmp_init_serial) {
94 __kmp_serial_initialize();
96 return (
int)__kmp_stksize;
100 size_t FTN_STDCALL FTN_GET_STACKSIZE_S(
void) {
102 return __kmps_get_stacksize();
104 if (!__kmp_init_serial) {
105 __kmp_serial_initialize();
107 return __kmp_stksize;
111 void FTN_STDCALL FTN_SET_BLOCKTIME(
int KMP_DEREF arg) {
113 __kmps_set_blocktime(KMP_DEREF arg);
118 gtid = __kmp_entry_gtid();
119 tid = __kmp_tid_from_gtid(gtid);
120 thread = __kmp_thread_from_gtid(gtid);
122 __kmp_aux_set_blocktime(KMP_DEREF arg, thread, tid);
126 int FTN_STDCALL FTN_GET_BLOCKTIME(
void) {
128 return __kmps_get_blocktime();
133 gtid = __kmp_entry_gtid();
134 tid = __kmp_tid_from_gtid(gtid);
135 team = __kmp_threads[gtid]->th.th_team;
138 if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
139 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
140 team->t.t_id, tid, KMP_MAX_BLOCKTIME));
141 return KMP_MAX_BLOCKTIME;
143 #ifdef KMP_ADJUST_BLOCKTIME 144 else if (__kmp_zero_bt && !get__bt_set(team, tid)) {
145 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
146 team->t.t_id, tid, 0));
151 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n", gtid,
152 team->t.t_id, tid, get__blocktime(team, tid)));
153 return get__blocktime(team, tid);
158 void FTN_STDCALL FTN_SET_LIBRARY_SERIAL(
void) {
160 __kmps_set_library(library_serial);
163 __kmp_user_set_library(library_serial);
167 void FTN_STDCALL FTN_SET_LIBRARY_TURNAROUND(
void) {
169 __kmps_set_library(library_turnaround);
172 __kmp_user_set_library(library_turnaround);
176 void FTN_STDCALL FTN_SET_LIBRARY_THROUGHPUT(
void) {
178 __kmps_set_library(library_throughput);
181 __kmp_user_set_library(library_throughput);
185 void FTN_STDCALL FTN_SET_LIBRARY(
int KMP_DEREF arg) {
187 __kmps_set_library(KMP_DEREF arg);
189 enum library_type lib;
190 lib = (
enum library_type)KMP_DEREF arg;
192 __kmp_user_set_library(lib);
196 int FTN_STDCALL FTN_GET_LIBRARY(
void) {
198 return __kmps_get_library();
200 if (!__kmp_init_serial) {
201 __kmp_serial_initialize();
203 return ((
int)__kmp_library);
207 void FTN_STDCALL FTN_SET_DISP_NUM_BUFFERS(
int KMP_DEREF arg) {
213 int num_buffers = KMP_DEREF arg;
214 if (__kmp_init_serial == FALSE && num_buffers >= KMP_MIN_DISP_NUM_BUFF &&
215 num_buffers <= KMP_MAX_DISP_NUM_BUFF) {
216 __kmp_dispatch_num_buffers = num_buffers;
221 int FTN_STDCALL FTN_SET_AFFINITY(
void **mask) {
222 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 225 if (!TCR_4(__kmp_init_middle)) {
226 __kmp_middle_initialize();
228 __kmp_assign_root_init_mask();
229 return __kmp_aux_set_affinity(mask);
233 int FTN_STDCALL FTN_GET_AFFINITY(
void **mask) {
234 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 237 if (!TCR_4(__kmp_init_middle)) {
238 __kmp_middle_initialize();
240 __kmp_assign_root_init_mask();
241 return __kmp_aux_get_affinity(mask);
245 int FTN_STDCALL FTN_GET_AFFINITY_MAX_PROC(
void) {
246 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 250 if (!TCR_4(__kmp_init_middle)) {
251 __kmp_middle_initialize();
253 __kmp_assign_root_init_mask();
254 return __kmp_aux_get_affinity_max_proc();
258 void FTN_STDCALL FTN_CREATE_AFFINITY_MASK(
void **mask) {
259 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 263 kmp_affin_mask_t *mask_internals;
264 if (!TCR_4(__kmp_init_middle)) {
265 __kmp_middle_initialize();
267 __kmp_assign_root_init_mask();
268 mask_internals = __kmp_affinity_dispatch->allocate_mask();
269 KMP_CPU_ZERO(mask_internals);
270 *mask = mask_internals;
274 void FTN_STDCALL FTN_DESTROY_AFFINITY_MASK(
void **mask) {
275 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 279 kmp_affin_mask_t *mask_internals;
280 if (!TCR_4(__kmp_init_middle)) {
281 __kmp_middle_initialize();
283 __kmp_assign_root_init_mask();
284 if (__kmp_env_consistency_check) {
286 KMP_FATAL(AffinityInvalidMask,
"kmp_destroy_affinity_mask");
289 mask_internals = (kmp_affin_mask_t *)(*mask);
290 __kmp_affinity_dispatch->deallocate_mask(mask_internals);
295 int FTN_STDCALL FTN_SET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
296 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 299 if (!TCR_4(__kmp_init_middle)) {
300 __kmp_middle_initialize();
302 __kmp_assign_root_init_mask();
303 return __kmp_aux_set_affinity_mask_proc(KMP_DEREF proc, mask);
307 int FTN_STDCALL FTN_UNSET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
308 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 311 if (!TCR_4(__kmp_init_middle)) {
312 __kmp_middle_initialize();
314 __kmp_assign_root_init_mask();
315 return __kmp_aux_unset_affinity_mask_proc(KMP_DEREF proc, mask);
319 int FTN_STDCALL FTN_GET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask) {
320 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 323 if (!TCR_4(__kmp_init_middle)) {
324 __kmp_middle_initialize();
326 __kmp_assign_root_init_mask();
327 return __kmp_aux_get_affinity_mask_proc(KMP_DEREF proc, mask);
334 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NUM_THREADS)(
int KMP_DEREF arg) {
338 __kmp_set_num_threads(KMP_DEREF arg, __kmp_entry_gtid());
343 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_THREADS)(void) {
352 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_THREADS)(void) {
358 if (!TCR_4(__kmp_init_middle)) {
359 __kmp_middle_initialize();
361 __kmp_assign_root_init_mask();
362 gtid = __kmp_entry_gtid();
363 thread = __kmp_threads[gtid];
366 return thread->th.th_current_task->td_icvs.nproc;
370 int FTN_STDCALL FTN_CONTROL_TOOL(
int command,
int modifier,
void *arg) {
371 #if defined(KMP_STUB) || !OMPT_SUPPORT 374 OMPT_STORE_RETURN_ADDRESS(__kmp_entry_gtid());
375 if (!TCR_4(__kmp_init_middle)) {
378 kmp_info_t *this_thr = __kmp_threads[__kmp_entry_gtid()];
379 ompt_task_info_t *parent_task_info = OMPT_CUR_TASK_INFO(this_thr);
380 parent_task_info->frame.enter_frame.ptr = OMPT_GET_FRAME_ADDRESS(0);
381 int ret = __kmp_control_tool(command, modifier, arg);
382 parent_task_info->frame.enter_frame.ptr = 0;
388 omp_allocator_handle_t FTN_STDCALL
389 FTN_INIT_ALLOCATOR(omp_memspace_handle_t KMP_DEREF m,
int KMP_DEREF ntraits,
390 omp_alloctrait_t tr[]) {
394 return __kmpc_init_allocator(__kmp_entry_gtid(), KMP_DEREF m,
395 KMP_DEREF ntraits, tr);
399 void FTN_STDCALL FTN_DESTROY_ALLOCATOR(omp_allocator_handle_t al) {
401 __kmpc_destroy_allocator(__kmp_entry_gtid(), al);
404 void FTN_STDCALL FTN_SET_DEFAULT_ALLOCATOR(omp_allocator_handle_t al) {
406 __kmpc_set_default_allocator(__kmp_entry_gtid(), al);
409 omp_allocator_handle_t FTN_STDCALL FTN_GET_DEFAULT_ALLOCATOR(
void) {
413 return __kmpc_get_default_allocator(__kmp_entry_gtid());
419 static void __kmp_fortran_strncpy_truncate(
char *buffer,
size_t buf_size,
420 char const *csrc,
size_t csrc_size) {
421 size_t capped_src_size = csrc_size;
422 if (csrc_size >= buf_size) {
423 capped_src_size = buf_size - 1;
425 KMP_STRNCPY_S(buffer, buf_size, csrc, capped_src_size);
426 if (csrc_size >= buf_size) {
427 KMP_DEBUG_ASSERT(buffer[buf_size - 1] ==
'\0');
428 buffer[buf_size - 1] = csrc[buf_size - 1];
430 for (
size_t i = csrc_size; i < buf_size; ++i)
436 class ConvertedString {
441 ConvertedString(
char const *fortran_str,
size_t size) {
442 th = __kmp_get_thread();
443 buf = (
char *)__kmp_thread_malloc(th, size + 1);
444 KMP_STRNCPY_S(buf, size + 1, fortran_str, size);
447 ~ConvertedString() { __kmp_thread_free(th, buf); }
448 const char *
get()
const {
return buf; }
456 void FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_SET_AFFINITY_FORMAT)(
457 char const *format,
size_t size) {
461 if (!__kmp_init_serial) {
462 __kmp_serial_initialize();
464 ConvertedString cformat(format, size);
467 __kmp_strncpy_truncate(__kmp_affinity_format, KMP_AFFINITY_FORMAT_SIZE,
468 cformat.get(), KMP_STRLEN(cformat.get()));
478 size_t FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_GET_AFFINITY_FORMAT)(
479 char *buffer,
size_t size) {
484 if (!__kmp_init_serial) {
485 __kmp_serial_initialize();
487 format_size = KMP_STRLEN(__kmp_affinity_format);
488 if (buffer && size) {
489 __kmp_fortran_strncpy_truncate(buffer, size, __kmp_affinity_format,
501 void FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_DISPLAY_AFFINITY)(
502 char const *format,
size_t size) {
507 if (!TCR_4(__kmp_init_middle)) {
508 __kmp_middle_initialize();
510 __kmp_assign_root_init_mask();
511 gtid = __kmp_get_gtid();
512 ConvertedString cformat(format, size);
513 __kmp_aux_display_affinity(gtid, cformat.get());
527 size_t FTN_STDCALL KMP_EXPAND_NAME_IF_APPEND(FTN_CAPTURE_AFFINITY)(
528 char *buffer,
char const *format,
size_t buf_size,
size_t for_size) {
529 #if defined(KMP_STUB) 534 kmp_str_buf_t capture_buf;
535 if (!TCR_4(__kmp_init_middle)) {
536 __kmp_middle_initialize();
538 __kmp_assign_root_init_mask();
539 gtid = __kmp_get_gtid();
540 __kmp_str_buf_init(&capture_buf);
541 ConvertedString cformat(format, for_size);
542 num_required = __kmp_aux_capture_affinity(gtid, cformat.get(), &capture_buf);
543 if (buffer && buf_size) {
544 __kmp_fortran_strncpy_truncate(buffer, buf_size, capture_buf.str,
547 __kmp_str_buf_free(&capture_buf);
552 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
558 #if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \ 559 KMP_OS_HURD || KMP_OS_OPENBSD 560 gtid = __kmp_entry_gtid();
562 if (!__kmp_init_parallel ||
563 (gtid = (
int)((kmp_intptr_t)TlsGetValue(__kmp_gtid_threadprivate_key))) ==
571 #ifdef KMP_TDATA_GTID 572 if (__kmp_gtid_mode >= 3) {
573 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
578 if (!__kmp_init_parallel ||
579 (gtid = (
int)((kmp_intptr_t)(
580 pthread_getspecific(__kmp_gtid_threadprivate_key)))) == 0) {
584 #ifdef KMP_TDATA_GTID 588 #error Unknown or unsupported OS 591 return __kmp_tid_from_gtid(gtid);
595 int FTN_STDCALL FTN_GET_NUM_KNOWN_THREADS(
void) {
599 if (!__kmp_init_serial) {
600 __kmp_serial_initialize();
604 return TCR_4(__kmp_nth);
608 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PROCS)(void) {
612 if (!TCR_4(__kmp_init_middle)) {
613 __kmp_middle_initialize();
615 __kmp_assign_root_init_mask();
616 return __kmp_avail_proc;
620 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NESTED)(
int KMP_DEREF flag) {
622 __kmps_set_nested(KMP_DEREF flag);
626 thread = __kmp_entry_thread();
627 KMP_INFORM(APIDeprecated,
"omp_set_nested",
"omp_set_max_active_levels");
628 __kmp_save_internal_controls(thread);
630 int max_active_levels = get__max_active_levels(thread);
631 if (max_active_levels == 1)
632 max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
633 set__max_active_levels(thread, (KMP_DEREF flag) ? max_active_levels : 1);
637 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NESTED)(void) {
639 return __kmps_get_nested();
642 thread = __kmp_entry_thread();
643 KMP_INFORM(APIDeprecated,
"omp_get_nested",
"omp_get_max_active_levels");
644 return get__max_active_levels(thread) > 1;
648 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DYNAMIC)(
int KMP_DEREF flag) {
650 __kmps_set_dynamic(KMP_DEREF flag ? TRUE : FALSE);
654 thread = __kmp_entry_thread();
656 __kmp_save_internal_controls(thread);
657 set__dynamic(thread, KMP_DEREF flag ?
true :
false);
661 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DYNAMIC)(void) {
663 return __kmps_get_dynamic();
666 thread = __kmp_entry_thread();
667 return get__dynamic(thread);
671 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IN_PARALLEL)(void) {
675 kmp_info_t *th = __kmp_entry_thread();
676 if (th->th.th_teams_microtask) {
681 return (th->th.th_team->t.t_active_level ? 1 : 0);
683 return (th->th.th_root->r.r_in_parallel ? FTN_TRUE : FTN_FALSE);
687 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_SCHEDULE)(kmp_sched_t KMP_DEREF kind,
688 int KMP_DEREF modifier) {
690 __kmps_set_schedule(KMP_DEREF kind, KMP_DEREF modifier);
693 __kmp_set_schedule(__kmp_entry_gtid(), KMP_DEREF kind, KMP_DEREF modifier);
697 void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_SCHEDULE)(kmp_sched_t *kind,
700 __kmps_get_schedule(kind, modifier);
703 __kmp_get_schedule(__kmp_entry_gtid(), kind, modifier);
707 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_MAX_ACTIVE_LEVELS)(
int KMP_DEREF arg) {
712 __kmp_set_max_active_levels(__kmp_entry_gtid(), KMP_DEREF arg);
716 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_ACTIVE_LEVELS)(void) {
721 if (!TCR_4(__kmp_init_middle)) {
722 __kmp_middle_initialize();
724 return __kmp_get_max_active_levels(__kmp_entry_gtid());
728 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_ACTIVE_LEVEL)(void) {
733 return __kmp_entry_thread()->th.th_team->t.t_active_level;
737 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_LEVEL)(void) {
742 return __kmp_entry_thread()->th.th_team->t.t_level;
747 KMP_EXPAND_NAME(FTN_GET_ANCESTOR_THREAD_NUM)(
int KMP_DEREF level) {
749 return (KMP_DEREF level) ? (-1) : (0);
751 return __kmp_get_ancestor_thread_num(__kmp_entry_gtid(), KMP_DEREF level);
755 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_TEAM_SIZE)(
int KMP_DEREF level) {
757 return (KMP_DEREF level) ? (-1) : (1);
759 return __kmp_get_team_size(__kmp_entry_gtid(), KMP_DEREF level);
763 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_LIMIT)(void) {
769 if (!__kmp_init_serial) {
770 __kmp_serial_initialize();
773 gtid = __kmp_entry_gtid();
774 thread = __kmp_threads[gtid];
775 return thread->th.th_current_task->td_icvs.thread_limit;
779 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IN_FINAL)(void) {
783 if (!TCR_4(__kmp_init_parallel)) {
786 return __kmp_entry_thread()->th.th_current_task->td_flags.final;
790 kmp_proc_bind_t FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PROC_BIND)(void) {
792 return __kmps_get_proc_bind();
794 return get__proc_bind(__kmp_entry_thread());
798 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_PLACES)(void) {
799 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 802 if (!TCR_4(__kmp_init_middle)) {
803 __kmp_middle_initialize();
805 __kmp_assign_root_init_mask();
806 if (!KMP_AFFINITY_CAPABLE())
808 return __kmp_affinity_num_masks;
812 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM_PROCS)(
int place_num) {
813 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 818 if (!TCR_4(__kmp_init_middle)) {
819 __kmp_middle_initialize();
821 __kmp_assign_root_init_mask();
822 if (!KMP_AFFINITY_CAPABLE())
824 if (place_num < 0 || place_num >= (
int)__kmp_affinity_num_masks)
826 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
827 KMP_CPU_SET_ITERATE(i, mask) {
828 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
829 (!KMP_CPU_ISSET(i, mask))) {
838 void FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_PROC_IDS)(
int place_num,
840 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 844 if (!TCR_4(__kmp_init_middle)) {
845 __kmp_middle_initialize();
847 __kmp_assign_root_init_mask();
848 if (!KMP_AFFINITY_CAPABLE())
850 if (place_num < 0 || place_num >= (
int)__kmp_affinity_num_masks)
852 kmp_affin_mask_t *mask = KMP_CPU_INDEX(__kmp_affinity_masks, place_num);
854 KMP_CPU_SET_ITERATE(i, mask) {
855 if ((!KMP_CPU_ISSET(i, __kmp_affin_fullMask)) ||
856 (!KMP_CPU_ISSET(i, mask))) {
864 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PLACE_NUM)(void) {
865 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 870 if (!TCR_4(__kmp_init_middle)) {
871 __kmp_middle_initialize();
873 __kmp_assign_root_init_mask();
874 if (!KMP_AFFINITY_CAPABLE())
876 gtid = __kmp_entry_gtid();
877 thread = __kmp_thread_from_gtid(gtid);
878 if (thread->th.th_current_place < 0)
880 return thread->th.th_current_place;
884 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_PARTITION_NUM_PLACES)(void) {
885 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 888 int gtid, num_places, first_place, last_place;
890 if (!TCR_4(__kmp_init_middle)) {
891 __kmp_middle_initialize();
893 __kmp_assign_root_init_mask();
894 if (!KMP_AFFINITY_CAPABLE())
896 gtid = __kmp_entry_gtid();
897 thread = __kmp_thread_from_gtid(gtid);
898 first_place = thread->th.th_first_place;
899 last_place = thread->th.th_last_place;
900 if (first_place < 0 || last_place < 0)
902 if (first_place <= last_place)
903 num_places = last_place - first_place + 1;
905 num_places = __kmp_affinity_num_masks - first_place + last_place + 1;
911 KMP_EXPAND_NAME(FTN_GET_PARTITION_PLACE_NUMS)(
int *place_nums) {
912 #if defined(KMP_STUB) || !KMP_AFFINITY_SUPPORTED 915 int i, gtid, place_num, first_place, last_place, start, end;
917 if (!TCR_4(__kmp_init_middle)) {
918 __kmp_middle_initialize();
920 __kmp_assign_root_init_mask();
921 if (!KMP_AFFINITY_CAPABLE())
923 gtid = __kmp_entry_gtid();
924 thread = __kmp_thread_from_gtid(gtid);
925 first_place = thread->th.th_first_place;
926 last_place = thread->th.th_last_place;
927 if (first_place < 0 || last_place < 0)
929 if (first_place <= last_place) {
936 for (i = 0, place_num = start; place_num <= end; ++place_num, ++i) {
937 place_nums[i] = place_num;
942 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_TEAMS)(void) {
946 return __kmp_aux_get_num_teams();
950 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_TEAM_NUM)(void) {
954 return __kmp_aux_get_team_num();
958 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DEFAULT_DEVICE)(void) {
959 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) 962 return __kmp_entry_thread()->th.th_current_task->td_icvs.default_device;
966 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DEFAULT_DEVICE)(
int KMP_DEREF arg) {
967 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) 970 __kmp_entry_thread()->th.th_current_task->td_icvs.default_device =
977 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void)
978 KMP_WEAK_ATTRIBUTE_EXTERNAL;
979 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void) {
980 #if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB) 984 if ((*(
void **)(&fptr) = KMP_DLSYM(
"__tgt_get_num_devices"))) {
986 }
else if ((*(
void **)(&fptr) = KMP_DLSYM_NEXT(
"omp_get_num_devices"))) {
988 }
else if ((*(
void **)(&fptr) = KMP_DLSYM(
"_Offload_number_of_devices"))) {
993 #endif // KMP_MIC || KMP_OS_DARWIN || KMP_OS_WINDOWS || defined(KMP_STUB) 998 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IS_INITIAL_DEVICE)(void)
999 KMP_WEAK_ATTRIBUTE_EXTERNAL;
1000 int FTN_STDCALL KMP_EXPAND_NAME(FTN_IS_INITIAL_DEVICE)(void) {
1005 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)(void)
1006 KMP_WEAK_ATTRIBUTE_EXTERNAL;
1007 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)(void) {
1009 return KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)();
1012 #if defined(KMP_STUB) 1015 void *FTN_STDCALL FTN_TARGET_ALLOC(
size_t size,
int device_num) {
return 0; }
1017 void FTN_STDCALL FTN_TARGET_FREE(
void *device_ptr,
int device_num) {}
1019 int FTN_STDCALL FTN_TARGET_IS_PRESENT(
void *ptr,
int device_num) {
return 0; }
1021 int FTN_STDCALL FTN_TARGET_MEMCPY(
void *dst,
void *src,
size_t length,
1022 size_t dst_offset,
size_t src_offset,
1023 int dst_device,
int src_device) {
1027 int FTN_STDCALL FTN_TARGET_MEMCPY_RECT(
1028 void *dst,
void *src,
size_t element_size,
int num_dims,
1029 const size_t *volume,
const size_t *dst_offsets,
const size_t *src_offsets,
1030 const size_t *dst_dimensions,
const size_t *src_dimensions,
int dst_device,
1035 int FTN_STDCALL FTN_TARGET_ASSOCIATE_PTR(
void *host_ptr,
void *device_ptr,
1036 size_t size,
size_t device_offset,
1041 int FTN_STDCALL FTN_TARGET_DISASSOCIATE_PTR(
void *host_ptr,
int device_num) {
1044 #endif // defined(KMP_STUB) 1047 typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
1050 #if KMP_USE_DYNAMIC_LOCK 1051 void FTN_STDCALL FTN_INIT_LOCK_WITH_HINT(
void **user_lock,
1052 uintptr_t KMP_DEREF hint) {
1054 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1056 int gtid = __kmp_entry_gtid();
1057 #if OMPT_SUPPORT && OMPT_OPTIONAL 1058 OMPT_STORE_RETURN_ADDRESS(gtid);
1060 __kmpc_init_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1064 void FTN_STDCALL FTN_INIT_NEST_LOCK_WITH_HINT(
void **user_lock,
1065 uintptr_t KMP_DEREF hint) {
1067 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1069 int gtid = __kmp_entry_gtid();
1070 #if OMPT_SUPPORT && OMPT_OPTIONAL 1071 OMPT_STORE_RETURN_ADDRESS(gtid);
1073 __kmpc_init_nest_lock_with_hint(NULL, gtid, user_lock, KMP_DEREF hint);
1079 void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_LOCK)(
void **user_lock) {
1081 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1083 int gtid = __kmp_entry_gtid();
1084 #if OMPT_SUPPORT && OMPT_OPTIONAL 1085 OMPT_STORE_RETURN_ADDRESS(gtid);
1087 __kmpc_init_lock(NULL, gtid, user_lock);
1092 void FTN_STDCALL KMP_EXPAND_NAME(FTN_INIT_NEST_LOCK)(
void **user_lock) {
1094 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1096 int gtid = __kmp_entry_gtid();
1097 #if OMPT_SUPPORT && OMPT_OPTIONAL 1098 OMPT_STORE_RETURN_ADDRESS(gtid);
1100 __kmpc_init_nest_lock(NULL, gtid, user_lock);
1104 void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_LOCK)(
void **user_lock) {
1106 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1108 int gtid = __kmp_entry_gtid();
1109 #if OMPT_SUPPORT && OMPT_OPTIONAL 1110 OMPT_STORE_RETURN_ADDRESS(gtid);
1112 __kmpc_destroy_lock(NULL, gtid, user_lock);
1116 void FTN_STDCALL KMP_EXPAND_NAME(FTN_DESTROY_NEST_LOCK)(
void **user_lock) {
1118 *((kmp_stub_lock_t *)user_lock) = UNINIT;
1120 int gtid = __kmp_entry_gtid();
1121 #if OMPT_SUPPORT && OMPT_OPTIONAL 1122 OMPT_STORE_RETURN_ADDRESS(gtid);
1124 __kmpc_destroy_nest_lock(NULL, gtid, user_lock);
1128 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_LOCK)(
void **user_lock) {
1130 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1133 if (*((kmp_stub_lock_t *)user_lock) != UNLOCKED) {
1136 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1138 int gtid = __kmp_entry_gtid();
1139 #if OMPT_SUPPORT && OMPT_OPTIONAL 1140 OMPT_STORE_RETURN_ADDRESS(gtid);
1142 __kmpc_set_lock(NULL, gtid, user_lock);
1146 void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_NEST_LOCK)(
void **user_lock) {
1148 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1151 (*((
int *)user_lock))++;
1153 int gtid = __kmp_entry_gtid();
1154 #if OMPT_SUPPORT && OMPT_OPTIONAL 1155 OMPT_STORE_RETURN_ADDRESS(gtid);
1157 __kmpc_set_nest_lock(NULL, gtid, user_lock);
1161 void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_LOCK)(
void **user_lock) {
1163 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1166 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1169 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
1171 int gtid = __kmp_entry_gtid();
1172 #if OMPT_SUPPORT && OMPT_OPTIONAL 1173 OMPT_STORE_RETURN_ADDRESS(gtid);
1175 __kmpc_unset_lock(NULL, gtid, user_lock);
1179 void FTN_STDCALL KMP_EXPAND_NAME(FTN_UNSET_NEST_LOCK)(
void **user_lock) {
1181 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1184 if (*((kmp_stub_lock_t *)user_lock) == UNLOCKED) {
1187 (*((
int *)user_lock))--;
1189 int gtid = __kmp_entry_gtid();
1190 #if OMPT_SUPPORT && OMPT_OPTIONAL 1191 OMPT_STORE_RETURN_ADDRESS(gtid);
1193 __kmpc_unset_nest_lock(NULL, gtid, user_lock);
1197 int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_LOCK)(
void **user_lock) {
1199 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1202 if (*((kmp_stub_lock_t *)user_lock) == LOCKED) {
1205 *((kmp_stub_lock_t *)user_lock) = LOCKED;
1208 int gtid = __kmp_entry_gtid();
1209 #if OMPT_SUPPORT && OMPT_OPTIONAL 1210 OMPT_STORE_RETURN_ADDRESS(gtid);
1212 return __kmpc_test_lock(NULL, gtid, user_lock);
1216 int FTN_STDCALL KMP_EXPAND_NAME(FTN_TEST_NEST_LOCK)(
void **user_lock) {
1218 if (*((kmp_stub_lock_t *)user_lock) == UNINIT) {
1221 return ++(*((
int *)user_lock));
1223 int gtid = __kmp_entry_gtid();
1224 #if OMPT_SUPPORT && OMPT_OPTIONAL 1225 OMPT_STORE_RETURN_ADDRESS(gtid);
1227 return __kmpc_test_nest_lock(NULL, gtid, user_lock);
1231 double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTIME)(void) {
1233 return __kmps_get_wtime();
1239 if (!__kmp_init_serial) {
1240 __kmp_serial_initialize();
1243 __kmp_elapsed(&data);
1248 double FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_WTICK)(void) {
1250 return __kmps_get_wtick();
1253 if (!__kmp_init_serial) {
1254 __kmp_serial_initialize();
1256 __kmp_elapsed_tick(&data);
1263 void *FTN_STDCALL FTN_MALLOC(
size_t KMP_DEREF size) {
1265 return kmpc_malloc(KMP_DEREF size);
1268 void *FTN_STDCALL FTN_ALIGNED_MALLOC(
size_t KMP_DEREF size,
1269 size_t KMP_DEREF alignment) {
1271 return kmpc_aligned_malloc(KMP_DEREF size, KMP_DEREF alignment);
1274 void *FTN_STDCALL FTN_CALLOC(
size_t KMP_DEREF nelem,
size_t KMP_DEREF elsize) {
1276 return kmpc_calloc(KMP_DEREF nelem, KMP_DEREF elsize);
1279 void *FTN_STDCALL FTN_REALLOC(
void *KMP_DEREF ptr,
size_t KMP_DEREF size) {
1281 return kmpc_realloc(KMP_DEREF ptr, KMP_DEREF size);
1284 void FTN_STDCALL FTN_KFREE(
void *KMP_DEREF ptr) {
1286 kmpc_free(KMP_DEREF ptr);
1289 void FTN_STDCALL FTN_SET_WARNINGS_ON(
void) {
1291 __kmp_generate_warnings = kmp_warnings_explicit;
1295 void FTN_STDCALL FTN_SET_WARNINGS_OFF(
void) {
1297 __kmp_generate_warnings = FALSE;
1301 void FTN_STDCALL FTN_SET_DEFAULTS(
char const *str
1302 #ifndef PASS_ARGS_BY_VALUE
1308 #ifdef PASS_ARGS_BY_VALUE 1309 int len = (int)KMP_STRLEN(str);
1311 __kmp_aux_set_defaults(str, len);
1318 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_CANCELLATION)(void) {
1323 if (!__kmp_init_serial) {
1324 __kmp_serial_initialize();
1326 return __kmp_omp_cancellation;
1330 int FTN_STDCALL FTN_GET_CANCELLATION_STATUS(
int cancel_kind) {
1334 return __kmp_get_cancellation_status(cancel_kind);
1339 int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_MAX_TASK_PRIORITY)(void) {
1343 if (!__kmp_init_serial) {
1344 __kmp_serial_initialize();
1346 return __kmp_max_task_priority;
1353 int FTN_STDCALL FTN_GET_DEVICE_NUM(
void) KMP_WEAK_ATTRIBUTE_EXTERNAL;
1354 int FTN_STDCALL FTN_GET_DEVICE_NUM(
void) {
1355 return KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)();
1359 int FTN_STDCALL KMP_EXPAND_NAME(FTN_PAUSE_RESOURCE)(kmp_pause_status_t kind,
1364 if (device_num == KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)())
1365 return __kmpc_pause_resource(kind);
1367 int (*fptr)(kmp_pause_status_t, int);
1368 if ((*(
void **)(&fptr) = KMP_DLSYM(
"tgt_pause_resource")))
1369 return (*fptr)(kind, device_num);
1378 KMP_EXPAND_NAME(FTN_PAUSE_RESOURCE_ALL)(kmp_pause_status_t kind) {
1383 int (*fptr)(kmp_pause_status_t, int);
1384 if ((*(
void **)(&fptr) = KMP_DLSYM(
"tgt_pause_resource")))
1385 fails = (*fptr)(kind, KMP_DEVICE_ALL);
1386 fails += __kmpc_pause_resource(kind);
1392 int FTN_STDCALL FTN_GET_SUPPORTED_ACTIVE_LEVELS(
void) {
1396 return KMP_MAX_ACTIVE_LEVELS_LIMIT;
1400 void FTN_STDCALL FTN_FULFILL_EVENT(kmp_event_t *event) {
1402 __kmp_fulfill_event(event);
1407 void FTN_STDCALL FTN_SET_NUM_TEAMS(
int KMP_DEREF num_teams) {
1411 if (!__kmp_init_serial) {
1412 __kmp_serial_initialize();
1414 __kmp_set_num_teams(KMP_DEREF num_teams);
1417 int FTN_STDCALL FTN_GET_MAX_TEAMS(
void) {
1421 if (!__kmp_init_serial) {
1422 __kmp_serial_initialize();
1424 return __kmp_get_max_teams();
1428 void FTN_STDCALL FTN_SET_TEAMS_THREAD_LIMIT(
int KMP_DEREF limit) {
1432 if (!__kmp_init_serial) {
1433 __kmp_serial_initialize();
1435 __kmp_set_teams_thread_limit(KMP_DEREF limit);
1438 int FTN_STDCALL FTN_GET_TEAMS_THREAD_LIMIT(
void) {
1442 if (!__kmp_init_serial) {
1443 __kmp_serial_initialize();
1445 return __kmp_get_teams_thread_limit();
1450 void FTN_STDCALL FTN_DISPLAY_ENV(
int verbose) {
1452 __kmp_omp_display_env(verbose);
1457 #ifdef KMP_USE_VERSION_SYMBOLS 1479 KMP_VERSION_SYMBOL(FTN_SET_NUM_THREADS, 10,
"OMP_1.0");
1480 KMP_VERSION_SYMBOL(FTN_GET_NUM_THREADS, 10,
"OMP_1.0");
1481 KMP_VERSION_SYMBOL(FTN_GET_MAX_THREADS, 10,
"OMP_1.0");
1482 KMP_VERSION_SYMBOL(FTN_GET_THREAD_NUM, 10,
"OMP_1.0");
1483 KMP_VERSION_SYMBOL(FTN_GET_NUM_PROCS, 10,
"OMP_1.0");
1484 KMP_VERSION_SYMBOL(FTN_IN_PARALLEL, 10,
"OMP_1.0");
1485 KMP_VERSION_SYMBOL(FTN_SET_DYNAMIC, 10,
"OMP_1.0");
1486 KMP_VERSION_SYMBOL(FTN_GET_DYNAMIC, 10,
"OMP_1.0");
1487 KMP_VERSION_SYMBOL(FTN_SET_NESTED, 10,
"OMP_1.0");
1488 KMP_VERSION_SYMBOL(FTN_GET_NESTED, 10,
"OMP_1.0");
1489 KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 10,
"OMP_1.0");
1490 KMP_VERSION_SYMBOL(FTN_INIT_NEST_LOCK, 10,
"OMP_1.0");
1491 KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 10,
"OMP_1.0");
1492 KMP_VERSION_SYMBOL(FTN_DESTROY_NEST_LOCK, 10,
"OMP_1.0");
1493 KMP_VERSION_SYMBOL(FTN_SET_LOCK, 10,
"OMP_1.0");
1494 KMP_VERSION_SYMBOL(FTN_SET_NEST_LOCK, 10,
"OMP_1.0");
1495 KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 10,
"OMP_1.0");
1496 KMP_VERSION_SYMBOL(FTN_UNSET_NEST_LOCK, 10,
"OMP_1.0");
1497 KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 10,
"OMP_1.0");
1498 KMP_VERSION_SYMBOL(FTN_TEST_NEST_LOCK, 10,
"OMP_1.0");
1501 KMP_VERSION_SYMBOL(FTN_GET_WTICK, 20,
"OMP_2.0");
1502 KMP_VERSION_SYMBOL(FTN_GET_WTIME, 20,
"OMP_2.0");
1505 KMP_VERSION_SYMBOL(FTN_SET_SCHEDULE, 30,
"OMP_3.0");
1506 KMP_VERSION_SYMBOL(FTN_GET_SCHEDULE, 30,
"OMP_3.0");
1507 KMP_VERSION_SYMBOL(FTN_GET_THREAD_LIMIT, 30,
"OMP_3.0");
1508 KMP_VERSION_SYMBOL(FTN_SET_MAX_ACTIVE_LEVELS, 30,
"OMP_3.0");
1509 KMP_VERSION_SYMBOL(FTN_GET_MAX_ACTIVE_LEVELS, 30,
"OMP_3.0");
1510 KMP_VERSION_SYMBOL(FTN_GET_ANCESTOR_THREAD_NUM, 30,
"OMP_3.0");
1511 KMP_VERSION_SYMBOL(FTN_GET_LEVEL, 30,
"OMP_3.0");
1512 KMP_VERSION_SYMBOL(FTN_GET_TEAM_SIZE, 30,
"OMP_3.0");
1513 KMP_VERSION_SYMBOL(FTN_GET_ACTIVE_LEVEL, 30,
"OMP_3.0");
1516 KMP_VERSION_SYMBOL(FTN_INIT_LOCK, 30,
"OMP_3.0");
1517 KMP_VERSION_SYMBOL(FTN_INIT_NEST_LOCK, 30,
"OMP_3.0");
1518 KMP_VERSION_SYMBOL(FTN_DESTROY_LOCK, 30,
"OMP_3.0");
1519 KMP_VERSION_SYMBOL(FTN_DESTROY_NEST_LOCK, 30,
"OMP_3.0");
1520 KMP_VERSION_SYMBOL(FTN_SET_LOCK, 30,
"OMP_3.0");
1521 KMP_VERSION_SYMBOL(FTN_SET_NEST_LOCK, 30,
"OMP_3.0");
1522 KMP_VERSION_SYMBOL(FTN_UNSET_LOCK, 30,
"OMP_3.0");
1523 KMP_VERSION_SYMBOL(FTN_UNSET_NEST_LOCK, 30,
"OMP_3.0");
1524 KMP_VERSION_SYMBOL(FTN_TEST_LOCK, 30,
"OMP_3.0");
1525 KMP_VERSION_SYMBOL(FTN_TEST_NEST_LOCK, 30,
"OMP_3.0");
1528 KMP_VERSION_SYMBOL(FTN_IN_FINAL, 31,
"OMP_3.1");
1531 KMP_VERSION_SYMBOL(FTN_GET_PROC_BIND, 40,
"OMP_4.0");
1532 KMP_VERSION_SYMBOL(FTN_GET_NUM_TEAMS, 40,
"OMP_4.0");
1533 KMP_VERSION_SYMBOL(FTN_GET_TEAM_NUM, 40,
"OMP_4.0");
1534 KMP_VERSION_SYMBOL(FTN_GET_CANCELLATION, 40,
"OMP_4.0");
1535 KMP_VERSION_SYMBOL(FTN_GET_DEFAULT_DEVICE, 40,
"OMP_4.0");
1536 KMP_VERSION_SYMBOL(FTN_SET_DEFAULT_DEVICE, 40,
"OMP_4.0");
1537 KMP_VERSION_SYMBOL(FTN_IS_INITIAL_DEVICE, 40,
"OMP_4.0");
1538 KMP_VERSION_SYMBOL(FTN_GET_NUM_DEVICES, 40,
"OMP_4.0");
1541 KMP_VERSION_SYMBOL(FTN_GET_MAX_TASK_PRIORITY, 45,
"OMP_4.5");
1542 KMP_VERSION_SYMBOL(FTN_GET_NUM_PLACES, 45,
"OMP_4.5");
1543 KMP_VERSION_SYMBOL(FTN_GET_PLACE_NUM_PROCS, 45,
"OMP_4.5");
1544 KMP_VERSION_SYMBOL(FTN_GET_PLACE_PROC_IDS, 45,
"OMP_4.5");
1545 KMP_VERSION_SYMBOL(FTN_GET_PLACE_NUM, 45,
"OMP_4.5");
1546 KMP_VERSION_SYMBOL(FTN_GET_PARTITION_NUM_PLACES, 45,
"OMP_4.5");
1547 KMP_VERSION_SYMBOL(FTN_GET_PARTITION_PLACE_NUMS, 45,
"OMP_4.5");
1548 KMP_VERSION_SYMBOL(FTN_GET_INITIAL_DEVICE, 45,
"OMP_4.5");
1552 KMP_VERSION_SYMBOL(FTN_PAUSE_RESOURCE, 50,
"OMP_5.0");
1553 KMP_VERSION_SYMBOL(FTN_PAUSE_RESOURCE_ALL, 50,
"OMP_5.0");
1555 #if KMP_FTN_ENTRIES == KMP_FTN_APPEND 1556 KMP_VERSION_SYMBOL(FTN_CAPTURE_AFFINITY, 50,
"OMP_5.0");
1557 KMP_VERSION_SYMBOL(FTN_DISPLAY_AFFINITY, 50,
"OMP_5.0");
1558 KMP_VERSION_SYMBOL(FTN_GET_AFFINITY_FORMAT, 50,
"OMP_5.0");
1559 KMP_VERSION_SYMBOL(FTN_SET_AFFINITY_FORMAT, 50,
"OMP_5.0");
1564 #endif // KMP_USE_VERSION_SYMBOLS 1568 #endif // __cplusplus KMP_EXPORT kmp_int32 __kmpc_bound_num_threads(ident_t *)