38 # error The support file kmp_ftn_entry.h should not be compiled by itself.
61 #ifdef KMP_GOMP_COMPAT
62 # if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_UPPER)
63 # define PASS_ARGS_BY_VALUE 1
67 # if (KMP_FTN_ENTRIES == KMP_FTN_PLAIN) || (KMP_FTN_ENTRIES == KMP_FTN_APPEND)
68 # define PASS_ARGS_BY_VALUE 1
73 #ifdef PASS_ARGS_BY_VALUE
80 FTN_SET_STACKSIZE(
int KMP_DEREF arg )
83 __kmps_set_stacksize( KMP_DEREF arg );
86 __kmp_aux_set_stacksize( (
size_t) KMP_DEREF arg );
91 FTN_SET_STACKSIZE_S(
size_t KMP_DEREF arg )
94 __kmps_set_stacksize( KMP_DEREF arg );
97 __kmp_aux_set_stacksize( KMP_DEREF arg );
102 FTN_GET_STACKSIZE(
void )
105 return __kmps_get_stacksize();
107 if ( ! __kmp_init_serial ) {
108 __kmp_serial_initialize();
110 return (
int)__kmp_stksize;
115 FTN_GET_STACKSIZE_S(
void )
118 return __kmps_get_stacksize();
120 if ( ! __kmp_init_serial ) {
121 __kmp_serial_initialize();
123 return __kmp_stksize;
128 FTN_SET_BLOCKTIME(
int KMP_DEREF arg )
131 __kmps_set_blocktime( KMP_DEREF arg );
136 gtid = __kmp_entry_gtid();
137 tid = __kmp_tid_from_gtid(gtid);
138 thread = __kmp_thread_from_gtid(gtid);
140 __kmp_aux_set_blocktime( KMP_DEREF arg, thread, tid );
145 FTN_GET_BLOCKTIME(
void )
148 return __kmps_get_blocktime();
154 gtid = __kmp_entry_gtid();
155 tid = __kmp_tid_from_gtid(gtid);
156 thread = __kmp_thread_from_gtid(gtid);
157 team = __kmp_threads[ gtid ] -> th.th_team;
160 if ( __kmp_dflt_blocktime == KMP_MAX_BLOCKTIME ) {
161 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
162 gtid, team->t.t_id, tid, KMP_MAX_BLOCKTIME) );
163 return KMP_MAX_BLOCKTIME;
165 #ifdef KMP_ADJUST_BLOCKTIME
166 else if ( __kmp_zero_bt && !get__bt_set( team, tid ) ) {
167 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
168 gtid, team->t.t_id, tid, 0) );
173 KF_TRACE(10, (
"kmp_get_blocktime: T#%d(%d:%d), blocktime=%d\n",
174 gtid, team->t.t_id, tid, get__blocktime( team, tid ) ) );
175 return get__blocktime( team, tid );
181 FTN_SET_LIBRARY_SERIAL(
void )
184 __kmps_set_library( library_serial );
187 __kmp_user_set_library( library_serial );
192 FTN_SET_LIBRARY_TURNAROUND(
void )
195 __kmps_set_library( library_turnaround );
198 __kmp_user_set_library( library_turnaround );
203 FTN_SET_LIBRARY_THROUGHPUT(
void )
206 __kmps_set_library( library_throughput );
209 __kmp_user_set_library( library_throughput );
214 FTN_SET_LIBRARY(
int KMP_DEREF arg )
217 __kmps_set_library( KMP_DEREF arg );
219 enum library_type lib;
220 lib = (
enum library_type) KMP_DEREF arg;
222 __kmp_user_set_library( lib );
227 FTN_GET_LIBRARY (
void)
230 return __kmps_get_library();
232 if ( ! __kmp_init_serial ) {
233 __kmp_serial_initialize();
235 return ((
int) __kmp_library);
242 FTN_SET_AFFINITY(
void **mask )
244 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
247 if ( ! TCR_4(__kmp_init_middle) ) {
248 __kmp_middle_initialize();
250 return __kmp_aux_set_affinity( mask );
255 FTN_GET_AFFINITY(
void **mask )
257 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
260 if ( ! TCR_4(__kmp_init_middle) ) {
261 __kmp_middle_initialize();
263 return __kmp_aux_get_affinity( mask );
268 FTN_GET_AFFINITY_MAX_PROC(
void )
270 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
276 if ( ! TCR_4(__kmp_init_middle) ) {
277 __kmp_middle_initialize();
279 if ( ! ( KMP_AFFINITY_CAPABLE() ) ) {
283 #if KMP_OS_WINDOWS && KMP_ARCH_X86_64
284 if ( __kmp_num_proc_groups <= 1 ) {
285 return KMP_CPU_SETSIZE;
293 FTN_CREATE_AFFINITY_MASK(
void **mask )
295 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
301 if ( ! TCR_4(__kmp_init_middle) ) {
302 __kmp_middle_initialize();
304 *mask = kmpc_malloc( __kmp_affin_mask_size );
305 KMP_CPU_ZERO( (kmp_affin_mask_t *)(*mask) );
310 FTN_DESTROY_AFFINITY_MASK(
void **mask )
312 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
318 if ( ! TCR_4(__kmp_init_middle) ) {
319 __kmp_middle_initialize();
321 if ( __kmp_env_consistency_check ) {
322 if ( *mask == NULL ) {
323 KMP_FATAL( AffinityInvalidMask,
"kmp_destroy_affinity_mask" );
332 FTN_SET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask )
334 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
337 if ( ! TCR_4(__kmp_init_middle) ) {
338 __kmp_middle_initialize();
340 return __kmp_aux_set_affinity_mask_proc( KMP_DEREF proc, mask );
345 FTN_UNSET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask )
347 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
350 if ( ! TCR_4(__kmp_init_middle) ) {
351 __kmp_middle_initialize();
353 return __kmp_aux_unset_affinity_mask_proc( KMP_DEREF proc, mask );
358 FTN_GET_AFFINITY_MASK_PROC(
int KMP_DEREF proc,
void **mask )
360 #if defined(KMP_STUB) || !(KMP_OS_WINDOWS || KMP_OS_LINUX)
363 if ( ! TCR_4(__kmp_init_middle) ) {
364 __kmp_middle_initialize();
366 return __kmp_aux_get_affinity_mask_proc( KMP_DEREF proc, mask );
378 FTN_SET_NUM_THREADS(
int KMP_DEREF arg )
383 __kmp_set_num_threads( KMP_DEREF arg, __kmp_entry_gtid() );
390 FTN_GET_NUM_THREADS(
void )
401 FTN_GET_MAX_THREADS(
void )
408 if ( ! TCR_4(__kmp_init_middle) ) {
409 __kmp_middle_initialize();
411 gtid = __kmp_entry_gtid();
412 thread = __kmp_threads[ gtid ];
415 return thread -> th.th_current_task -> td_icvs.nproc;
417 return thread -> th.th_team -> t.t_set_nproc[ thread->th.th_info.ds.ds_tid ];
423 FTN_GET_THREAD_NUM(
void )
431 gtid = __kmp_entry_gtid();
433 if (!__kmp_init_parallel ||
434 (gtid = ((kmp_intptr_t)TlsGetValue( __kmp_gtid_threadprivate_key ))) == 0) {
441 #ifdef KMP_TDATA_GTID
442 if ( __kmp_gtid_mode >= 3 ) {
443 if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
448 if (!__kmp_init_parallel ||
449 (gtid = (kmp_intptr_t)(pthread_getspecific( __kmp_gtid_threadprivate_key ))) == 0) {
453 #ifdef KMP_TDATA_GTID
457 #error Unknown or unsupported OS
460 return __kmp_tid_from_gtid( gtid );
465 FTN_GET_NUM_KNOWN_THREADS(
void )
470 if ( ! __kmp_init_serial ) {
471 __kmp_serial_initialize();
475 return TCR_4(__kmp_nth);
480 FTN_GET_NUM_PROCS(
void )
486 if ( ! TCR_4(__kmp_init_middle) ) {
487 __kmp_middle_initialize();
489 return __kmp_avail_proc;
494 FTN_SET_NESTED(
int KMP_DEREF flag )
497 __kmps_set_nested( KMP_DEREF flag );
501 thread = __kmp_entry_thread();
502 __kmp_save_internal_controls( thread );
503 set__nested( thread, ( (KMP_DEREF flag) ? TRUE : FALSE ) );
509 FTN_GET_NESTED(
void )
512 return __kmps_get_nested();
515 thread = __kmp_entry_thread();
516 return get__nested( thread );
521 FTN_SET_DYNAMIC(
int KMP_DEREF flag )
524 __kmps_set_dynamic( KMP_DEREF flag ? TRUE : FALSE );
528 thread = __kmp_entry_thread();
530 __kmp_save_internal_controls( thread );
531 set__dynamic( thread, KMP_DEREF flag ? TRUE : FALSE );
537 FTN_GET_DYNAMIC(
void )
540 return __kmps_get_dynamic();
543 thread = __kmp_entry_thread();
544 return get__dynamic( thread );
549 FTN_IN_PARALLEL(
void )
554 kmp_info_t *th = __kmp_entry_thread();
556 if ( th->th.th_team_microtask ) {
561 return ( th->th.th_team->t.t_active_level ? 1 : 0 );
565 return ( th->th.th_root->r.r_in_parallel ? FTN_TRUE : FTN_FALSE );
572 FTN_SET_SCHEDULE( kmp_sched_t KMP_DEREF kind,
int KMP_DEREF modifier )
575 __kmps_set_schedule( KMP_DEREF kind, KMP_DEREF modifier );
579 __kmp_set_schedule( __kmp_entry_gtid(), KMP_DEREF kind, KMP_DEREF modifier );
584 FTN_GET_SCHEDULE( kmp_sched_t * kind,
int * modifier )
587 __kmps_get_schedule( kind, modifier );
591 __kmp_get_schedule( __kmp_entry_gtid(), kind, modifier );
596 FTN_SET_MAX_ACTIVE_LEVELS(
int KMP_DEREF arg )
603 __kmp_set_max_active_levels( __kmp_entry_gtid(), KMP_DEREF arg );
608 FTN_GET_MAX_ACTIVE_LEVELS(
void )
615 return __kmp_get_max_active_levels( __kmp_entry_gtid() );
620 FTN_GET_ACTIVE_LEVEL(
void )
627 return __kmp_entry_thread() -> th.th_team -> t.t_active_level;
632 FTN_GET_LEVEL(
void )
639 return __kmp_entry_thread() -> th.th_team -> t.t_level;
644 FTN_GET_ANCESTOR_THREAD_NUM(
int KMP_DEREF level )
647 return ( KMP_DEREF level ) ? ( -1 ) : ( 0 );
649 return __kmp_get_ancestor_thread_num( __kmp_entry_gtid(), KMP_DEREF level );
654 FTN_GET_TEAM_SIZE(
int KMP_DEREF level )
657 return ( KMP_DEREF level ) ? ( -1 ) : ( 1 );
659 return __kmp_get_team_size( __kmp_entry_gtid(), KMP_DEREF level );
664 FTN_GET_THREAD_LIMIT(
void )
669 if ( ! __kmp_init_serial ) {
670 __kmp_serial_initialize();
673 return __kmp_max_nth;
683 if ( ! TCR_4(__kmp_init_parallel) ) {
686 return __kmp_entry_thread() -> th.th_current_task -> td_flags.final;
690 #endif // OMP_30_ENABLED
695 kmp_proc_bind_t FTN_STDCALL
696 FTN_GET_PROC_BIND(
void )
699 return __kmps_get_proc_bind();
701 return get__proc_bind( __kmp_entry_thread() );
706 FTN_GET_NUM_TEAMS(
void )
711 kmp_info_t *thr = __kmp_entry_thread();
712 if ( thr->th.th_team_microtask ) {
713 kmp_team_t *team = thr->th.th_team;
714 int tlevel = thr->th.th_teams_level;
715 int ii = team->t.t_level;
716 int dd = team -> t.t_serialized;
717 int level = tlevel + 1;
718 KMP_DEBUG_ASSERT( ii >= tlevel );
721 for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
724 if( team -> t.t_serialized && ( !dd ) ) {
725 team = team->t.t_parent;
729 team = team->t.t_parent;
736 return team->t.t_parent->t.t_nproc;
745 FTN_GET_TEAM_NUM(
void )
750 kmp_info_t *thr = __kmp_entry_thread();
751 if ( thr->th.th_team_microtask ) {
752 kmp_team_t *team = thr->th.th_team;
753 int tlevel = thr->th.th_teams_level;
754 int ii = team->t.t_level;
755 int dd = team -> t.t_serialized;
756 int level = tlevel + 1;
757 KMP_DEBUG_ASSERT( ii >= tlevel );
760 for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
763 if( team -> t.t_serialized && ( !dd ) ) {
764 team = team->t.t_parent;
768 team = team->t.t_parent;
775 return team->t.t_master_tid;
783 #if KMP_MIC || KMP_OS_DARWIN
785 static int __kmp_default_device = 0;
788 FTN_GET_DEFAULT_DEVICE(
void )
790 return __kmp_default_device;
794 FTN_SET_DEFAULT_DEVICE(
int KMP_DEREF arg )
796 __kmp_default_device = KMP_DEREF arg;
800 FTN_GET_NUM_DEVICES(
void )
805 #endif // KMP_MIC || KMP_OS_DARWIN
807 #endif // OMP_40_ENABLED
810 typedef enum { UNINIT = -1, UNLOCKED, LOCKED } kmp_stub_lock_t;
815 FTN_INIT_LOCK(
void **user_lock )
818 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
820 __kmpc_init_lock( NULL, __kmp_entry_gtid(), user_lock );
826 FTN_INIT_NEST_LOCK(
void **user_lock )
829 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
831 __kmpc_init_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
836 FTN_DESTROY_LOCK(
void **user_lock )
839 *((kmp_stub_lock_t *)user_lock) = UNINIT;
841 __kmpc_destroy_lock( NULL, __kmp_entry_gtid(), user_lock );
846 FTN_DESTROY_NEST_LOCK(
void **user_lock )
849 *((kmp_stub_lock_t *)user_lock) = UNINIT;
851 __kmpc_destroy_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
856 FTN_SET_LOCK(
void **user_lock )
859 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
862 if ( *((kmp_stub_lock_t *)user_lock) != UNLOCKED ) {
865 *((kmp_stub_lock_t *)user_lock) = LOCKED;
867 __kmpc_set_lock( NULL, __kmp_entry_gtid(), user_lock );
872 FTN_SET_NEST_LOCK(
void **user_lock )
875 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
878 (*((
int *)user_lock))++;
880 __kmpc_set_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
885 FTN_UNSET_LOCK(
void **user_lock )
888 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
891 if ( *((kmp_stub_lock_t *)user_lock) == UNLOCKED ) {
894 *((kmp_stub_lock_t *)user_lock) = UNLOCKED;
896 __kmpc_unset_lock( NULL, __kmp_entry_gtid(), user_lock );
901 FTN_UNSET_NEST_LOCK(
void **user_lock )
904 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
907 if ( *((kmp_stub_lock_t *)user_lock) == UNLOCKED ) {
910 (*((
int *)user_lock))--;
912 __kmpc_unset_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
917 FTN_TEST_LOCK(
void **user_lock )
920 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
923 if ( *((kmp_stub_lock_t *)user_lock) == LOCKED ) {
926 *((kmp_stub_lock_t *)user_lock) = LOCKED;
929 return __kmpc_test_lock( NULL, __kmp_entry_gtid(), user_lock );
934 FTN_TEST_NEST_LOCK(
void **user_lock )
937 if ( *((kmp_stub_lock_t *)user_lock) == UNINIT ) {
940 return ++(*((
int *)user_lock));
942 return __kmpc_test_nest_lock( NULL, __kmp_entry_gtid(), user_lock );
947 FTN_GET_WTIME(
void )
950 return __kmps_get_wtime();
956 if ( ! __kmp_init_serial ) {
957 __kmp_serial_initialize();
960 __kmp_elapsed( & data );
966 FTN_GET_WTICK(
void )
969 return __kmps_get_wtick();
972 if ( ! __kmp_init_serial ) {
973 __kmp_serial_initialize();
975 __kmp_elapsed_tick( & data );
983 FTN_MALLOC(
size_t KMP_DEREF size )
986 return kmpc_malloc( KMP_DEREF size );
990 FTN_CALLOC(
size_t KMP_DEREF nelem,
size_t KMP_DEREF elsize )
993 return kmpc_calloc( KMP_DEREF nelem, KMP_DEREF elsize );
997 FTN_REALLOC(
void * KMP_DEREF ptr,
size_t KMP_DEREF size )
1000 return kmpc_realloc( KMP_DEREF ptr, KMP_DEREF size );
1004 FTN_FREE(
void * KMP_DEREF ptr )
1007 kmpc_free( KMP_DEREF ptr );
1011 FTN_SET_WARNINGS_ON(
void )
1014 __kmp_generate_warnings = kmp_warnings_explicit;
1019 FTN_SET_WARNINGS_OFF(
void )
1022 __kmp_generate_warnings = FALSE;
1027 FTN_SET_DEFAULTS(
char const * str
1028 #ifndef PASS_ARGS_BY_VALUE
1034 #ifdef PASS_ARGS_BY_VALUE
1035 int len = strlen( str );
1037 __kmp_aux_set_defaults( str, len );
1046 #endif // __cplusplus