* kmp_global.cpp -- KPTS global variables for runtime support library
*/
#include "kmp.h"
#include "kmp_affinity.h"
#if KMP_USE_HIER_SCHED
#include "kmp_dispatch_hier.h"
#endif
kmp_key_t __kmp_gtid_threadprivate_key;
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
kmp_cpuinfo_t __kmp_cpuinfo = {0};
#endif
#if KMP_STATS_ENABLED
#include "kmp_stats.h"
kmp_tas_lock_t __kmp_stats_lock;
kmp_stats_list *__kmp_stats_list;
KMP_THREAD_LOCAL kmp_stats_list *__kmp_stats_thread_ptr = NULL;
tsc_tick_count __kmp_stats_start_time;
#endif
volatile int __kmp_init_serial = FALSE;
volatile int __kmp_init_gtid = FALSE;
volatile int __kmp_init_common = FALSE;
volatile int __kmp_need_register_serial = TRUE;
volatile int __kmp_init_middle = FALSE;
volatile int __kmp_init_parallel = FALSE;
volatile int __kmp_init_hidden_helper = FALSE;
volatile int __kmp_init_hidden_helper_threads = FALSE;
volatile int __kmp_hidden_helper_team_done = FALSE;
#if KMP_USE_MONITOR
volatile int __kmp_init_monitor =
0;
#endif
volatile int __kmp_init_user_locks = FALSE;
kmp_cached_addr_t *__kmp_threadpriv_cache_list = NULL;
int __kmp_init_counter = 0;
int __kmp_root_counter = 0;
int __kmp_version = 0;
std::atomic<kmp_int32> __kmp_team_counter = 0;
std::atomic<kmp_int32> __kmp_task_counter = 0;
size_t __kmp_stksize = KMP_DEFAULT_STKSIZE;
#if KMP_USE_MONITOR
size_t __kmp_monitor_stksize = 0;
#endif
size_t __kmp_stkoffset = KMP_DEFAULT_STKOFFSET;
int __kmp_stkpadding = KMP_MIN_STKPADDING;
size_t __kmp_malloc_pool_incr = KMP_DEFAULT_MALLOC_POOL_INCR;
kmp_uint32 __kmp_barrier_gather_bb_dflt = 2;
kmp_uint32 __kmp_barrier_release_bb_dflt = 2;
kmp_bar_pat_e __kmp_barrier_gather_pat_dflt = bp_hyper_bar;
kmp_bar_pat_e __kmp_barrier_release_pat_dflt = bp_hyper_bar;
kmp_uint32 __kmp_barrier_gather_branch_bits[bs_last_barrier] = {0};
kmp_uint32 __kmp_barrier_release_branch_bits[bs_last_barrier] = {0};
kmp_bar_pat_e __kmp_barrier_gather_pattern[bs_last_barrier] = {bp_linear_bar};
kmp_bar_pat_e __kmp_barrier_release_pattern[bs_last_barrier] = {bp_linear_bar};
char const *__kmp_barrier_branch_bit_env_name[bs_last_barrier] = {
"KMP_PLAIN_BARRIER", "KMP_FORKJOIN_BARRIER"
#if KMP_FAST_REDUCTION_BARRIER
,
"KMP_REDUCTION_BARRIER"
#endif
};
char const *__kmp_barrier_pattern_env_name[bs_last_barrier] = {
"KMP_PLAIN_BARRIER_PATTERN", "KMP_FORKJOIN_BARRIER_PATTERN"
#if KMP_FAST_REDUCTION_BARRIER
,
"KMP_REDUCTION_BARRIER_PATTERN"
#endif
};
char const *__kmp_barrier_type_name[bs_last_barrier] = {"plain", "forkjoin"
#if KMP_FAST_REDUCTION_BARRIER
,
"reduction"
#endif
};
char const *__kmp_barrier_pattern_name[bp_last_bar] = {
"linear", "tree", "hyper", "hierarchical", "dist"};
int __kmp_allThreadsSpecified = 0;
size_t __kmp_align_alloc = CACHE_LINE;
int __kmp_generate_warnings = kmp_warnings_low;
int __kmp_reserve_warn = 0;
int __kmp_xproc = 0;
int __kmp_avail_proc = 0;
size_t __kmp_sys_min_stksize = KMP_MIN_STKSIZE;
int __kmp_sys_max_nth = KMP_MAX_NTH;
int __kmp_max_nth = 0;
int __kmp_cg_max_nth = 0;
int __kmp_task_max_nth = 0;
int __kmp_teams_max_nth = 0;
int __kmp_threads_capacity = 0;
int __kmp_dflt_team_nth = 0;
int __kmp_dflt_team_nth_ub = 0;
int __kmp_tp_capacity = 0;
int __kmp_tp_cached = 0;
int __kmp_dispatch_num_buffers = KMP_DFLT_DISP_NUM_BUFF;
int __kmp_dflt_max_active_levels = 1;
bool __kmp_dflt_max_active_levels_set = false;
#if KMP_NESTED_HOT_TEAMS
int __kmp_hot_teams_mode = 0;
int __kmp_hot_teams_max_level = 1;
#endif
enum library_type __kmp_library = library_none;
enum sched_type __kmp_sched =
kmp_sch_default;
enum sched_type __kmp_static =
kmp_sch_static_greedy;
enum sched_type __kmp_guided =
kmp_sch_guided_iterative_chunked;
enum sched_type __kmp_auto =
kmp_sch_guided_analytical_chunked;
#if KMP_USE_HIER_SCHED
int __kmp_dispatch_hand_threading = 0;
int __kmp_hier_max_units[kmp_hier_layer_e::LAYER_LAST + 1];
int __kmp_hier_threads_per[kmp_hier_layer_e::LAYER_LAST + 1];
kmp_hier_sched_env_t __kmp_hier_scheds = {0, 0, NULL, NULL, NULL};
#endif
int __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
char __kmp_blocktime_units = 'm';
bool __kmp_wpolicy_passive = false;
#if KMP_USE_MONITOR
int __kmp_monitor_wakeups = KMP_MIN_MONITOR_WAKEUPS;
int __kmp_bt_intervals = KMP_INTERVALS_FROM_BLOCKTIME(KMP_DEFAULT_BLOCKTIME,
KMP_MIN_MONITOR_WAKEUPS);
#endif
#ifdef KMP_ADJUST_BLOCKTIME
int __kmp_zero_bt = FALSE;
#endif
#ifdef KMP_DFLT_NTH_CORES
int __kmp_ncores = 0;
#endif
int __kmp_chunk = 0;
int __kmp_force_monotonic = 0;
int __kmp_abort_delay = 0;
#if (KMP_OS_LINUX || KMP_OS_AIX) && defined(KMP_TDATA_GTID)
int __kmp_gtid_mode = 3;
int __kmp_adjust_gtid_mode = FALSE;
#elif KMP_OS_WINDOWS
int __kmp_gtid_mode = 2;
int __kmp_adjust_gtid_mode = FALSE;
#else
int __kmp_gtid_mode = 0;
int __kmp_adjust_gtid_mode = TRUE;
#endif
#ifdef KMP_TDATA_GTID
KMP_THREAD_LOCAL int __kmp_gtid = KMP_GTID_DNE;
#endif
int __kmp_tls_gtid_min = INT_MAX;
int __kmp_foreign_tp = TRUE;
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
int __kmp_inherit_fp_control = TRUE;
kmp_int16 __kmp_init_x87_fpu_control_word = 0;
kmp_uint32 __kmp_init_mxcsr = 0;
#endif
#ifdef USE_LOAD_BALANCE
double __kmp_load_balance_interval = 1.0;
#endif
kmp_nested_nthreads_t __kmp_nested_nth = {NULL, 0, 0};
#if KMP_USE_ADAPTIVE_LOCKS
kmp_adaptive_backoff_params_t __kmp_adaptive_backoff_params = {
1, 1024};
#if KMP_DEBUG_ADAPTIVE_LOCKS
const char *__kmp_speculative_statsfile = "-";
#endif
#endif
int __kmp_display_env = FALSE;
int __kmp_display_env_verbose = FALSE;
int __kmp_omp_cancellation = FALSE;
int __kmp_nteams = 0;
int __kmp_teams_thread_limit = 0;
#if KMP_HAVE_MWAIT || KMP_HAVE_UMWAIT
int __kmp_user_level_mwait = FALSE;
int __kmp_umwait_enabled = FALSE;
int __kmp_mwait_enabled = FALSE;
int __kmp_mwait_hints = 0;
#endif
#if KMP_HAVE_UMWAIT
int __kmp_waitpkg_enabled = 0;
int __kmp_tpause_state = 0;
int __kmp_tpause_hint = 1;
int __kmp_tpause_enabled = 0;
#endif
enum sched_type __kmp_sch_map[kmp_sched_upper - kmp_sched_lower_ext +
kmp_sched_upper_std - kmp_sched_lower - 2] = {
kmp_sch_static_chunked,
kmp_sch_dynamic_chunked,
kmp_sch_guided_chunked,
kmp_sch_auto,
kmp_sch_trapezoidal
};
#if KMP_OS_LINUX
enum clock_function_type __kmp_clock_function;
int __kmp_clock_function_param;
#endif
#if KMP_MIC_SUPPORTED
enum mic_type __kmp_mic_type = non_mic;
#endif
#if KMP_AFFINITY_SUPPORTED
KMPAffinity *__kmp_affinity_dispatch = NULL;
#if KMP_USE_HWLOC
int __kmp_hwloc_error = FALSE;
hwloc_topology_t __kmp_hwloc_topology = NULL;
#endif
#if KMP_OS_WINDOWS
#if KMP_GROUP_AFFINITY
int __kmp_num_proc_groups = 1;
#endif
kmp_GetActiveProcessorCount_t __kmp_GetActiveProcessorCount = NULL;
kmp_GetActiveProcessorGroupCount_t __kmp_GetActiveProcessorGroupCount = NULL;
kmp_GetThreadGroupAffinity_t __kmp_GetThreadGroupAffinity = NULL;
kmp_SetThreadGroupAffinity_t __kmp_SetThreadGroupAffinity = NULL;
#endif
size_t __kmp_affin_mask_size = 0;
enum affinity_top_method __kmp_affinity_top_method =
affinity_top_method_default;
kmp_affinity_t __kmp_affinity = KMP_AFFINITY_INIT("KMP_AFFINITY");
kmp_affinity_t __kmp_hh_affinity =
KMP_AFFINITY_INIT("KMP_HIDDEN_HELPER_AFFINITY");
kmp_affinity_t *__kmp_affinities[] = {&__kmp_affinity, &__kmp_hh_affinity};
char *__kmp_cpuinfo_file = NULL;
#if KMP_WEIGHTED_ITERATIONS_SUPPORTED
int __kmp_first_osid_with_ecore = -1;
#endif
#endif
kmp_nested_proc_bind_t __kmp_nested_proc_bind = {NULL, 0, 0};
kmp_proc_bind_t __kmp_teams_proc_bind = proc_bind_spread;
int __kmp_affinity_num_places = 0;
int __kmp_display_affinity = FALSE;
char *__kmp_affinity_format = NULL;
kmp_int32 __kmp_default_device = 0;
kmp_tasking_mode_t __kmp_tasking_mode = tskm_task_teams;
kmp_int32 __kmp_max_task_priority = 0;
kmp_uint64 __kmp_taskloop_min_tasks = 0;
int __kmp_memkind_available = 0;
omp_allocator_handle_t const omp_null_allocator = NULL;
omp_allocator_handle_t const omp_default_mem_alloc =
(omp_allocator_handle_t const)1;
omp_allocator_handle_t const omp_large_cap_mem_alloc =
(omp_allocator_handle_t const)2;
omp_allocator_handle_t const omp_const_mem_alloc =
(omp_allocator_handle_t const)3;
omp_allocator_handle_t const omp_high_bw_mem_alloc =
(omp_allocator_handle_t const)4;
omp_allocator_handle_t const omp_low_lat_mem_alloc =
(omp_allocator_handle_t const)5;
omp_allocator_handle_t const omp_cgroup_mem_alloc =
(omp_allocator_handle_t const)6;
omp_allocator_handle_t const omp_pteam_mem_alloc =
(omp_allocator_handle_t const)7;
omp_allocator_handle_t const omp_thread_mem_alloc =
(omp_allocator_handle_t const)8;
omp_allocator_handle_t const llvm_omp_target_host_mem_alloc =
(omp_allocator_handle_t const)100;
omp_allocator_handle_t const llvm_omp_target_shared_mem_alloc =
(omp_allocator_handle_t const)101;
omp_allocator_handle_t const llvm_omp_target_device_mem_alloc =
(omp_allocator_handle_t const)102;
omp_allocator_handle_t const kmp_max_mem_alloc =
(omp_allocator_handle_t const)1024;
omp_allocator_handle_t __kmp_def_allocator = omp_default_mem_alloc;
omp_memspace_handle_t const omp_default_mem_space =
(omp_memspace_handle_t const)0;
omp_memspace_handle_t const omp_large_cap_mem_space =
(omp_memspace_handle_t const)1;
omp_memspace_handle_t const omp_const_mem_space =
(omp_memspace_handle_t const)2;
omp_memspace_handle_t const omp_high_bw_mem_space =
(omp_memspace_handle_t const)3;
omp_memspace_handle_t const omp_low_lat_mem_space =
(omp_memspace_handle_t const)4;
omp_memspace_handle_t const llvm_omp_target_host_mem_space =
(omp_memspace_handle_t const)100;
omp_memspace_handle_t const llvm_omp_target_shared_mem_space =
(omp_memspace_handle_t const)101;
omp_memspace_handle_t const llvm_omp_target_device_mem_space =
(omp_memspace_handle_t const)102;
flags formal parameter of the function kmpc_omp_task_alloc(). If the type is
not a 4-byte type, then give an error message about a non-positive length
array pointing here. If that happens, the kmp_tasking_flags_t structure must
be redefined to have exactly 32 bits. */
KMP_BUILD_ASSERT(sizeof(kmp_tasking_flags_t) == 4);
int __kmp_task_stealing_constraint = 1;
int __kmp_enable_task_throttling = 1;
#ifdef DEBUG_SUSPEND
int __kmp_suspend_count = 0;
#endif
int __kmp_settings = FALSE;
int __kmp_duplicate_library_ok = 0;
#if USE_ITT_BUILD
int __kmp_forkjoin_frames = 1;
int __kmp_forkjoin_frames_mode = 3;
#endif
PACKED_REDUCTION_METHOD_T __kmp_force_reduction_method =
reduction_method_not_defined;
int __kmp_determ_red = FALSE;
#ifdef KMP_DEBUG
int kmp_a_debug = 0;
int kmp_b_debug = 0;
int kmp_c_debug = 0;
int kmp_d_debug = 0;
int kmp_e_debug = 0;
int kmp_f_debug = 0;
int kmp_diag = 0;
#endif
int __kmp_debug_buf =
FALSE;
int __kmp_debug_buf_lines =
KMP_DEBUG_BUF_LINES_INIT;
int __kmp_debug_buf_chars =
KMP_DEBUG_BUF_CHARS_INIT;
int __kmp_debug_buf_atomic =
FALSE;
char *__kmp_debug_buffer = NULL;
std::atomic<int> __kmp_debug_count =
0;
int __kmp_debug_buf_warn_chars =
0;
#ifdef KMP_DEBUG
int __kmp_par_range;
char __kmp_par_range_routine[KMP_PAR_RANGE_ROUTINE_LEN] = {'\0'};
char __kmp_par_range_filename[KMP_PAR_RANGE_FILENAME_LEN] = {'\0'};
int __kmp_par_range_lb = 0;
int __kmp_par_range_ub = INT_MAX;
#endif
int __kmp_storage_map =
FALSE;
int __kmp_storage_map_verbose =
FALSE;
int __kmp_storage_map_verbose_specified = FALSE;
* to TRUE */
int __kmp_need_register_atfork =
TRUE;
int __kmp_need_register_atfork_specified = TRUE;
int __kmp_env_stksize = FALSE;
int __kmp_env_blocktime = FALSE;
int __kmp_env_checks = FALSE;
int __kmp_env_consistency_check = FALSE;
#if KMP_OS_DARWIN && KMP_ARCH_AARCH64
kmp_int32 __kmp_use_yield = 0;
#else
kmp_int32 __kmp_use_yield = 1;
#endif
kmp_int32 __kmp_use_yield_exp_set = 0;
kmp_uint32 __kmp_yield_init = KMP_INIT_WAIT;
kmp_uint32 __kmp_yield_next = KMP_NEXT_WAIT;
kmp_uint64 __kmp_pause_init = 1;
of declaration is not necessarily correlated to storage order. To fix this,
all the important globals must be put in a big structure instead. */
KMP_ALIGN_CACHE
kmp_info_t **__kmp_threads = NULL;
kmp_root_t **__kmp_root = NULL;
kmp_old_threads_list_t *__kmp_old_threads_list = NULL;
KMP_ALIGN_CACHE
volatile int __kmp_nth = 0;
volatile int __kmp_all_nth = 0;
volatile kmp_info_t *__kmp_thread_pool = NULL;
volatile kmp_team_t *__kmp_team_pool = NULL;
KMP_ALIGN_CACHE
std::atomic<int> __kmp_thread_pool_active_nth = 0;
* GLOBAL/ROOT STATE */
KMP_ALIGN_CACHE
kmp_global_t __kmp_global;
#if KMP_USE_INTERNODE_ALIGNMENT
* false sharing if the alignment is not large enough for these locks */
KMP_ALIGN_CACHE_INTERNODE
KMP_BOOTSTRAP_LOCK_INIT(__kmp_initz_lock);
KMP_ALIGN_CACHE_INTERNODE
KMP_BOOTSTRAP_LOCK_INIT(__kmp_forkjoin_lock);
KMP_ALIGN_CACHE_INTERNODE
KMP_BOOTSTRAP_LOCK_INIT(__kmp_exit_lock);
#if KMP_USE_MONITOR
KMP_ALIGN_CACHE_INTERNODE
KMP_BOOTSTRAP_LOCK_INIT(__kmp_monitor_lock);
#endif
to co-exist */
KMP_ALIGN_CACHE_INTERNODE
KMP_BOOTSTRAP_LOCK_INIT(__kmp_tp_cached_lock);
KMP_ALIGN_CACHE_INTERNODE
KMP_LOCK_INIT(__kmp_global_lock);
KMP_ALIGN_CACHE_INTERNODE
kmp_queuing_lock_t __kmp_dispatch_lock;
KMP_ALIGN_CACHE_INTERNODE
KMP_LOCK_INIT(__kmp_debug_lock);
#else
KMP_ALIGN_CACHE
KMP_BOOTSTRAP_LOCK_INIT(__kmp_initz_lock);
KMP_BOOTSTRAP_LOCK_INIT(__kmp_forkjoin_lock);
KMP_BOOTSTRAP_LOCK_INIT(__kmp_exit_lock);
#if KMP_USE_MONITOR
KMP_BOOTSTRAP_LOCK_INIT(__kmp_monitor_lock);
#endif
to co-exist */
KMP_BOOTSTRAP_LOCK_INIT(__kmp_tp_cached_lock);
KMP_ALIGN(128)
KMP_LOCK_INIT(__kmp_global_lock);
KMP_ALIGN(128)
kmp_queuing_lock_t __kmp_dispatch_lock;
KMP_ALIGN(128)
KMP_LOCK_INIT(__kmp_debug_lock);
#endif
#if KMP_HANDLE_SIGNALS
sigsegv (or other trouble) in user code signal handler catches the signal,
which then "appears" in the monitor thread (when the monitor executes raise()
function). Users see signal in the monitor thread and blame OpenMP RTL.
Grant said signal handling required on some older OSes (Irix?) supported by
KAI, because bad applications hung but not aborted. Currently it is not a
problem for Linux* OS, OS X* and Windows* OS.
Grant: Found new hangs for EL4, EL5, and a Fedora Core machine. So I'm
putting the default back for now to see if that fixes hangs on those
machines.
2010-04013 Lev: It was a bug in Fortran RTL. Fortran RTL prints a kind of
stack backtrace when program is aborting, but the code is not signal-safe.
When multiple signals raised at the same time (which occurs in dynamic
negative tests because all the worker threads detects the same error),
Fortran RTL may hang. The bug finally fixed in Fortran RTL library provided
by Steve R., and will be available soon. */
int __kmp_handle_signals = FALSE;
#endif
#ifdef DEBUG_SUSPEND
int get_suspend_count_(void) {
int count = __kmp_suspend_count;
__kmp_suspend_count = 0;
return count;
}
void set_suspend_count_(int *value) { __kmp_suspend_count = *value; }
#endif
kmp_target_offload_kind_t __kmp_target_offload = tgt_default;
kmp_pause_status_t __kmp_pause_status = kmp_not_paused;
int __kmp_nesting_mode = 0;
int __kmp_nesting_mode_nlevels = 1;
int *__kmp_nesting_nth_level;
#if OMPX_TASKGRAPH
int __kmp_tdg_dot = 0;
kmp_int32 __kmp_max_tdgs = 100;
kmp_tdg_info_t **__kmp_global_tdgs = NULL;
kmp_int32 __kmp_curr_tdg_idx =
0;
kmp_int32 __kmp_num_tdg = 0;
kmp_int32 __kmp_successors_size = 10;
std::atomic<kmp_int32> __kmp_tdg_task_id = 0;
#endif