14#include "kmp_affinity.h"
15#include "kmp_atomic.h"
17#include "kmp_dispatch_hier.h"
19#include "kmp_environment.h"
24#include "kmp_settings.h"
26#include "kmp_wrapper_getpid.h"
29#include "ompd-specific.h"
32static int __kmp_env_toPrint(
char const *name,
int flag);
34bool __kmp_env_format = 0;
39#ifdef USE_LOAD_BALANCE
40static double __kmp_convert_to_double(
char const *s) {
43 if (KMP_SSCANF(s,
"%lf", &result) < 1) {
52static unsigned int __kmp_readstr_with_sentinel(
char *dest,
char const *src,
53 size_t len,
char sentinel) {
55 for (i = 0; i < len; i++) {
56 if ((*src ==
'\0') || (*src == sentinel)) {
66static int __kmp_match_with_sentinel(
char const *a,
char const *b,
size_t len,
74 while (*a && *b && *b != sentinel) {
75 char ca = *a, cb = *b;
77 if (ca >=
'a' && ca <=
'z')
79 if (cb >=
'a' && cb <=
'z')
113static int __kmp_match_str(
char const *token,
char const *buf,
116 KMP_ASSERT(token != NULL);
117 KMP_ASSERT(buf != NULL);
118 KMP_ASSERT(end != NULL);
120 while (*token && *buf) {
121 char ct = *token, cb = *buf;
123 if (ct >=
'a' && ct <=
'z')
125 if (cb >=
'a' && cb <=
'z')
140static size_t __kmp_round4k(
size_t size) {
141 size_t _4k = 4 * 1024;
142 if (size & (_4k - 1)) {
144 if (size <= KMP_SIZE_T_MAX - _4k) {
156int __kmp_convert_to_milliseconds(
char const *data) {
157 int ret, nvalues, factor;
163 if (__kmp_str_match(
"infinit", -1, data))
167 nvalues = KMP_SSCANF(data,
"%lf%c%c", &value, &mult, &extra);
193 factor = 1000 * 60 * 60;
197 factor = 1000 * 24 * 60 * 60;
203 if (value >= ((INT_MAX - 1) / factor))
206 ret = (int)(value * (
double)factor);
211static int __kmp_strcasecmp_with_sentinel(
char const *a,
char const *b,
217 while (*a && *b && *b != sentinel) {
218 char ca = *a, cb = *b;
220 if (ca >=
'a' && ca <=
'z')
222 if (cb >=
'a' && cb <=
'z')
225 return (
int)(
unsigned char)*a - (
int)(
unsigned char)*b;
229 return *a ? (*b && *b != sentinel)
230 ? (
int)(
unsigned char)*a - (
int)(
unsigned char)*b
232 : (*b && *b != sentinel) ? -1
239typedef struct __kmp_setting kmp_setting_t;
240typedef struct __kmp_stg_ss_data kmp_stg_ss_data_t;
241typedef struct __kmp_stg_wp_data kmp_stg_wp_data_t;
242typedef struct __kmp_stg_fr_data kmp_stg_fr_data_t;
244typedef void (*kmp_stg_parse_func_t)(
char const *name,
char const *value,
246typedef void (*kmp_stg_print_func_t)(kmp_str_buf_t *buffer,
char const *name,
249struct __kmp_setting {
251 kmp_stg_parse_func_t parse;
252 kmp_stg_print_func_t print;
259struct __kmp_stg_ss_data {
261 kmp_setting_t **rivals;
264struct __kmp_stg_wp_data {
266 kmp_setting_t **rivals;
269struct __kmp_stg_fr_data {
271 kmp_setting_t **rivals;
274static int __kmp_stg_check_rivals(
277 kmp_setting_t **rivals
283static void __kmp_stg_parse_bool(
char const *name,
char const *value,
285 if (__kmp_str_match_true(value)) {
287 }
else if (__kmp_str_match_false(value)) {
290 __kmp_msg(kmp_ms_warning, KMP_MSG(BadBoolValue, name, value),
291 KMP_HNT(ValidBoolValues), __kmp_msg_null);
296void __kmp_check_stksize(
size_t *val) {
298 if (*val > KMP_DEFAULT_STKSIZE * 16)
299 *val = KMP_DEFAULT_STKSIZE * 16;
300 if (*val < KMP_MIN_STKSIZE)
301 *val = KMP_MIN_STKSIZE;
302 if (*val > KMP_MAX_STKSIZE)
303 *val = KMP_MAX_STKSIZE;
305 *val = __kmp_round4k(*val);
309static void __kmp_stg_parse_size(
char const *name,
char const *value,
310 size_t size_min,
size_t size_max,
311 int *is_specified,
size_t *out,
313 char const *msg = NULL;
315 size_min = __kmp_round4k(size_min);
316 size_max = __kmp_round4k(size_max);
319 if (is_specified != NULL) {
322 __kmp_str_to_size(value, out, factor, &msg);
324 if (*out > size_max) {
326 msg = KMP_I18N_STR(ValueTooLarge);
327 }
else if (*out < size_min) {
329 msg = KMP_I18N_STR(ValueTooSmall);
332 size_t round4k = __kmp_round4k(*out);
333 if (*out != round4k) {
335 msg = KMP_I18N_STR(NotMultiple4K);
342 if (*out < size_min) {
344 }
else if (*out > size_max) {
351 __kmp_str_buf_init(&buf);
352 __kmp_str_buf_print_size(&buf, *out);
353 KMP_WARNING(ParseSizeIntWarn, name, value, msg);
354 KMP_INFORM(Using_str_Value, name, buf.str);
355 __kmp_str_buf_free(&buf);
360static void __kmp_stg_parse_str(
char const *name,
char const *value,
363 *out = __kmp_str_format(
"%s", value);
366static void __kmp_stg_parse_int(
374 char const *msg = NULL;
375 kmp_uint64 uint = *out;
376 __kmp_str_to_uint(value, &uint, &msg);
378 if (uint < (
unsigned int)min) {
379 msg = KMP_I18N_STR(ValueTooSmall);
381 }
else if (uint > (
unsigned int)max) {
382 msg = KMP_I18N_STR(ValueTooLarge);
388 if (uint < (
unsigned int)min) {
390 }
else if (uint > (
unsigned int)max) {
397 KMP_WARNING(ParseSizeIntWarn, name, value, msg);
398 __kmp_str_buf_init(&buf);
399 __kmp_str_buf_print(&buf,
"%" KMP_UINT64_SPEC
"", uint);
400 KMP_INFORM(Using_uint64_Value, name, buf.str);
401 __kmp_str_buf_free(&buf);
403 __kmp_type_convert(uint, out);
406#if KMP_DEBUG_ADAPTIVE_LOCKS
407static void __kmp_stg_parse_file(
char const *name,
char const *value,
408 const char *suffix,
char **out) {
413 t = (
char *)strrchr(value,
'.');
414 hasSuffix = t && __kmp_str_eqf(t, suffix);
415 t = __kmp_str_format(
"%s%s", value, hasSuffix ?
"" : suffix);
416 __kmp_expand_file_name(buffer,
sizeof(buffer), t);
418 *out = __kmp_str_format(
"%s", buffer);
423static char *par_range_to_print = NULL;
425static void __kmp_stg_parse_par_range(
char const *name,
char const *value,
426 int *out_range,
char *out_routine,
427 char *out_file,
int *out_lb,
429 size_t len = KMP_STRLEN(value) + 1;
430 par_range_to_print = (
char *)KMP_INTERNAL_MALLOC(len + 1);
431 KMP_STRNCPY_S(par_range_to_print, len + 1, value, len + 1);
432 __kmp_par_range = +1;
433 __kmp_par_range_lb = 0;
434 __kmp_par_range_ub = INT_MAX;
437 if (*value ==
'\0') {
440 if (!__kmp_strcasecmp_with_sentinel(
"routine", value,
'=')) {
441 value = strchr(value,
'=') + 1;
442 len = __kmp_readstr_with_sentinel(out_routine, value,
443 KMP_PAR_RANGE_ROUTINE_LEN - 1,
',');
445 goto par_range_error;
447 value = strchr(value,
',');
453 if (!__kmp_strcasecmp_with_sentinel(
"filename", value,
'=')) {
454 value = strchr(value,
'=') + 1;
455 len = __kmp_readstr_with_sentinel(out_file, value,
456 KMP_PAR_RANGE_FILENAME_LEN - 1,
',');
458 goto par_range_error;
460 value = strchr(value,
',');
466 if ((!__kmp_strcasecmp_with_sentinel(
"range", value,
'=')) ||
467 (!__kmp_strcasecmp_with_sentinel(
"incl_range", value,
'='))) {
468 value = strchr(value,
'=') + 1;
469 if (KMP_SSCANF(value,
"%d:%d", out_lb, out_ub) != 2) {
470 goto par_range_error;
473 value = strchr(value,
',');
479 if (!__kmp_strcasecmp_with_sentinel(
"excl_range", value,
'=')) {
480 value = strchr(value,
'=') + 1;
481 if (KMP_SSCANF(value,
"%d:%d", out_lb, out_ub) != 2) {
482 goto par_range_error;
485 value = strchr(value,
',');
492 KMP_WARNING(ParRangeSyntax, name);
499int __kmp_initial_threads_capacity(
int req_nproc) {
504 if (nth < (4 * req_nproc))
505 nth = (4 * req_nproc);
506 if (nth < (4 * __kmp_xproc))
507 nth = (4 * __kmp_xproc);
511 if (__kmp_enable_hidden_helper) {
512 nth += __kmp_hidden_helper_threads_num;
515 if (nth > __kmp_max_nth)
521int __kmp_default_tp_capacity(
int req_nproc,
int max_nth,
522 int all_threads_specified) {
525 if (all_threads_specified)
529 if (nth < (4 * req_nproc))
530 nth = (4 * req_nproc);
531 if (nth < (4 * __kmp_xproc))
532 nth = (4 * __kmp_xproc);
534 if (nth > __kmp_max_nth)
543static void __kmp_stg_print_bool(kmp_str_buf_t *buffer,
char const *name,
545 if (__kmp_env_format) {
546 KMP_STR_BUF_PRINT_BOOL;
548 __kmp_str_buf_print(buffer,
" %s=%s\n", name, value ?
"true" :
"false");
552static void __kmp_stg_print_int(kmp_str_buf_t *buffer,
char const *name,
554 if (__kmp_env_format) {
555 KMP_STR_BUF_PRINT_INT;
557 __kmp_str_buf_print(buffer,
" %s=%d\n", name, value);
561static void __kmp_stg_print_uint64(kmp_str_buf_t *buffer,
char const *name,
563 if (__kmp_env_format) {
564 KMP_STR_BUF_PRINT_UINT64;
566 __kmp_str_buf_print(buffer,
" %s=%" KMP_UINT64_SPEC
"\n", name, value);
570static void __kmp_stg_print_str(kmp_str_buf_t *buffer,
char const *name,
572 if (__kmp_env_format) {
573 KMP_STR_BUF_PRINT_STR;
575 __kmp_str_buf_print(buffer,
" %s=%s\n", name, value);
579static void __kmp_stg_print_size(kmp_str_buf_t *buffer,
char const *name,
581 if (__kmp_env_format) {
582 KMP_STR_BUF_PRINT_NAME_EX(name);
583 __kmp_str_buf_print_size(buffer, value);
584 __kmp_str_buf_print(buffer,
"'\n");
586 __kmp_str_buf_print(buffer,
" %s=", name);
587 __kmp_str_buf_print_size(buffer, value);
588 __kmp_str_buf_print(buffer,
"\n");
599static void __kmp_stg_parse_device_thread_limit(
char const *name,
600 char const *value,
void *data) {
601 kmp_setting_t **rivals = (kmp_setting_t **)data;
603 if (strcmp(name,
"KMP_ALL_THREADS") == 0) {
604 KMP_INFORM(EnvVarDeprecated, name,
"KMP_DEVICE_THREAD_LIMIT");
606 rc = __kmp_stg_check_rivals(name, value, rivals);
610 if (!__kmp_strcasecmp_with_sentinel(
"all", value, 0)) {
611 __kmp_max_nth = __kmp_xproc;
612 __kmp_allThreadsSpecified = 1;
614 __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth, &__kmp_max_nth);
615 __kmp_allThreadsSpecified = 0;
617 K_DIAG(1, (
"__kmp_max_nth == %d\n", __kmp_max_nth));
621static void __kmp_stg_print_device_thread_limit(kmp_str_buf_t *buffer,
622 char const *name,
void *data) {
623 __kmp_stg_print_int(buffer, name, __kmp_max_nth);
628static void __kmp_stg_parse_thread_limit(
char const *name,
char const *value,
630 __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth, &__kmp_cg_max_nth);
631 K_DIAG(1, (
"__kmp_cg_max_nth == %d\n", __kmp_cg_max_nth));
635static void __kmp_stg_print_thread_limit(kmp_str_buf_t *buffer,
636 char const *name,
void *data) {
637 __kmp_stg_print_int(buffer, name, __kmp_cg_max_nth);
642static void __kmp_stg_parse_nteams(
char const *name,
char const *value,
644 __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth, &__kmp_nteams);
645 K_DIAG(1, (
"__kmp_nteams == %d\n", __kmp_nteams));
648static void __kmp_stg_print_nteams(kmp_str_buf_t *buffer,
char const *name,
650 __kmp_stg_print_int(buffer, name, __kmp_nteams);
655static void __kmp_stg_parse_teams_th_limit(
char const *name,
char const *value,
657 __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth,
658 &__kmp_teams_thread_limit);
659 K_DIAG(1, (
"__kmp_teams_thread_limit == %d\n", __kmp_teams_thread_limit));
662static void __kmp_stg_print_teams_th_limit(kmp_str_buf_t *buffer,
663 char const *name,
void *data) {
664 __kmp_stg_print_int(buffer, name, __kmp_teams_thread_limit);
669static void __kmp_stg_parse_teams_thread_limit(
char const *name,
670 char const *value,
void *data) {
671 __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth, &__kmp_teams_max_nth);
674static void __kmp_stg_print_teams_thread_limit(kmp_str_buf_t *buffer,
675 char const *name,
void *data) {
676 __kmp_stg_print_int(buffer, name, __kmp_teams_max_nth);
681static void __kmp_stg_parse_use_yield(
char const *name,
char const *value,
683 __kmp_stg_parse_int(name, value, 0, 2, &__kmp_use_yield);
684 __kmp_use_yield_exp_set = 1;
687static void __kmp_stg_print_use_yield(kmp_str_buf_t *buffer,
char const *name,
689 __kmp_stg_print_int(buffer, name, __kmp_use_yield);
695static void __kmp_stg_parse_blocktime(
char const *name,
char const *value,
697 __kmp_dflt_blocktime = __kmp_convert_to_milliseconds(value);
698 if (__kmp_dflt_blocktime < 0) {
699 __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
700 __kmp_msg(kmp_ms_warning, KMP_MSG(InvalidValue, name, value),
702 KMP_INFORM(Using_int_Value, name, __kmp_dflt_blocktime);
703 __kmp_env_blocktime = FALSE;
705 if (__kmp_dflt_blocktime < KMP_MIN_BLOCKTIME) {
706 __kmp_dflt_blocktime = KMP_MIN_BLOCKTIME;
707 __kmp_msg(kmp_ms_warning, KMP_MSG(SmallValue, name, value),
709 KMP_INFORM(MinValueUsing, name, __kmp_dflt_blocktime);
710 }
else if (__kmp_dflt_blocktime > KMP_MAX_BLOCKTIME) {
711 __kmp_dflt_blocktime = KMP_MAX_BLOCKTIME;
712 __kmp_msg(kmp_ms_warning, KMP_MSG(LargeValue, name, value),
714 KMP_INFORM(MaxValueUsing, name, __kmp_dflt_blocktime);
716 __kmp_env_blocktime = TRUE;
721 __kmp_monitor_wakeups =
722 KMP_WAKEUPS_FROM_BLOCKTIME(__kmp_dflt_blocktime, __kmp_monitor_wakeups);
724 KMP_INTERVALS_FROM_BLOCKTIME(__kmp_dflt_blocktime, __kmp_monitor_wakeups);
726 K_DIAG(1, (
"__kmp_env_blocktime == %d\n", __kmp_env_blocktime));
727 if (__kmp_env_blocktime) {
728 K_DIAG(1, (
"__kmp_dflt_blocktime == %d\n", __kmp_dflt_blocktime));
732static void __kmp_stg_print_blocktime(kmp_str_buf_t *buffer,
char const *name,
734 __kmp_stg_print_int(buffer, name, __kmp_dflt_blocktime);
740static void __kmp_stg_parse_duplicate_lib_ok(
char const *name,
741 char const *value,
void *data) {
744 __kmp_stg_parse_bool(name, value, &__kmp_duplicate_library_ok);
747static void __kmp_stg_print_duplicate_lib_ok(kmp_str_buf_t *buffer,
748 char const *name,
void *data) {
749 __kmp_stg_print_bool(buffer, name, __kmp_duplicate_library_ok);
755#if KMP_ARCH_X86 || KMP_ARCH_X86_64
757static void __kmp_stg_parse_inherit_fp_control(
char const *name,
758 char const *value,
void *data) {
759 __kmp_stg_parse_bool(name, value, &__kmp_inherit_fp_control);
762static void __kmp_stg_print_inherit_fp_control(kmp_str_buf_t *buffer,
763 char const *name,
void *data) {
765 __kmp_stg_print_bool(buffer, name, __kmp_inherit_fp_control);
772static char const *blocktime_str = NULL;
777static void __kmp_stg_parse_wait_policy(
char const *name,
char const *value,
780 kmp_stg_wp_data_t *wait = (kmp_stg_wp_data_t *)data;
783 rc = __kmp_stg_check_rivals(name, value, wait->rivals);
789 if (__kmp_str_match(
"ACTIVE", 1, value)) {
790 __kmp_library = library_turnaround;
791 if (blocktime_str == NULL) {
793 __kmp_dflt_blocktime = KMP_MAX_BLOCKTIME;
795 }
else if (__kmp_str_match(
"PASSIVE", 1, value)) {
796 __kmp_library = library_throughput;
797 if (blocktime_str == NULL) {
799 __kmp_dflt_blocktime = 0;
802 KMP_WARNING(StgInvalidValue, name, value);
805 if (__kmp_str_match(
"serial", 1, value)) {
806 __kmp_library = library_serial;
807 }
else if (__kmp_str_match(
"throughput", 2, value)) {
808 __kmp_library = library_throughput;
809 if (blocktime_str == NULL) {
811 __kmp_dflt_blocktime = 0;
813 }
else if (__kmp_str_match(
"turnaround", 2, value)) {
814 __kmp_library = library_turnaround;
815 }
else if (__kmp_str_match(
"dedicated", 1, value)) {
816 __kmp_library = library_turnaround;
817 }
else if (__kmp_str_match(
"multiuser", 1, value)) {
818 __kmp_library = library_throughput;
819 if (blocktime_str == NULL) {
821 __kmp_dflt_blocktime = 0;
824 KMP_WARNING(StgInvalidValue, name, value);
829static void __kmp_stg_print_wait_policy(kmp_str_buf_t *buffer,
char const *name,
832 kmp_stg_wp_data_t *wait = (kmp_stg_wp_data_t *)data;
833 char const *value = NULL;
836 switch (__kmp_library) {
837 case library_turnaround: {
840 case library_throughput: {
845 switch (__kmp_library) {
846 case library_serial: {
849 case library_turnaround: {
850 value =
"turnaround";
852 case library_throughput: {
853 value =
"throughput";
858 __kmp_stg_print_str(buffer, name, value);
867static void __kmp_stg_parse_monitor_stacksize(
char const *name,
868 char const *value,
void *data) {
869 __kmp_stg_parse_size(name, value, __kmp_sys_min_stksize, KMP_MAX_STKSIZE,
870 NULL, &__kmp_monitor_stksize, 1);
873static void __kmp_stg_print_monitor_stacksize(kmp_str_buf_t *buffer,
874 char const *name,
void *data) {
875 if (__kmp_env_format) {
876 if (__kmp_monitor_stksize > 0)
877 KMP_STR_BUF_PRINT_NAME_EX(name);
879 KMP_STR_BUF_PRINT_NAME;
881 __kmp_str_buf_print(buffer,
" %s", name);
883 if (__kmp_monitor_stksize > 0) {
884 __kmp_str_buf_print_size(buffer, __kmp_monitor_stksize);
886 __kmp_str_buf_print(buffer,
": %s\n", KMP_I18N_STR(NotDefined));
888 if (__kmp_env_format && __kmp_monitor_stksize) {
889 __kmp_str_buf_print(buffer,
"'\n");
897static void __kmp_stg_parse_settings(
char const *name,
char const *value,
899 __kmp_stg_parse_bool(name, value, &__kmp_settings);
902static void __kmp_stg_print_settings(kmp_str_buf_t *buffer,
char const *name,
904 __kmp_stg_print_bool(buffer, name, __kmp_settings);
910static void __kmp_stg_parse_stackpad(
char const *name,
char const *value,
912 __kmp_stg_parse_int(name,
920static void __kmp_stg_print_stackpad(kmp_str_buf_t *buffer,
char const *name,
922 __kmp_stg_print_int(buffer, name, __kmp_stkpadding);
928static void __kmp_stg_parse_stackoffset(
char const *name,
char const *value,
930 __kmp_stg_parse_size(name,
939static void __kmp_stg_print_stackoffset(kmp_str_buf_t *buffer,
char const *name,
941 __kmp_stg_print_size(buffer, name, __kmp_stkoffset);
947static void __kmp_stg_parse_stacksize(
char const *name,
char const *value,
950 kmp_stg_ss_data_t *stacksize = (kmp_stg_ss_data_t *)data;
953 rc = __kmp_stg_check_rivals(name, value, stacksize->rivals);
957 __kmp_stg_parse_size(name,
959 __kmp_sys_min_stksize,
971static void __kmp_stg_print_stacksize(kmp_str_buf_t *buffer,
char const *name,
973 kmp_stg_ss_data_t *stacksize = (kmp_stg_ss_data_t *)data;
974 if (__kmp_env_format) {
975 KMP_STR_BUF_PRINT_NAME_EX(name);
976 __kmp_str_buf_print_size(buffer, (__kmp_stksize % 1024)
977 ? __kmp_stksize / stacksize->factor
979 __kmp_str_buf_print(buffer,
"'\n");
981 __kmp_str_buf_print(buffer,
" %s=", name);
982 __kmp_str_buf_print_size(buffer, (__kmp_stksize % 1024)
983 ? __kmp_stksize / stacksize->factor
985 __kmp_str_buf_print(buffer,
"\n");
992static void __kmp_stg_parse_version(
char const *name,
char const *value,
994 __kmp_stg_parse_bool(name, value, &__kmp_version);
997static void __kmp_stg_print_version(kmp_str_buf_t *buffer,
char const *name,
999 __kmp_stg_print_bool(buffer, name, __kmp_version);
1005static void __kmp_stg_parse_warnings(
char const *name,
char const *value,
1007 __kmp_stg_parse_bool(name, value, &__kmp_generate_warnings);
1008 if (__kmp_generate_warnings != kmp_warnings_off) {
1011 __kmp_generate_warnings = kmp_warnings_explicit;
1015static void __kmp_stg_print_warnings(kmp_str_buf_t *buffer,
char const *name,
1018 __kmp_stg_print_bool(buffer, name, __kmp_generate_warnings);
1024static void __kmp_stg_parse_nesting_mode(
char const *name,
char const *value,
1026 __kmp_stg_parse_int(name, value, 0, INT_MAX, &__kmp_nesting_mode);
1027#if KMP_AFFINITY_SUPPORTED && KMP_USE_HWLOC
1028 if (__kmp_nesting_mode > 0)
1029 __kmp_affinity_top_method = affinity_top_method_hwloc;
1033static void __kmp_stg_print_nesting_mode(kmp_str_buf_t *buffer,
1034 char const *name,
void *data) {
1035 if (__kmp_env_format) {
1036 KMP_STR_BUF_PRINT_NAME;
1038 __kmp_str_buf_print(buffer,
" %s", name);
1040 __kmp_str_buf_print(buffer,
"=%d\n", __kmp_nesting_mode);
1046static void __kmp_stg_parse_nested(
char const *name,
char const *value,
1049 KMP_INFORM(EnvVarDeprecated, name,
"OMP_MAX_ACTIVE_LEVELS");
1050 __kmp_stg_parse_bool(name, value, &nested);
1052 if (!__kmp_dflt_max_active_levels_set)
1053 __kmp_dflt_max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
1055 __kmp_dflt_max_active_levels = 1;
1056 __kmp_dflt_max_active_levels_set =
true;
1060static void __kmp_stg_print_nested(kmp_str_buf_t *buffer,
char const *name,
1062 if (__kmp_env_format) {
1063 KMP_STR_BUF_PRINT_NAME;
1065 __kmp_str_buf_print(buffer,
" %s", name);
1067 __kmp_str_buf_print(buffer,
": deprecated; max-active-levels-var=%d\n",
1068 __kmp_dflt_max_active_levels);
1071static void __kmp_parse_nested_num_threads(
const char *var,
const char *env,
1072 kmp_nested_nthreads_t *nth_array) {
1073 const char *next = env;
1074 const char *scan = next;
1077 int prev_comma = FALSE;
1083 if (*next ==
'\0') {
1087 if (((*next <
'0') || (*next >
'9')) && (*next !=
',')) {
1088 KMP_WARNING(NthSyntaxError, var, env);
1094 if (total == 0 || prev_comma) {
1102 if (*next >=
'0' && *next <=
'9') {
1106 const char *tmp = next;
1108 if ((*next ==
' ' || *next ==
'\t') && (*tmp >=
'0' && *tmp <=
'9')) {
1109 KMP_WARNING(NthSpacesNotAllowed, var, env);
1114 if (!__kmp_dflt_max_active_levels_set && total > 1)
1115 __kmp_dflt_max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT;
1116 KMP_DEBUG_ASSERT(total > 0);
1118 KMP_WARNING(NthSyntaxError, var, env);
1123 if (!nth_array->nth) {
1125 nth_array->nth = (
int *)KMP_INTERNAL_MALLOC(
sizeof(
int) * total * 2);
1126 if (nth_array->nth == NULL) {
1127 KMP_FATAL(MemoryAllocFailed);
1129 nth_array->size = total * 2;
1131 if (nth_array->size < total) {
1134 nth_array->size *= 2;
1135 }
while (nth_array->size < total);
1137 nth_array->nth = (
int *)KMP_INTERNAL_REALLOC(
1138 nth_array->nth,
sizeof(
int) * nth_array->size);
1139 if (nth_array->nth == NULL) {
1140 KMP_FATAL(MemoryAllocFailed);
1144 nth_array->used = total;
1152 if (*scan ==
'\0') {
1162 nth_array->nth[i++] = 0;
1164 }
else if (prev_comma) {
1166 nth_array->nth[i] = nth_array->nth[i - 1];
1175 if (*scan >=
'0' && *scan <=
'9') {
1177 const char *buf = scan;
1178 char const *msg = NULL;
1183 num = __kmp_str_to_int(buf, *scan);
1184 if (num < KMP_MIN_NTH) {
1185 msg = KMP_I18N_STR(ValueTooSmall);
1187 }
else if (num > __kmp_sys_max_nth) {
1188 msg = KMP_I18N_STR(ValueTooLarge);
1189 num = __kmp_sys_max_nth;
1193 KMP_WARNING(ParseSizeIntWarn, var, env, msg);
1194 KMP_INFORM(Using_int_Value, var, num);
1196 nth_array->nth[i++] = num;
1201static void __kmp_stg_parse_num_threads(
char const *name,
char const *value,
1204 if (!__kmp_strcasecmp_with_sentinel(
"all", value, 0)) {
1206 __kmp_nested_nth.nth = (
int *)KMP_INTERNAL_MALLOC(
sizeof(
int));
1207 __kmp_nested_nth.size = __kmp_nested_nth.used = 1;
1208 __kmp_nested_nth.nth[0] = __kmp_dflt_team_nth = __kmp_dflt_team_nth_ub =
1211 __kmp_parse_nested_num_threads(name, value, &__kmp_nested_nth);
1212 if (__kmp_nested_nth.nth) {
1213 __kmp_dflt_team_nth = __kmp_nested_nth.nth[0];
1214 if (__kmp_dflt_team_nth_ub < __kmp_dflt_team_nth) {
1215 __kmp_dflt_team_nth_ub = __kmp_dflt_team_nth;
1219 K_DIAG(1, (
"__kmp_dflt_team_nth == %d\n", __kmp_dflt_team_nth));
1222static void __kmp_stg_parse_num_hidden_helper_threads(
char const *name,
1225 __kmp_stg_parse_int(name, value, 0, 16, &__kmp_hidden_helper_threads_num);
1228 if (__kmp_hidden_helper_threads_num == 0) {
1229 __kmp_enable_hidden_helper = FALSE;
1233static void __kmp_stg_print_num_hidden_helper_threads(kmp_str_buf_t *buffer,
1236 __kmp_stg_print_int(buffer, name, __kmp_hidden_helper_threads_num);
1239static void __kmp_stg_parse_use_hidden_helper(
char const *name,
1240 char const *value,
void *data) {
1241 __kmp_stg_parse_bool(name, value, &__kmp_enable_hidden_helper);
1243 __kmp_enable_hidden_helper = FALSE;
1245 (
"__kmp_stg_parse_use_hidden_helper: Disable hidden helper task on "
1246 "non-Linux platform although it is enabled by user explicitly.\n"));
1250static void __kmp_stg_print_use_hidden_helper(kmp_str_buf_t *buffer,
1251 char const *name,
void *data) {
1252 __kmp_stg_print_bool(buffer, name, __kmp_enable_hidden_helper);
1255static void __kmp_stg_print_num_threads(kmp_str_buf_t *buffer,
char const *name,
1257 if (__kmp_env_format) {
1258 KMP_STR_BUF_PRINT_NAME;
1260 __kmp_str_buf_print(buffer,
" %s", name);
1262 if (__kmp_nested_nth.used) {
1264 __kmp_str_buf_init(&buf);
1265 for (
int i = 0; i < __kmp_nested_nth.used; i++) {
1266 __kmp_str_buf_print(&buf,
"%d", __kmp_nested_nth.nth[i]);
1267 if (i < __kmp_nested_nth.used - 1) {
1268 __kmp_str_buf_print(&buf,
",");
1271 __kmp_str_buf_print(buffer,
"='%s'\n", buf.str);
1272 __kmp_str_buf_free(&buf);
1274 __kmp_str_buf_print(buffer,
": %s\n", KMP_I18N_STR(NotDefined));
1281static void __kmp_stg_parse_tasking(
char const *name,
char const *value,
1283 __kmp_stg_parse_int(name, value, 0, (
int)tskm_max,
1284 (
int *)&__kmp_tasking_mode);
1287static void __kmp_stg_print_tasking(kmp_str_buf_t *buffer,
char const *name,
1289 __kmp_stg_print_int(buffer, name, __kmp_tasking_mode);
1292static void __kmp_stg_parse_task_stealing(
char const *name,
char const *value,
1294 __kmp_stg_parse_int(name, value, 0, 1,
1295 (
int *)&__kmp_task_stealing_constraint);
1298static void __kmp_stg_print_task_stealing(kmp_str_buf_t *buffer,
1299 char const *name,
void *data) {
1300 __kmp_stg_print_int(buffer, name, __kmp_task_stealing_constraint);
1303static void __kmp_stg_parse_max_active_levels(
char const *name,
1304 char const *value,
void *data) {
1305 kmp_uint64 tmp_dflt = 0;
1306 char const *msg = NULL;
1307 if (!__kmp_dflt_max_active_levels_set) {
1309 __kmp_str_to_uint(value, &tmp_dflt, &msg);
1311 KMP_WARNING(ParseSizeIntWarn, name, value, msg);
1312 }
else if (tmp_dflt > KMP_MAX_ACTIVE_LEVELS_LIMIT) {
1314 msg = KMP_I18N_STR(ValueTooLarge);
1315 KMP_WARNING(ParseSizeIntWarn, name, value, msg);
1317 __kmp_type_convert(tmp_dflt, &(__kmp_dflt_max_active_levels));
1318 __kmp_dflt_max_active_levels_set =
true;
1323static void __kmp_stg_print_max_active_levels(kmp_str_buf_t *buffer,
1324 char const *name,
void *data) {
1325 __kmp_stg_print_int(buffer, name, __kmp_dflt_max_active_levels);
1330static void __kmp_stg_parse_default_device(
char const *name,
char const *value,
1332 __kmp_stg_parse_int(name, value, 0, KMP_MAX_DEFAULT_DEVICE_LIMIT,
1333 &__kmp_default_device);
1336static void __kmp_stg_print_default_device(kmp_str_buf_t *buffer,
1337 char const *name,
void *data) {
1338 __kmp_stg_print_int(buffer, name, __kmp_default_device);
1343static void __kmp_stg_parse_target_offload(
char const *name,
char const *value,
1345 const char *next = value;
1346 const char *scan = next;
1348 __kmp_target_offload = tgt_default;
1353 if (!__kmp_strcasecmp_with_sentinel(
"mandatory", scan, 0)) {
1354 __kmp_target_offload = tgt_mandatory;
1355 }
else if (!__kmp_strcasecmp_with_sentinel(
"disabled", scan, 0)) {
1356 __kmp_target_offload = tgt_disabled;
1357 }
else if (!__kmp_strcasecmp_with_sentinel(
"default", scan, 0)) {
1358 __kmp_target_offload = tgt_default;
1360 KMP_WARNING(SyntaxErrorUsing, name,
"DEFAULT");
1365static void __kmp_stg_print_target_offload(kmp_str_buf_t *buffer,
1366 char const *name,
void *data) {
1367 const char *value = NULL;
1368 if (__kmp_target_offload == tgt_default)
1370 else if (__kmp_target_offload == tgt_mandatory)
1371 value =
"MANDATORY";
1372 else if (__kmp_target_offload == tgt_disabled)
1374 KMP_DEBUG_ASSERT(value);
1375 if (__kmp_env_format) {
1376 KMP_STR_BUF_PRINT_NAME;
1378 __kmp_str_buf_print(buffer,
" %s", name);
1380 __kmp_str_buf_print(buffer,
"=%s\n", value);
1385static void __kmp_stg_parse_max_task_priority(
char const *name,
1386 char const *value,
void *data) {
1387 __kmp_stg_parse_int(name, value, 0, KMP_MAX_TASK_PRIORITY_LIMIT,
1388 &__kmp_max_task_priority);
1391static void __kmp_stg_print_max_task_priority(kmp_str_buf_t *buffer,
1392 char const *name,
void *data) {
1393 __kmp_stg_print_int(buffer, name, __kmp_max_task_priority);
1398static void __kmp_stg_parse_taskloop_min_tasks(
char const *name,
1399 char const *value,
void *data) {
1401 __kmp_stg_parse_int(name, value, 0, INT_MAX, &tmp);
1402 __kmp_taskloop_min_tasks = tmp;
1405static void __kmp_stg_print_taskloop_min_tasks(kmp_str_buf_t *buffer,
1406 char const *name,
void *data) {
1407 __kmp_stg_print_uint64(buffer, name, __kmp_taskloop_min_tasks);
1412static void __kmp_stg_parse_disp_buffers(
char const *name,
char const *value,
1414 if (TCR_4(__kmp_init_serial)) {
1415 KMP_WARNING(EnvSerialWarn, name);
1418 __kmp_stg_parse_int(name, value, KMP_MIN_DISP_NUM_BUFF, KMP_MAX_DISP_NUM_BUFF,
1419 &__kmp_dispatch_num_buffers);
1422static void __kmp_stg_print_disp_buffers(kmp_str_buf_t *buffer,
1423 char const *name,
void *data) {
1424 __kmp_stg_print_int(buffer, name, __kmp_dispatch_num_buffers);
1427#if KMP_NESTED_HOT_TEAMS
1431static void __kmp_stg_parse_hot_teams_level(
char const *name,
char const *value,
1433 if (TCR_4(__kmp_init_parallel)) {
1434 KMP_WARNING(EnvParallelWarn, name);
1437 __kmp_stg_parse_int(name, value, 0, KMP_MAX_ACTIVE_LEVELS_LIMIT,
1438 &__kmp_hot_teams_max_level);
1441static void __kmp_stg_print_hot_teams_level(kmp_str_buf_t *buffer,
1442 char const *name,
void *data) {
1443 __kmp_stg_print_int(buffer, name, __kmp_hot_teams_max_level);
1446static void __kmp_stg_parse_hot_teams_mode(
char const *name,
char const *value,
1448 if (TCR_4(__kmp_init_parallel)) {
1449 KMP_WARNING(EnvParallelWarn, name);
1452 __kmp_stg_parse_int(name, value, 0, KMP_MAX_ACTIVE_LEVELS_LIMIT,
1453 &__kmp_hot_teams_mode);
1456static void __kmp_stg_print_hot_teams_mode(kmp_str_buf_t *buffer,
1457 char const *name,
void *data) {
1458 __kmp_stg_print_int(buffer, name, __kmp_hot_teams_mode);
1466#if KMP_HANDLE_SIGNALS
1468static void __kmp_stg_parse_handle_signals(
char const *name,
char const *value,
1470 __kmp_stg_parse_bool(name, value, &__kmp_handle_signals);
1473static void __kmp_stg_print_handle_signals(kmp_str_buf_t *buffer,
1474 char const *name,
void *data) {
1475 __kmp_stg_print_bool(buffer, name, __kmp_handle_signals);
1485#define KMP_STG_X_DEBUG(x) \
1486 static void __kmp_stg_parse_##x##_debug(char const *name, char const *value, \
1488 __kmp_stg_parse_int(name, value, 0, INT_MAX, &kmp_##x##_debug); \
1490 static void __kmp_stg_print_##x##_debug(kmp_str_buf_t *buffer, \
1491 char const *name, void *data) { \
1492 __kmp_stg_print_int(buffer, name, kmp_##x##_debug); \
1502#undef KMP_STG_X_DEBUG
1504static void __kmp_stg_parse_debug(
char const *name,
char const *value,
1507 __kmp_stg_parse_int(name, value, 0, INT_MAX, &debug);
1508 if (kmp_a_debug < debug) {
1509 kmp_a_debug = debug;
1511 if (kmp_b_debug < debug) {
1512 kmp_b_debug = debug;
1514 if (kmp_c_debug < debug) {
1515 kmp_c_debug = debug;
1517 if (kmp_d_debug < debug) {
1518 kmp_d_debug = debug;
1520 if (kmp_e_debug < debug) {
1521 kmp_e_debug = debug;
1523 if (kmp_f_debug < debug) {
1524 kmp_f_debug = debug;
1528static void __kmp_stg_parse_debug_buf(
char const *name,
char const *value,
1530 __kmp_stg_parse_bool(name, value, &__kmp_debug_buf);
1534 if (__kmp_debug_buf) {
1536 int elements = __kmp_debug_buf_lines * __kmp_debug_buf_chars;
1539 __kmp_debug_buffer = (
char *)__kmp_page_allocate(elements *
sizeof(
char));
1540 for (i = 0; i < elements; i += __kmp_debug_buf_chars)
1541 __kmp_debug_buffer[i] =
'\0';
1543 __kmp_debug_count = 0;
1545 K_DIAG(1, (
"__kmp_debug_buf = %d\n", __kmp_debug_buf));
1548static void __kmp_stg_print_debug_buf(kmp_str_buf_t *buffer,
char const *name,
1550 __kmp_stg_print_bool(buffer, name, __kmp_debug_buf);
1553static void __kmp_stg_parse_debug_buf_atomic(
char const *name,
1554 char const *value,
void *data) {
1555 __kmp_stg_parse_bool(name, value, &__kmp_debug_buf_atomic);
1558static void __kmp_stg_print_debug_buf_atomic(kmp_str_buf_t *buffer,
1559 char const *name,
void *data) {
1560 __kmp_stg_print_bool(buffer, name, __kmp_debug_buf_atomic);
1563static void __kmp_stg_parse_debug_buf_chars(
char const *name,
char const *value,
1565 __kmp_stg_parse_int(name, value, KMP_DEBUG_BUF_CHARS_MIN, INT_MAX,
1566 &__kmp_debug_buf_chars);
1569static void __kmp_stg_print_debug_buf_chars(kmp_str_buf_t *buffer,
1570 char const *name,
void *data) {
1571 __kmp_stg_print_int(buffer, name, __kmp_debug_buf_chars);
1574static void __kmp_stg_parse_debug_buf_lines(
char const *name,
char const *value,
1576 __kmp_stg_parse_int(name, value, KMP_DEBUG_BUF_LINES_MIN, INT_MAX,
1577 &__kmp_debug_buf_lines);
1580static void __kmp_stg_print_debug_buf_lines(kmp_str_buf_t *buffer,
1581 char const *name,
void *data) {
1582 __kmp_stg_print_int(buffer, name, __kmp_debug_buf_lines);
1585static void __kmp_stg_parse_diag(
char const *name,
char const *value,
1587 __kmp_stg_parse_int(name, value, 0, INT_MAX, &kmp_diag);
1590static void __kmp_stg_print_diag(kmp_str_buf_t *buffer,
char const *name,
1592 __kmp_stg_print_int(buffer, name, kmp_diag);
1600static void __kmp_stg_parse_align_alloc(
char const *name,
char const *value,
1602 __kmp_stg_parse_size(name, value, CACHE_LINE, INT_MAX, NULL,
1603 &__kmp_align_alloc, 1);
1606static void __kmp_stg_print_align_alloc(kmp_str_buf_t *buffer,
char const *name,
1608 __kmp_stg_print_size(buffer, name, __kmp_align_alloc);
1617static void __kmp_stg_parse_barrier_branch_bit(
char const *name,
1618 char const *value,
void *data) {
1622 for (
int i = bs_plain_barrier; i < bs_last_barrier; i++) {
1623 var = __kmp_barrier_branch_bit_env_name[i];
1624 if ((strcmp(var, name) == 0) && (value != 0)) {
1627 comma = CCAST(
char *, strchr(value,
','));
1628 __kmp_barrier_gather_branch_bits[i] =
1629 (kmp_uint32)__kmp_str_to_int(value,
',');
1631 if (comma == NULL) {
1632 __kmp_barrier_release_branch_bits[i] = __kmp_barrier_release_bb_dflt;
1634 __kmp_barrier_release_branch_bits[i] =
1635 (kmp_uint32)__kmp_str_to_int(comma + 1, 0);
1637 if (__kmp_barrier_release_branch_bits[i] > KMP_MAX_BRANCH_BIT