diff options
author | Andrey Churbanov <Andrey.Churbanov@intel.com> | 2019-06-05 16:14:47 +0000 |
---|---|---|
committer | Andrey Churbanov <Andrey.Churbanov@intel.com> | 2019-06-05 16:14:47 +0000 |
commit | 402c7439d7ba1cfa49e205554dfa8087a5a64313 (patch) | |
tree | 0e71aaa42cca5894240f1e02d1097614979ce8cf /runtime/src | |
parent | dba741d61d3b460f090810bf14ec2f6cd5ecc32d (diff) |
Added propagation of not big initial stack size of master thread to workers.
Currently implemented only for non-Windows 64-bit platforms.
Differential Revision: https://reviews.llvm.org/D62488
git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@362618 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'runtime/src')
-rw-r--r-- | runtime/src/kmp.h | 1 | ||||
-rw-r--r-- | runtime/src/kmp_settings.cpp | 14 | ||||
-rw-r--r-- | runtime/src/z_Linux_util.cpp | 11 |
3 files changed, 26 insertions, 0 deletions
diff --git a/runtime/src/kmp.h b/runtime/src/kmp.h index 0133108..f1a8f38 100644 --- a/runtime/src/kmp.h +++ b/runtime/src/kmp.h @@ -3263,6 +3263,7 @@ extern void __kmp_init_random(kmp_info_t *thread); extern kmp_r_sched_t __kmp_get_schedule_global(void); extern void __kmp_adjust_num_threads(int new_nproc); +extern void __kmp_check_stksize(size_t *val); extern void *___kmp_allocate(size_t size KMP_SRC_LOC_DECL); extern void *___kmp_page_allocate(size_t size KMP_SRC_LOC_DECL); diff --git a/runtime/src/kmp_settings.cpp b/runtime/src/kmp_settings.cpp index 114cd9c..1afba5b 100644 --- a/runtime/src/kmp_settings.cpp +++ b/runtime/src/kmp_settings.cpp @@ -289,6 +289,20 @@ static void __kmp_stg_parse_bool(char const *name, char const *value, } } // __kmp_stg_parse_bool +// placed here in order to use __kmp_round4k static function +void __kmp_check_stksize(size_t *val) { + // if system stack size is too big then limit the size for worker threads + if (*val > KMP_DEFAULT_STKSIZE * 16) // just a heuristics... + *val = KMP_DEFAULT_STKSIZE * 16; + if (*val < KMP_MIN_STKSIZE) + *val = KMP_MIN_STKSIZE; + if (*val > KMP_MAX_STKSIZE) + *val = KMP_MAX_STKSIZE; // dead code currently, but may work in future +#if KMP_OS_DARWIN + *val = __kmp_round4k(*val); +#endif // KMP_OS_DARWIN +} + static void __kmp_stg_parse_size(char const *name, char const *value, size_t size_min, size_t size_max, int *is_specified, size_t *out, diff --git a/runtime/src/z_Linux_util.cpp b/runtime/src/z_Linux_util.cpp index 7eb782a..b1cf829 100644 --- a/runtime/src/z_Linux_util.cpp +++ b/runtime/src/z_Linux_util.cpp @@ -1833,6 +1833,17 @@ void __kmp_runtime_initialize(void) { __kmp_xproc = __kmp_get_xproc(); +#if ! KMP_32_BIT_ARCH + struct rlimit rlim; + // read stack size of calling thread, save it as default for worker threads; + // this should be done before reading environment variables + status = getrlimit(RLIMIT_STACK, &rlim); + if (status == 0) { // success? + __kmp_stksize = rlim.rlim_cur; + __kmp_check_stksize(&__kmp_stksize); // check value and adjust if needed + } +#endif /* KMP_32_BIT_ARCH */ + if (sysconf(_SC_THREADS)) { /* Query the maximum number of threads */ |