xref: /freebsd/contrib/llvm-project/openmp/runtime/src/kmp_global.cpp (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
10b57cec5SDimitry Andric /*
20b57cec5SDimitry Andric  * kmp_global.cpp -- KPTS global variables for runtime support library
30b57cec5SDimitry Andric  */
40b57cec5SDimitry Andric 
50b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
80b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
90b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "kmp.h"
140b57cec5SDimitry Andric #include "kmp_affinity.h"
150b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED
160b57cec5SDimitry Andric #include "kmp_dispatch_hier.h"
170b57cec5SDimitry Andric #endif
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric kmp_key_t __kmp_gtid_threadprivate_key;
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric #if KMP_ARCH_X86 || KMP_ARCH_X86_64
220b57cec5SDimitry Andric kmp_cpuinfo_t __kmp_cpuinfo = {0}; // Not initialized
230b57cec5SDimitry Andric #endif
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric #if KMP_STATS_ENABLED
260b57cec5SDimitry Andric #include "kmp_stats.h"
270b57cec5SDimitry Andric // lock for modifying the global __kmp_stats_list
280b57cec5SDimitry Andric kmp_tas_lock_t __kmp_stats_lock;
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric // global list of per thread stats, the head is a sentinel node which
310b57cec5SDimitry Andric // accumulates all stats produced before __kmp_create_worker is called.
320b57cec5SDimitry Andric kmp_stats_list *__kmp_stats_list;
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric // thread local pointer to stats node within list
350b57cec5SDimitry Andric KMP_THREAD_LOCAL kmp_stats_list *__kmp_stats_thread_ptr = NULL;
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric // gives reference tick for all events (considered the 0 tick)
380b57cec5SDimitry Andric tsc_tick_count __kmp_stats_start_time;
390b57cec5SDimitry Andric #endif
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric /* ----------------------------------------------------- */
420b57cec5SDimitry Andric /* INITIALIZATION VARIABLES */
430b57cec5SDimitry Andric /* they are syncronized to write during init, but read anytime */
440b57cec5SDimitry Andric volatile int __kmp_init_serial = FALSE;
450b57cec5SDimitry Andric volatile int __kmp_init_gtid = FALSE;
460b57cec5SDimitry Andric volatile int __kmp_init_common = FALSE;
47fcaf7f86SDimitry Andric volatile int __kmp_need_register_serial = TRUE;
480b57cec5SDimitry Andric volatile int __kmp_init_middle = FALSE;
490b57cec5SDimitry Andric volatile int __kmp_init_parallel = FALSE;
50e8d8bef9SDimitry Andric volatile int __kmp_init_hidden_helper = FALSE;
51e8d8bef9SDimitry Andric volatile int __kmp_init_hidden_helper_threads = FALSE;
52e8d8bef9SDimitry Andric volatile int __kmp_hidden_helper_team_done = FALSE;
530b57cec5SDimitry Andric #if KMP_USE_MONITOR
540b57cec5SDimitry Andric volatile int __kmp_init_monitor =
550b57cec5SDimitry Andric     0; /* 1 - launched, 2 - actually started (Windows* OS only) */
560b57cec5SDimitry Andric #endif
570b57cec5SDimitry Andric volatile int __kmp_init_user_locks = FALSE;
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric /* list of address of allocated caches for commons */
600b57cec5SDimitry Andric kmp_cached_addr_t *__kmp_threadpriv_cache_list = NULL;
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric int __kmp_init_counter = 0;
630b57cec5SDimitry Andric int __kmp_root_counter = 0;
640b57cec5SDimitry Andric int __kmp_version = 0;
650b57cec5SDimitry Andric 
6606c3fb27SDimitry Andric std::atomic<kmp_int32> __kmp_team_counter = 0;
6706c3fb27SDimitry Andric std::atomic<kmp_int32> __kmp_task_counter = 0;
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric size_t __kmp_stksize = KMP_DEFAULT_STKSIZE;
700b57cec5SDimitry Andric #if KMP_USE_MONITOR
710b57cec5SDimitry Andric size_t __kmp_monitor_stksize = 0; // auto adjust
720b57cec5SDimitry Andric #endif
730b57cec5SDimitry Andric size_t __kmp_stkoffset = KMP_DEFAULT_STKOFFSET;
740b57cec5SDimitry Andric int __kmp_stkpadding = KMP_MIN_STKPADDING;
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric size_t __kmp_malloc_pool_incr = KMP_DEFAULT_MALLOC_POOL_INCR;
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric // Barrier method defaults, settings, and strings.
790b57cec5SDimitry Andric // branch factor = 2^branch_bits (only relevant for tree & hyper barrier types)
800b57cec5SDimitry Andric kmp_uint32 __kmp_barrier_gather_bb_dflt = 2;
810b57cec5SDimitry Andric /* branch_factor = 4 */ /* hyper2: C78980 */
820b57cec5SDimitry Andric kmp_uint32 __kmp_barrier_release_bb_dflt = 2;
830b57cec5SDimitry Andric /* branch_factor = 4 */ /* hyper2: C78980 */
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric kmp_bar_pat_e __kmp_barrier_gather_pat_dflt = bp_hyper_bar;
860b57cec5SDimitry Andric /* hyper2: C78980 */
870b57cec5SDimitry Andric kmp_bar_pat_e __kmp_barrier_release_pat_dflt = bp_hyper_bar;
880b57cec5SDimitry Andric /* hyper2: C78980 */
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric kmp_uint32 __kmp_barrier_gather_branch_bits[bs_last_barrier] = {0};
910b57cec5SDimitry Andric kmp_uint32 __kmp_barrier_release_branch_bits[bs_last_barrier] = {0};
920b57cec5SDimitry Andric kmp_bar_pat_e __kmp_barrier_gather_pattern[bs_last_barrier] = {bp_linear_bar};
930b57cec5SDimitry Andric kmp_bar_pat_e __kmp_barrier_release_pattern[bs_last_barrier] = {bp_linear_bar};
940b57cec5SDimitry Andric char const *__kmp_barrier_branch_bit_env_name[bs_last_barrier] = {
950b57cec5SDimitry Andric     "KMP_PLAIN_BARRIER", "KMP_FORKJOIN_BARRIER"
960b57cec5SDimitry Andric #if KMP_FAST_REDUCTION_BARRIER
970b57cec5SDimitry Andric     ,
980b57cec5SDimitry Andric     "KMP_REDUCTION_BARRIER"
990b57cec5SDimitry Andric #endif // KMP_FAST_REDUCTION_BARRIER
1000b57cec5SDimitry Andric };
1010b57cec5SDimitry Andric char const *__kmp_barrier_pattern_env_name[bs_last_barrier] = {
1020b57cec5SDimitry Andric     "KMP_PLAIN_BARRIER_PATTERN", "KMP_FORKJOIN_BARRIER_PATTERN"
1030b57cec5SDimitry Andric #if KMP_FAST_REDUCTION_BARRIER
1040b57cec5SDimitry Andric     ,
1050b57cec5SDimitry Andric     "KMP_REDUCTION_BARRIER_PATTERN"
1060b57cec5SDimitry Andric #endif // KMP_FAST_REDUCTION_BARRIER
1070b57cec5SDimitry Andric };
1080b57cec5SDimitry Andric char const *__kmp_barrier_type_name[bs_last_barrier] = {"plain", "forkjoin"
1090b57cec5SDimitry Andric #if KMP_FAST_REDUCTION_BARRIER
1100b57cec5SDimitry Andric                                                         ,
1110b57cec5SDimitry Andric                                                         "reduction"
1120b57cec5SDimitry Andric #endif // KMP_FAST_REDUCTION_BARRIER
1130b57cec5SDimitry Andric };
114349cc55cSDimitry Andric char const *__kmp_barrier_pattern_name[bp_last_bar] = {
115349cc55cSDimitry Andric     "linear", "tree", "hyper", "hierarchical", "dist"};
1160b57cec5SDimitry Andric 
1170b57cec5SDimitry Andric int __kmp_allThreadsSpecified = 0;
1180b57cec5SDimitry Andric size_t __kmp_align_alloc = CACHE_LINE;
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric int __kmp_generate_warnings = kmp_warnings_low;
1210b57cec5SDimitry Andric int __kmp_reserve_warn = 0;
1220b57cec5SDimitry Andric int __kmp_xproc = 0;
1230b57cec5SDimitry Andric int __kmp_avail_proc = 0;
1240b57cec5SDimitry Andric size_t __kmp_sys_min_stksize = KMP_MIN_STKSIZE;
1250b57cec5SDimitry Andric int __kmp_sys_max_nth = KMP_MAX_NTH;
1260b57cec5SDimitry Andric int __kmp_max_nth = 0;
1270b57cec5SDimitry Andric int __kmp_cg_max_nth = 0;
1285f757f3fSDimitry Andric int __kmp_task_max_nth = 0;
1290b57cec5SDimitry Andric int __kmp_teams_max_nth = 0;
1300b57cec5SDimitry Andric int __kmp_threads_capacity = 0;
1310b57cec5SDimitry Andric int __kmp_dflt_team_nth = 0;
1320b57cec5SDimitry Andric int __kmp_dflt_team_nth_ub = 0;
1330b57cec5SDimitry Andric int __kmp_tp_capacity = 0;
1340b57cec5SDimitry Andric int __kmp_tp_cached = 0;
1350b57cec5SDimitry Andric int __kmp_dispatch_num_buffers = KMP_DFLT_DISP_NUM_BUFF;
1360b57cec5SDimitry Andric int __kmp_dflt_max_active_levels = 1; // Nesting off by default
1370b57cec5SDimitry Andric bool __kmp_dflt_max_active_levels_set = false; // Don't override set value
1380b57cec5SDimitry Andric #if KMP_NESTED_HOT_TEAMS
1390b57cec5SDimitry Andric int __kmp_hot_teams_mode = 0; /* 0 - free extra threads when reduced */
1400b57cec5SDimitry Andric /* 1 - keep extra threads when reduced */
1410b57cec5SDimitry Andric int __kmp_hot_teams_max_level = 1; /* nesting level of hot teams */
1420b57cec5SDimitry Andric #endif
1430b57cec5SDimitry Andric enum library_type __kmp_library = library_none;
1440b57cec5SDimitry Andric enum sched_type __kmp_sched =
1450b57cec5SDimitry Andric     kmp_sch_default; /* scheduling method for runtime scheduling */
1460b57cec5SDimitry Andric enum sched_type __kmp_static =
1470b57cec5SDimitry Andric     kmp_sch_static_greedy; /* default static scheduling method */
1480b57cec5SDimitry Andric enum sched_type __kmp_guided =
1490b57cec5SDimitry Andric     kmp_sch_guided_iterative_chunked; /* default guided scheduling method */
1500b57cec5SDimitry Andric enum sched_type __kmp_auto =
1510b57cec5SDimitry Andric     kmp_sch_guided_analytical_chunked; /* default auto scheduling method */
1520b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED
1530b57cec5SDimitry Andric int __kmp_dispatch_hand_threading = 0;
1540b57cec5SDimitry Andric int __kmp_hier_max_units[kmp_hier_layer_e::LAYER_LAST + 1];
1550b57cec5SDimitry Andric int __kmp_hier_threads_per[kmp_hier_layer_e::LAYER_LAST + 1];
1560b57cec5SDimitry Andric kmp_hier_sched_env_t __kmp_hier_scheds = {0, 0, NULL, NULL, NULL};
1570b57cec5SDimitry Andric #endif
1585f757f3fSDimitry Andric int __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME; // in microseconds
1595f757f3fSDimitry Andric char __kmp_blocktime_units = 'm'; // Units specified in KMP_BLOCKTIME
16081ad6265SDimitry Andric bool __kmp_wpolicy_passive = false;
1610b57cec5SDimitry Andric #if KMP_USE_MONITOR
1620b57cec5SDimitry Andric int __kmp_monitor_wakeups = KMP_MIN_MONITOR_WAKEUPS;
1630b57cec5SDimitry Andric int __kmp_bt_intervals = KMP_INTERVALS_FROM_BLOCKTIME(KMP_DEFAULT_BLOCKTIME,
1640b57cec5SDimitry Andric                                                       KMP_MIN_MONITOR_WAKEUPS);
1650b57cec5SDimitry Andric #endif
1660b57cec5SDimitry Andric #ifdef KMP_ADJUST_BLOCKTIME
1670b57cec5SDimitry Andric int __kmp_zero_bt = FALSE;
1680b57cec5SDimitry Andric #endif /* KMP_ADJUST_BLOCKTIME */
1690b57cec5SDimitry Andric #ifdef KMP_DFLT_NTH_CORES
1700b57cec5SDimitry Andric int __kmp_ncores = 0;
1710b57cec5SDimitry Andric #endif
1720b57cec5SDimitry Andric int __kmp_chunk = 0;
173fe6060f1SDimitry Andric int __kmp_force_monotonic = 0;
1740b57cec5SDimitry Andric int __kmp_abort_delay = 0;
175*1db9f3b2SDimitry Andric #if (KMP_OS_LINUX || KMP_OS_AIX) && defined(KMP_TDATA_GTID)
1760b57cec5SDimitry Andric int __kmp_gtid_mode = 3; /* use __declspec(thread) TLS to store gtid */
1770b57cec5SDimitry Andric int __kmp_adjust_gtid_mode = FALSE;
1780b57cec5SDimitry Andric #elif KMP_OS_WINDOWS
1790b57cec5SDimitry Andric int __kmp_gtid_mode = 2; /* use TLS functions to store gtid */
1800b57cec5SDimitry Andric int __kmp_adjust_gtid_mode = FALSE;
1810b57cec5SDimitry Andric #else
1820b57cec5SDimitry Andric int __kmp_gtid_mode = 0; /* select method to get gtid based on #threads */
1830b57cec5SDimitry Andric int __kmp_adjust_gtid_mode = TRUE;
1840b57cec5SDimitry Andric #endif /* KMP_OS_LINUX && defined(KMP_TDATA_GTID) */
1850b57cec5SDimitry Andric #ifdef KMP_TDATA_GTID
1860b57cec5SDimitry Andric KMP_THREAD_LOCAL int __kmp_gtid = KMP_GTID_DNE;
1870b57cec5SDimitry Andric #endif /* KMP_TDATA_GTID */
1880b57cec5SDimitry Andric int __kmp_tls_gtid_min = INT_MAX;
1890b57cec5SDimitry Andric int __kmp_foreign_tp = TRUE;
1900b57cec5SDimitry Andric #if KMP_ARCH_X86 || KMP_ARCH_X86_64
1910b57cec5SDimitry Andric int __kmp_inherit_fp_control = TRUE;
1920b57cec5SDimitry Andric kmp_int16 __kmp_init_x87_fpu_control_word = 0;
1930b57cec5SDimitry Andric kmp_uint32 __kmp_init_mxcsr = 0;
1940b57cec5SDimitry Andric #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
1950b57cec5SDimitry Andric 
1960b57cec5SDimitry Andric #ifdef USE_LOAD_BALANCE
1970b57cec5SDimitry Andric double __kmp_load_balance_interval = 1.0;
1980b57cec5SDimitry Andric #endif /* USE_LOAD_BALANCE */
1990b57cec5SDimitry Andric 
2000b57cec5SDimitry Andric kmp_nested_nthreads_t __kmp_nested_nth = {NULL, 0, 0};
2010b57cec5SDimitry Andric 
2020b57cec5SDimitry Andric #if KMP_USE_ADAPTIVE_LOCKS
2030b57cec5SDimitry Andric 
2040b57cec5SDimitry Andric kmp_adaptive_backoff_params_t __kmp_adaptive_backoff_params = {
2050b57cec5SDimitry Andric     1, 1024}; // TODO: tune it!
2060b57cec5SDimitry Andric 
2070b57cec5SDimitry Andric #if KMP_DEBUG_ADAPTIVE_LOCKS
2080b57cec5SDimitry Andric const char *__kmp_speculative_statsfile = "-";
2090b57cec5SDimitry Andric #endif
2100b57cec5SDimitry Andric 
2110b57cec5SDimitry Andric #endif // KMP_USE_ADAPTIVE_LOCKS
2120b57cec5SDimitry Andric 
2130b57cec5SDimitry Andric int __kmp_display_env = FALSE;
2140b57cec5SDimitry Andric int __kmp_display_env_verbose = FALSE;
2150b57cec5SDimitry Andric int __kmp_omp_cancellation = FALSE;
216fe6060f1SDimitry Andric int __kmp_nteams = 0;
217fe6060f1SDimitry Andric int __kmp_teams_thread_limit = 0;
2180b57cec5SDimitry Andric 
219e8d8bef9SDimitry Andric #if KMP_HAVE_MWAIT || KMP_HAVE_UMWAIT
220e8d8bef9SDimitry Andric int __kmp_user_level_mwait = FALSE;
221e8d8bef9SDimitry Andric int __kmp_umwait_enabled = FALSE;
222e8d8bef9SDimitry Andric int __kmp_mwait_enabled = FALSE;
223e8d8bef9SDimitry Andric int __kmp_mwait_hints = 0;
224e8d8bef9SDimitry Andric #endif
225e8d8bef9SDimitry Andric 
22604eeddc0SDimitry Andric #if KMP_HAVE_UMWAIT
22704eeddc0SDimitry Andric int __kmp_waitpkg_enabled = 0;
22804eeddc0SDimitry Andric int __kmp_tpause_state = 0;
22904eeddc0SDimitry Andric int __kmp_tpause_hint = 1;
23004eeddc0SDimitry Andric int __kmp_tpause_enabled = 0;
23104eeddc0SDimitry Andric #endif
23204eeddc0SDimitry Andric 
2330b57cec5SDimitry Andric /* map OMP 3.0 schedule types with our internal schedule types */
2340b57cec5SDimitry Andric enum sched_type __kmp_sch_map[kmp_sched_upper - kmp_sched_lower_ext +
2350b57cec5SDimitry Andric                               kmp_sched_upper_std - kmp_sched_lower - 2] = {
2360b57cec5SDimitry Andric     kmp_sch_static_chunked, // ==> kmp_sched_static            = 1
2370b57cec5SDimitry Andric     kmp_sch_dynamic_chunked, // ==> kmp_sched_dynamic           = 2
2380b57cec5SDimitry Andric     kmp_sch_guided_chunked, // ==> kmp_sched_guided            = 3
2390b57cec5SDimitry Andric     kmp_sch_auto, // ==> kmp_sched_auto              = 4
2400b57cec5SDimitry Andric     kmp_sch_trapezoidal // ==> kmp_sched_trapezoidal       = 101
2410b57cec5SDimitry Andric     // will likely not be used, introduced here just to debug the code
2420b57cec5SDimitry Andric     // of public intel extension schedules
2430b57cec5SDimitry Andric };
2440b57cec5SDimitry Andric 
2450b57cec5SDimitry Andric #if KMP_OS_LINUX
2460b57cec5SDimitry Andric enum clock_function_type __kmp_clock_function;
2470b57cec5SDimitry Andric int __kmp_clock_function_param;
2480b57cec5SDimitry Andric #endif /* KMP_OS_LINUX */
2490b57cec5SDimitry Andric 
2500b57cec5SDimitry Andric #if KMP_MIC_SUPPORTED
2510b57cec5SDimitry Andric enum mic_type __kmp_mic_type = non_mic;
2520b57cec5SDimitry Andric #endif
2530b57cec5SDimitry Andric 
2540b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED
2550b57cec5SDimitry Andric 
2560b57cec5SDimitry Andric KMPAffinity *__kmp_affinity_dispatch = NULL;
2570b57cec5SDimitry Andric 
2580b57cec5SDimitry Andric #if KMP_USE_HWLOC
2590b57cec5SDimitry Andric int __kmp_hwloc_error = FALSE;
2600b57cec5SDimitry Andric hwloc_topology_t __kmp_hwloc_topology = NULL;
2610b57cec5SDimitry Andric #endif
2620b57cec5SDimitry Andric 
2630b57cec5SDimitry Andric #if KMP_OS_WINDOWS
2640b57cec5SDimitry Andric #if KMP_GROUP_AFFINITY
2650b57cec5SDimitry Andric int __kmp_num_proc_groups = 1;
2660b57cec5SDimitry Andric #endif /* KMP_GROUP_AFFINITY */
2670b57cec5SDimitry Andric kmp_GetActiveProcessorCount_t __kmp_GetActiveProcessorCount = NULL;
2680b57cec5SDimitry Andric kmp_GetActiveProcessorGroupCount_t __kmp_GetActiveProcessorGroupCount = NULL;
2690b57cec5SDimitry Andric kmp_GetThreadGroupAffinity_t __kmp_GetThreadGroupAffinity = NULL;
2700b57cec5SDimitry Andric kmp_SetThreadGroupAffinity_t __kmp_SetThreadGroupAffinity = NULL;
2710b57cec5SDimitry Andric #endif /* KMP_OS_WINDOWS */
2720b57cec5SDimitry Andric 
2730b57cec5SDimitry Andric size_t __kmp_affin_mask_size = 0;
2740b57cec5SDimitry Andric enum affinity_top_method __kmp_affinity_top_method =
2750b57cec5SDimitry Andric     affinity_top_method_default;
276bdd1243dSDimitry Andric 
277bdd1243dSDimitry Andric // Regular thread affinity settings from KMP_AFFINITY
278bdd1243dSDimitry Andric kmp_affinity_t __kmp_affinity = KMP_AFFINITY_INIT("KMP_AFFINITY");
279bdd1243dSDimitry Andric // Hidden helper thread affinity settings from KMP_HIDDEN_HELPER_AFFINITY
280bdd1243dSDimitry Andric kmp_affinity_t __kmp_hh_affinity =
281bdd1243dSDimitry Andric     KMP_AFFINITY_INIT("KMP_HIDDEN_HELPER_AFFINITY");
282bdd1243dSDimitry Andric kmp_affinity_t *__kmp_affinities[] = {&__kmp_affinity, &__kmp_hh_affinity};
2830b57cec5SDimitry Andric 
2840b57cec5SDimitry Andric char *__kmp_cpuinfo_file = NULL;
2855f757f3fSDimitry Andric #if KMP_WEIGHTED_ITERATIONS_SUPPORTED
2865f757f3fSDimitry Andric int __kmp_first_osid_with_ecore = -1;
2875f757f3fSDimitry Andric #endif
2880b57cec5SDimitry Andric 
2890b57cec5SDimitry Andric #endif /* KMP_AFFINITY_SUPPORTED */
2900b57cec5SDimitry Andric 
2910b57cec5SDimitry Andric kmp_nested_proc_bind_t __kmp_nested_proc_bind = {NULL, 0, 0};
292349cc55cSDimitry Andric kmp_proc_bind_t __kmp_teams_proc_bind = proc_bind_spread;
2930b57cec5SDimitry Andric int __kmp_affinity_num_places = 0;
2940b57cec5SDimitry Andric int __kmp_display_affinity = FALSE;
2950b57cec5SDimitry Andric char *__kmp_affinity_format = NULL;
2960b57cec5SDimitry Andric 
2970b57cec5SDimitry Andric kmp_int32 __kmp_default_device = 0;
2980b57cec5SDimitry Andric 
2990b57cec5SDimitry Andric kmp_tasking_mode_t __kmp_tasking_mode = tskm_task_teams;
3000b57cec5SDimitry Andric kmp_int32 __kmp_max_task_priority = 0;
3010b57cec5SDimitry Andric kmp_uint64 __kmp_taskloop_min_tasks = 0;
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric int __kmp_memkind_available = 0;
3040b57cec5SDimitry Andric omp_allocator_handle_t const omp_null_allocator = NULL;
3050b57cec5SDimitry Andric omp_allocator_handle_t const omp_default_mem_alloc =
3060b57cec5SDimitry Andric     (omp_allocator_handle_t const)1;
3070b57cec5SDimitry Andric omp_allocator_handle_t const omp_large_cap_mem_alloc =
3080b57cec5SDimitry Andric     (omp_allocator_handle_t const)2;
3090b57cec5SDimitry Andric omp_allocator_handle_t const omp_const_mem_alloc =
3100b57cec5SDimitry Andric     (omp_allocator_handle_t const)3;
3110b57cec5SDimitry Andric omp_allocator_handle_t const omp_high_bw_mem_alloc =
3120b57cec5SDimitry Andric     (omp_allocator_handle_t const)4;
3130b57cec5SDimitry Andric omp_allocator_handle_t const omp_low_lat_mem_alloc =
3140b57cec5SDimitry Andric     (omp_allocator_handle_t const)5;
3150b57cec5SDimitry Andric omp_allocator_handle_t const omp_cgroup_mem_alloc =
3160b57cec5SDimitry Andric     (omp_allocator_handle_t const)6;
3170b57cec5SDimitry Andric omp_allocator_handle_t const omp_pteam_mem_alloc =
3180b57cec5SDimitry Andric     (omp_allocator_handle_t const)7;
3190b57cec5SDimitry Andric omp_allocator_handle_t const omp_thread_mem_alloc =
3200b57cec5SDimitry Andric     (omp_allocator_handle_t const)8;
321fe6060f1SDimitry Andric omp_allocator_handle_t const llvm_omp_target_host_mem_alloc =
322fe6060f1SDimitry Andric     (omp_allocator_handle_t const)100;
323fe6060f1SDimitry Andric omp_allocator_handle_t const llvm_omp_target_shared_mem_alloc =
324fe6060f1SDimitry Andric     (omp_allocator_handle_t const)101;
325fe6060f1SDimitry Andric omp_allocator_handle_t const llvm_omp_target_device_mem_alloc =
326fe6060f1SDimitry Andric     (omp_allocator_handle_t const)102;
3270b57cec5SDimitry Andric omp_allocator_handle_t const kmp_max_mem_alloc =
3280b57cec5SDimitry Andric     (omp_allocator_handle_t const)1024;
3290b57cec5SDimitry Andric omp_allocator_handle_t __kmp_def_allocator = omp_default_mem_alloc;
3300b57cec5SDimitry Andric 
3310b57cec5SDimitry Andric omp_memspace_handle_t const omp_default_mem_space =
3320b57cec5SDimitry Andric     (omp_memspace_handle_t const)0;
3330b57cec5SDimitry Andric omp_memspace_handle_t const omp_large_cap_mem_space =
3340b57cec5SDimitry Andric     (omp_memspace_handle_t const)1;
3350b57cec5SDimitry Andric omp_memspace_handle_t const omp_const_mem_space =
3360b57cec5SDimitry Andric     (omp_memspace_handle_t const)2;
3370b57cec5SDimitry Andric omp_memspace_handle_t const omp_high_bw_mem_space =
3380b57cec5SDimitry Andric     (omp_memspace_handle_t const)3;
3390b57cec5SDimitry Andric omp_memspace_handle_t const omp_low_lat_mem_space =
3400b57cec5SDimitry Andric     (omp_memspace_handle_t const)4;
341fe6060f1SDimitry Andric omp_memspace_handle_t const llvm_omp_target_host_mem_space =
342fe6060f1SDimitry Andric     (omp_memspace_handle_t const)100;
343fe6060f1SDimitry Andric omp_memspace_handle_t const llvm_omp_target_shared_mem_space =
344fe6060f1SDimitry Andric     (omp_memspace_handle_t const)101;
345fe6060f1SDimitry Andric omp_memspace_handle_t const llvm_omp_target_device_mem_space =
346fe6060f1SDimitry Andric     (omp_memspace_handle_t const)102;
3470b57cec5SDimitry Andric 
3480b57cec5SDimitry Andric /* This check ensures that the compiler is passing the correct data type for the
3490b57cec5SDimitry Andric    flags formal parameter of the function kmpc_omp_task_alloc(). If the type is
3500b57cec5SDimitry Andric    not a 4-byte type, then give an error message about a non-positive length
3510b57cec5SDimitry Andric    array pointing here.  If that happens, the kmp_tasking_flags_t structure must
3520b57cec5SDimitry Andric    be redefined to have exactly 32 bits. */
3530b57cec5SDimitry Andric KMP_BUILD_ASSERT(sizeof(kmp_tasking_flags_t) == 4);
3540b57cec5SDimitry Andric 
3550b57cec5SDimitry Andric int __kmp_task_stealing_constraint = 1; /* Constrain task stealing by default */
3560b57cec5SDimitry Andric int __kmp_enable_task_throttling = 1;
3570b57cec5SDimitry Andric 
3580b57cec5SDimitry Andric #ifdef DEBUG_SUSPEND
3590b57cec5SDimitry Andric int __kmp_suspend_count = 0;
3600b57cec5SDimitry Andric #endif
3610b57cec5SDimitry Andric 
3620b57cec5SDimitry Andric int __kmp_settings = FALSE;
3630b57cec5SDimitry Andric int __kmp_duplicate_library_ok = 0;
3640b57cec5SDimitry Andric #if USE_ITT_BUILD
3650b57cec5SDimitry Andric int __kmp_forkjoin_frames = 1;
3660b57cec5SDimitry Andric int __kmp_forkjoin_frames_mode = 3;
3670b57cec5SDimitry Andric #endif
3680b57cec5SDimitry Andric PACKED_REDUCTION_METHOD_T __kmp_force_reduction_method =
3690b57cec5SDimitry Andric     reduction_method_not_defined;
3700b57cec5SDimitry Andric int __kmp_determ_red = FALSE;
3710b57cec5SDimitry Andric 
3720b57cec5SDimitry Andric #ifdef KMP_DEBUG
3730b57cec5SDimitry Andric int kmp_a_debug = 0;
3740b57cec5SDimitry Andric int kmp_b_debug = 0;
3750b57cec5SDimitry Andric int kmp_c_debug = 0;
3760b57cec5SDimitry Andric int kmp_d_debug = 0;
3770b57cec5SDimitry Andric int kmp_e_debug = 0;
3780b57cec5SDimitry Andric int kmp_f_debug = 0;
3790b57cec5SDimitry Andric int kmp_diag = 0;
3800b57cec5SDimitry Andric #endif
3810b57cec5SDimitry Andric 
3820b57cec5SDimitry Andric /* For debug information logging using rotating buffer */
3830b57cec5SDimitry Andric int __kmp_debug_buf =
3840b57cec5SDimitry Andric     FALSE; /* TRUE means use buffer, FALSE means print to stderr */
3850b57cec5SDimitry Andric int __kmp_debug_buf_lines =
3860b57cec5SDimitry Andric     KMP_DEBUG_BUF_LINES_INIT; /* Lines of debug stored in buffer */
3870b57cec5SDimitry Andric int __kmp_debug_buf_chars =
3880b57cec5SDimitry Andric     KMP_DEBUG_BUF_CHARS_INIT; /* Characters allowed per line in buffer */
3890b57cec5SDimitry Andric int __kmp_debug_buf_atomic =
3900b57cec5SDimitry Andric     FALSE; /* TRUE means use atomic update of buffer entry pointer */
3910b57cec5SDimitry Andric 
3920b57cec5SDimitry Andric char *__kmp_debug_buffer = NULL; /* Debug buffer itself */
3930b57cec5SDimitry Andric std::atomic<int> __kmp_debug_count =
39406c3fb27SDimitry Andric     0; /* number of lines printed in buffer so far */
3950b57cec5SDimitry Andric int __kmp_debug_buf_warn_chars =
3960b57cec5SDimitry Andric     0; /* Keep track of char increase recommended in warnings */
3970b57cec5SDimitry Andric /* end rotating debug buffer */
3980b57cec5SDimitry Andric 
3990b57cec5SDimitry Andric #ifdef KMP_DEBUG
4000b57cec5SDimitry Andric int __kmp_par_range; /* +1 => only go par for constructs in range */
4010b57cec5SDimitry Andric /* -1 => only go par for constructs outside range */
4020b57cec5SDimitry Andric char __kmp_par_range_routine[KMP_PAR_RANGE_ROUTINE_LEN] = {'\0'};
4030b57cec5SDimitry Andric char __kmp_par_range_filename[KMP_PAR_RANGE_FILENAME_LEN] = {'\0'};
4040b57cec5SDimitry Andric int __kmp_par_range_lb = 0;
4050b57cec5SDimitry Andric int __kmp_par_range_ub = INT_MAX;
4060b57cec5SDimitry Andric #endif /* KMP_DEBUG */
4070b57cec5SDimitry Andric 
4080b57cec5SDimitry Andric /* For printing out dynamic storage map for threads and teams */
4090b57cec5SDimitry Andric int __kmp_storage_map =
4100b57cec5SDimitry Andric     FALSE; /* True means print storage map for threads and teams */
4110b57cec5SDimitry Andric int __kmp_storage_map_verbose =
4120b57cec5SDimitry Andric     FALSE; /* True means storage map includes placement info */
4130b57cec5SDimitry Andric int __kmp_storage_map_verbose_specified = FALSE;
4140b57cec5SDimitry Andric /* Initialize the library data structures when we fork a child process, defaults
4150b57cec5SDimitry Andric  * to TRUE */
4160b57cec5SDimitry Andric int __kmp_need_register_atfork =
4170b57cec5SDimitry Andric     TRUE; /* At initialization, call pthread_atfork to install fork handler */
4180b57cec5SDimitry Andric int __kmp_need_register_atfork_specified = TRUE;
4190b57cec5SDimitry Andric 
4200b57cec5SDimitry Andric int __kmp_env_stksize = FALSE; /* KMP_STACKSIZE specified? */
4210b57cec5SDimitry Andric int __kmp_env_blocktime = FALSE; /* KMP_BLOCKTIME specified? */
4220b57cec5SDimitry Andric int __kmp_env_checks = FALSE; /* KMP_CHECKS specified?    */
4230b57cec5SDimitry Andric int __kmp_env_consistency_check = FALSE; /* KMP_CONSISTENCY_CHECK specified? */
4240b57cec5SDimitry Andric 
4250b57cec5SDimitry Andric // From KMP_USE_YIELD:
4260b57cec5SDimitry Andric // 0 = never yield;
4270b57cec5SDimitry Andric // 1 = always yield (default);
4280b57cec5SDimitry Andric // 2 = yield only if oversubscribed
42981ad6265SDimitry Andric #if KMP_OS_DARWIN && KMP_ARCH_AARCH64
43081ad6265SDimitry Andric // Set to 0 for environments where yield is slower
43181ad6265SDimitry Andric kmp_int32 __kmp_use_yield = 0;
43281ad6265SDimitry Andric #else
4330b57cec5SDimitry Andric kmp_int32 __kmp_use_yield = 1;
43481ad6265SDimitry Andric #endif
43581ad6265SDimitry Andric 
4360b57cec5SDimitry Andric // This will be 1 if KMP_USE_YIELD environment variable was set explicitly
4370b57cec5SDimitry Andric kmp_int32 __kmp_use_yield_exp_set = 0;
4380b57cec5SDimitry Andric 
4390b57cec5SDimitry Andric kmp_uint32 __kmp_yield_init = KMP_INIT_WAIT;
4400b57cec5SDimitry Andric kmp_uint32 __kmp_yield_next = KMP_NEXT_WAIT;
44104eeddc0SDimitry Andric kmp_uint64 __kmp_pause_init = 1; // for tpause
4420b57cec5SDimitry Andric 
4430b57cec5SDimitry Andric /* ------------------------------------------------------ */
4440b57cec5SDimitry Andric /* STATE mostly syncronized with global lock */
445fe6060f1SDimitry Andric /* data written to rarely by primary threads, read often by workers */
4460b57cec5SDimitry Andric /* TODO: None of this global padding stuff works consistently because the order
4470b57cec5SDimitry Andric    of declaration is not necessarily correlated to storage order. To fix this,
4480b57cec5SDimitry Andric    all the important globals must be put in a big structure instead. */
4490b57cec5SDimitry Andric KMP_ALIGN_CACHE
4500b57cec5SDimitry Andric kmp_info_t **__kmp_threads = NULL;
4510b57cec5SDimitry Andric kmp_root_t **__kmp_root = NULL;
45281ad6265SDimitry Andric kmp_old_threads_list_t *__kmp_old_threads_list = NULL;
4530b57cec5SDimitry Andric 
454fe6060f1SDimitry Andric /* data read/written to often by primary threads */
4550b57cec5SDimitry Andric KMP_ALIGN_CACHE
4560b57cec5SDimitry Andric volatile int __kmp_nth = 0;
4570b57cec5SDimitry Andric volatile int __kmp_all_nth = 0;
4580b57cec5SDimitry Andric volatile kmp_info_t *__kmp_thread_pool = NULL;
4590b57cec5SDimitry Andric volatile kmp_team_t *__kmp_team_pool = NULL;
4600b57cec5SDimitry Andric 
4610b57cec5SDimitry Andric KMP_ALIGN_CACHE
46206c3fb27SDimitry Andric std::atomic<int> __kmp_thread_pool_active_nth = 0;
4630b57cec5SDimitry Andric 
4640b57cec5SDimitry Andric /* -------------------------------------------------
4650b57cec5SDimitry Andric  * GLOBAL/ROOT STATE */
4660b57cec5SDimitry Andric KMP_ALIGN_CACHE
467489b1cf2SDimitry Andric kmp_global_t __kmp_global;
4680b57cec5SDimitry Andric 
4690b57cec5SDimitry Andric /* ----------------------------------------------- */
4700b57cec5SDimitry Andric /* GLOBAL SYNCHRONIZATION LOCKS */
4710b57cec5SDimitry Andric /* TODO verify the need for these locks and if they need to be global */
4720b57cec5SDimitry Andric 
4730b57cec5SDimitry Andric #if KMP_USE_INTERNODE_ALIGNMENT
4740b57cec5SDimitry Andric /* Multinode systems have larger cache line granularity which can cause
4750b57cec5SDimitry Andric  * false sharing if the alignment is not large enough for these locks */
4760b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4770b57cec5SDimitry Andric 
4780b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_initz_lock); /* Control initializations */
4790b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4800b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_forkjoin_lock); /* control fork/join access */
4810b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4820b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_exit_lock); /* exit() is not always thread-safe */
4830b57cec5SDimitry Andric #if KMP_USE_MONITOR
4840b57cec5SDimitry Andric /* control monitor thread creation */
4850b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4860b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_monitor_lock);
4870b57cec5SDimitry Andric #endif
4880b57cec5SDimitry Andric /* used for the hack to allow threadprivate cache and __kmp_threads expansion
4890b57cec5SDimitry Andric    to co-exist */
4900b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4910b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_tp_cached_lock);
4920b57cec5SDimitry Andric 
4930b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4940b57cec5SDimitry Andric KMP_LOCK_INIT(__kmp_global_lock); /* Control OS/global access */
4950b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4960b57cec5SDimitry Andric kmp_queuing_lock_t __kmp_dispatch_lock; /* Control dispatch access  */
4970b57cec5SDimitry Andric KMP_ALIGN_CACHE_INTERNODE
4980b57cec5SDimitry Andric KMP_LOCK_INIT(__kmp_debug_lock); /* Control I/O access for KMP_DEBUG */
4990b57cec5SDimitry Andric #else
5000b57cec5SDimitry Andric KMP_ALIGN_CACHE
5010b57cec5SDimitry Andric 
5020b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_initz_lock); /* Control initializations */
5030b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_forkjoin_lock); /* control fork/join access */
5040b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_exit_lock); /* exit() is not always thread-safe */
5050b57cec5SDimitry Andric #if KMP_USE_MONITOR
5060b57cec5SDimitry Andric /* control monitor thread creation */
5070b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_monitor_lock);
5080b57cec5SDimitry Andric #endif
5090b57cec5SDimitry Andric /* used for the hack to allow threadprivate cache and __kmp_threads expansion
5100b57cec5SDimitry Andric    to co-exist */
5110b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INIT(__kmp_tp_cached_lock);
5120b57cec5SDimitry Andric 
5130b57cec5SDimitry Andric KMP_ALIGN(128)
5140b57cec5SDimitry Andric KMP_LOCK_INIT(__kmp_global_lock); /* Control OS/global access */
5150b57cec5SDimitry Andric KMP_ALIGN(128)
5160b57cec5SDimitry Andric kmp_queuing_lock_t __kmp_dispatch_lock; /* Control dispatch access  */
5170b57cec5SDimitry Andric KMP_ALIGN(128)
5180b57cec5SDimitry Andric KMP_LOCK_INIT(__kmp_debug_lock); /* Control I/O access for KMP_DEBUG */
5190b57cec5SDimitry Andric #endif
5200b57cec5SDimitry Andric 
5210b57cec5SDimitry Andric /* ----------------------------------------------- */
5220b57cec5SDimitry Andric 
5230b57cec5SDimitry Andric #if KMP_HANDLE_SIGNALS
5240b57cec5SDimitry Andric /* Signal handling is disabled by default, because it confuses users: In case of
5250b57cec5SDimitry Andric    sigsegv (or other trouble) in user code signal handler catches the signal,
5260b57cec5SDimitry Andric    which then "appears" in the monitor thread (when the monitor executes raise()
5270b57cec5SDimitry Andric    function). Users see signal in the monitor thread and blame OpenMP RTL.
5280b57cec5SDimitry Andric 
5290b57cec5SDimitry Andric    Grant said signal handling required on some older OSes (Irix?) supported by
5300b57cec5SDimitry Andric    KAI, because bad applications hung but not aborted. Currently it is not a
5310b57cec5SDimitry Andric    problem for Linux* OS, OS X* and Windows* OS.
5320b57cec5SDimitry Andric 
5330b57cec5SDimitry Andric    Grant: Found new hangs for EL4, EL5, and a Fedora Core machine.  So I'm
5340b57cec5SDimitry Andric    putting the default back for now to see if that fixes hangs on those
5350b57cec5SDimitry Andric    machines.
5360b57cec5SDimitry Andric 
5370b57cec5SDimitry Andric    2010-04013 Lev: It was a bug in Fortran RTL. Fortran RTL prints a kind of
5380b57cec5SDimitry Andric    stack backtrace when program is aborting, but the code is not signal-safe.
5390b57cec5SDimitry Andric    When multiple signals raised at the same time (which occurs in dynamic
5400b57cec5SDimitry Andric    negative tests because all the worker threads detects the same error),
5410b57cec5SDimitry Andric    Fortran RTL may hang. The bug finally fixed in Fortran RTL library provided
5420b57cec5SDimitry Andric    by Steve R., and will be available soon. */
5430b57cec5SDimitry Andric int __kmp_handle_signals = FALSE;
5440b57cec5SDimitry Andric #endif
5450b57cec5SDimitry Andric 
5460b57cec5SDimitry Andric #ifdef DEBUG_SUSPEND
5470b57cec5SDimitry Andric int get_suspend_count_(void) {
5480b57cec5SDimitry Andric   int count = __kmp_suspend_count;
5490b57cec5SDimitry Andric   __kmp_suspend_count = 0;
5500b57cec5SDimitry Andric   return count;
5510b57cec5SDimitry Andric }
5520b57cec5SDimitry Andric void set_suspend_count_(int *value) { __kmp_suspend_count = *value; }
5530b57cec5SDimitry Andric #endif
5540b57cec5SDimitry Andric 
5550b57cec5SDimitry Andric kmp_target_offload_kind_t __kmp_target_offload = tgt_default;
5560b57cec5SDimitry Andric 
5570b57cec5SDimitry Andric // OMP Pause Resources
5580b57cec5SDimitry Andric kmp_pause_status_t __kmp_pause_status = kmp_not_paused;
5590b57cec5SDimitry Andric 
560fe6060f1SDimitry Andric // Nesting mode
561fe6060f1SDimitry Andric int __kmp_nesting_mode = 0;
562fe6060f1SDimitry Andric int __kmp_nesting_mode_nlevels = 1;
563fe6060f1SDimitry Andric int *__kmp_nesting_nth_level;
564fe6060f1SDimitry Andric 
56506c3fb27SDimitry Andric #if OMPX_TASKGRAPH
56606c3fb27SDimitry Andric // TDG record & replay
56706c3fb27SDimitry Andric int __kmp_tdg_dot = 0;
56806c3fb27SDimitry Andric kmp_int32 __kmp_max_tdgs = 100;
56906c3fb27SDimitry Andric kmp_tdg_info_t **__kmp_global_tdgs = NULL;
57006c3fb27SDimitry Andric kmp_int32 __kmp_curr_tdg_idx =
57106c3fb27SDimitry Andric     0; // Id of the current TDG being recorded or executed
57206c3fb27SDimitry Andric kmp_int32 __kmp_num_tdg = 0;
57306c3fb27SDimitry Andric kmp_int32 __kmp_successors_size = 10; // Initial succesor size list for
57406c3fb27SDimitry Andric                                       // recording
57506c3fb27SDimitry Andric std::atomic<kmp_int32> __kmp_tdg_task_id = 0;
57606c3fb27SDimitry Andric #endif
5770b57cec5SDimitry Andric // end of file //
57806c3fb27SDimitry Andric 
579