10b57cec5SDimitry Andric /* 20b57cec5SDimitry Andric * kmp_settings.cpp -- Initialize environment variables 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 #include "kmp_atomic.h" 160b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 170b57cec5SDimitry Andric #include "kmp_dispatch_hier.h" 180b57cec5SDimitry Andric #endif 190b57cec5SDimitry Andric #include "kmp_environment.h" 200b57cec5SDimitry Andric #include "kmp_i18n.h" 210b57cec5SDimitry Andric #include "kmp_io.h" 220b57cec5SDimitry Andric #include "kmp_itt.h" 230b57cec5SDimitry Andric #include "kmp_lock.h" 240b57cec5SDimitry Andric #include "kmp_settings.h" 250b57cec5SDimitry Andric #include "kmp_str.h" 260b57cec5SDimitry Andric #include "kmp_wrapper_getpid.h" 270b57cec5SDimitry Andric #include <ctype.h> // toupper() 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric static int __kmp_env_toPrint(char const *name, int flag); 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric bool __kmp_env_format = 0; // 0 - old format; 1 - new format 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 340b57cec5SDimitry Andric // Helper string functions. Subject to move to kmp_str. 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric #ifdef USE_LOAD_BALANCE 370b57cec5SDimitry Andric static double __kmp_convert_to_double(char const *s) { 380b57cec5SDimitry Andric double result; 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric if (KMP_SSCANF(s, "%lf", &result) < 1) { 410b57cec5SDimitry Andric result = 0.0; 420b57cec5SDimitry Andric } 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric return result; 450b57cec5SDimitry Andric } 460b57cec5SDimitry Andric #endif 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric #ifdef KMP_DEBUG 490b57cec5SDimitry Andric static unsigned int __kmp_readstr_with_sentinel(char *dest, char const *src, 500b57cec5SDimitry Andric size_t len, char sentinel) { 510b57cec5SDimitry Andric unsigned int i; 520b57cec5SDimitry Andric for (i = 0; i < len; i++) { 530b57cec5SDimitry Andric if ((*src == '\0') || (*src == sentinel)) { 540b57cec5SDimitry Andric break; 550b57cec5SDimitry Andric } 560b57cec5SDimitry Andric *(dest++) = *(src++); 570b57cec5SDimitry Andric } 580b57cec5SDimitry Andric *dest = '\0'; 590b57cec5SDimitry Andric return i; 600b57cec5SDimitry Andric } 610b57cec5SDimitry Andric #endif 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric static int __kmp_match_with_sentinel(char const *a, char const *b, size_t len, 640b57cec5SDimitry Andric char sentinel) { 650b57cec5SDimitry Andric size_t l = 0; 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric if (a == NULL) 680b57cec5SDimitry Andric a = ""; 690b57cec5SDimitry Andric if (b == NULL) 700b57cec5SDimitry Andric b = ""; 710b57cec5SDimitry Andric while (*a && *b && *b != sentinel) { 720b57cec5SDimitry Andric char ca = *a, cb = *b; 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric if (ca >= 'a' && ca <= 'z') 750b57cec5SDimitry Andric ca -= 'a' - 'A'; 760b57cec5SDimitry Andric if (cb >= 'a' && cb <= 'z') 770b57cec5SDimitry Andric cb -= 'a' - 'A'; 780b57cec5SDimitry Andric if (ca != cb) 790b57cec5SDimitry Andric return FALSE; 800b57cec5SDimitry Andric ++l; 810b57cec5SDimitry Andric ++a; 820b57cec5SDimitry Andric ++b; 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric return l >= len; 850b57cec5SDimitry Andric } 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric // Expected usage: 880b57cec5SDimitry Andric // token is the token to check for. 890b57cec5SDimitry Andric // buf is the string being parsed. 900b57cec5SDimitry Andric // *end returns the char after the end of the token. 910b57cec5SDimitry Andric // it is not modified unless a match occurs. 920b57cec5SDimitry Andric // 930b57cec5SDimitry Andric // Example 1: 940b57cec5SDimitry Andric // 950b57cec5SDimitry Andric // if (__kmp_match_str("token", buf, *end) { 960b57cec5SDimitry Andric // <do something> 970b57cec5SDimitry Andric // buf = end; 980b57cec5SDimitry Andric // } 990b57cec5SDimitry Andric // 1000b57cec5SDimitry Andric // Example 2: 1010b57cec5SDimitry Andric // 1020b57cec5SDimitry Andric // if (__kmp_match_str("token", buf, *end) { 1030b57cec5SDimitry Andric // char *save = **end; 1040b57cec5SDimitry Andric // **end = sentinel; 1050b57cec5SDimitry Andric // <use any of the __kmp*_with_sentinel() functions> 1060b57cec5SDimitry Andric // **end = save; 1070b57cec5SDimitry Andric // buf = end; 1080b57cec5SDimitry Andric // } 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric static int __kmp_match_str(char const *token, char const *buf, 1110b57cec5SDimitry Andric const char **end) { 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric KMP_ASSERT(token != NULL); 1140b57cec5SDimitry Andric KMP_ASSERT(buf != NULL); 1150b57cec5SDimitry Andric KMP_ASSERT(end != NULL); 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric while (*token && *buf) { 1180b57cec5SDimitry Andric char ct = *token, cb = *buf; 1190b57cec5SDimitry Andric 1200b57cec5SDimitry Andric if (ct >= 'a' && ct <= 'z') 1210b57cec5SDimitry Andric ct -= 'a' - 'A'; 1220b57cec5SDimitry Andric if (cb >= 'a' && cb <= 'z') 1230b57cec5SDimitry Andric cb -= 'a' - 'A'; 1240b57cec5SDimitry Andric if (ct != cb) 1250b57cec5SDimitry Andric return FALSE; 1260b57cec5SDimitry Andric ++token; 1270b57cec5SDimitry Andric ++buf; 1280b57cec5SDimitry Andric } 1290b57cec5SDimitry Andric if (*token) { 1300b57cec5SDimitry Andric return FALSE; 1310b57cec5SDimitry Andric } 1320b57cec5SDimitry Andric *end = buf; 1330b57cec5SDimitry Andric return TRUE; 1340b57cec5SDimitry Andric } 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric #if KMP_OS_DARWIN 1370b57cec5SDimitry Andric static size_t __kmp_round4k(size_t size) { 1380b57cec5SDimitry Andric size_t _4k = 4 * 1024; 1390b57cec5SDimitry Andric if (size & (_4k - 1)) { 1400b57cec5SDimitry Andric size &= ~(_4k - 1); 1410b57cec5SDimitry Andric if (size <= KMP_SIZE_T_MAX - _4k) { 1420b57cec5SDimitry Andric size += _4k; // Round up if there is no overflow. 1430b57cec5SDimitry Andric } 1440b57cec5SDimitry Andric } 1450b57cec5SDimitry Andric return size; 1460b57cec5SDimitry Andric } // __kmp_round4k 1470b57cec5SDimitry Andric #endif 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andric /* Here, multipliers are like __kmp_convert_to_seconds, but floating-point 1500b57cec5SDimitry Andric values are allowed, and the return value is in milliseconds. The default 1510b57cec5SDimitry Andric multiplier is milliseconds. Returns INT_MAX only if the value specified 1520b57cec5SDimitry Andric matches "infinit*". Returns -1 if specified string is invalid. */ 1530b57cec5SDimitry Andric int __kmp_convert_to_milliseconds(char const *data) { 1540b57cec5SDimitry Andric int ret, nvalues, factor; 1550b57cec5SDimitry Andric char mult, extra; 1560b57cec5SDimitry Andric double value; 1570b57cec5SDimitry Andric 1580b57cec5SDimitry Andric if (data == NULL) 1590b57cec5SDimitry Andric return (-1); 1600b57cec5SDimitry Andric if (__kmp_str_match("infinit", -1, data)) 1610b57cec5SDimitry Andric return (INT_MAX); 1620b57cec5SDimitry Andric value = (double)0.0; 1630b57cec5SDimitry Andric mult = '\0'; 1640b57cec5SDimitry Andric nvalues = KMP_SSCANF(data, "%lf%c%c", &value, &mult, &extra); 1650b57cec5SDimitry Andric if (nvalues < 1) 1660b57cec5SDimitry Andric return (-1); 1670b57cec5SDimitry Andric if (nvalues == 1) 1680b57cec5SDimitry Andric mult = '\0'; 1690b57cec5SDimitry Andric if (nvalues == 3) 1700b57cec5SDimitry Andric return (-1); 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric if (value < 0) 1730b57cec5SDimitry Andric return (-1); 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric switch (mult) { 1760b57cec5SDimitry Andric case '\0': 1770b57cec5SDimitry Andric /* default is milliseconds */ 1780b57cec5SDimitry Andric factor = 1; 1790b57cec5SDimitry Andric break; 1800b57cec5SDimitry Andric case 's': 1810b57cec5SDimitry Andric case 'S': 1820b57cec5SDimitry Andric factor = 1000; 1830b57cec5SDimitry Andric break; 1840b57cec5SDimitry Andric case 'm': 1850b57cec5SDimitry Andric case 'M': 1860b57cec5SDimitry Andric factor = 1000 * 60; 1870b57cec5SDimitry Andric break; 1880b57cec5SDimitry Andric case 'h': 1890b57cec5SDimitry Andric case 'H': 1900b57cec5SDimitry Andric factor = 1000 * 60 * 60; 1910b57cec5SDimitry Andric break; 1920b57cec5SDimitry Andric case 'd': 1930b57cec5SDimitry Andric case 'D': 1940b57cec5SDimitry Andric factor = 1000 * 24 * 60 * 60; 1950b57cec5SDimitry Andric break; 1960b57cec5SDimitry Andric default: 1970b57cec5SDimitry Andric return (-1); 1980b57cec5SDimitry Andric } 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andric if (value >= ((INT_MAX - 1) / factor)) 2010b57cec5SDimitry Andric ret = INT_MAX - 1; /* Don't allow infinite value here */ 2020b57cec5SDimitry Andric else 2030b57cec5SDimitry Andric ret = (int)(value * (double)factor); /* truncate to int */ 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric return ret; 2060b57cec5SDimitry Andric } 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric static int __kmp_strcasecmp_with_sentinel(char const *a, char const *b, 2090b57cec5SDimitry Andric char sentinel) { 2100b57cec5SDimitry Andric if (a == NULL) 2110b57cec5SDimitry Andric a = ""; 2120b57cec5SDimitry Andric if (b == NULL) 2130b57cec5SDimitry Andric b = ""; 2140b57cec5SDimitry Andric while (*a && *b && *b != sentinel) { 2150b57cec5SDimitry Andric char ca = *a, cb = *b; 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andric if (ca >= 'a' && ca <= 'z') 2180b57cec5SDimitry Andric ca -= 'a' - 'A'; 2190b57cec5SDimitry Andric if (cb >= 'a' && cb <= 'z') 2200b57cec5SDimitry Andric cb -= 'a' - 'A'; 2210b57cec5SDimitry Andric if (ca != cb) 2220b57cec5SDimitry Andric return (int)(unsigned char)*a - (int)(unsigned char)*b; 2230b57cec5SDimitry Andric ++a; 2240b57cec5SDimitry Andric ++b; 2250b57cec5SDimitry Andric } 2260b57cec5SDimitry Andric return *a 2270b57cec5SDimitry Andric ? (*b && *b != sentinel) 2280b57cec5SDimitry Andric ? (int)(unsigned char)*a - (int)(unsigned char)*b 2290b57cec5SDimitry Andric : 1 2300b57cec5SDimitry Andric : (*b && *b != sentinel) ? -1 : 0; 2310b57cec5SDimitry Andric } 2320b57cec5SDimitry Andric 2330b57cec5SDimitry Andric // ============================================================================= 2340b57cec5SDimitry Andric // Table structures and helper functions. 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric typedef struct __kmp_setting kmp_setting_t; 2370b57cec5SDimitry Andric typedef struct __kmp_stg_ss_data kmp_stg_ss_data_t; 2380b57cec5SDimitry Andric typedef struct __kmp_stg_wp_data kmp_stg_wp_data_t; 2390b57cec5SDimitry Andric typedef struct __kmp_stg_fr_data kmp_stg_fr_data_t; 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric typedef void (*kmp_stg_parse_func_t)(char const *name, char const *value, 2420b57cec5SDimitry Andric void *data); 2430b57cec5SDimitry Andric typedef void (*kmp_stg_print_func_t)(kmp_str_buf_t *buffer, char const *name, 2440b57cec5SDimitry Andric void *data); 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric struct __kmp_setting { 2470b57cec5SDimitry Andric char const *name; // Name of setting (environment variable). 2480b57cec5SDimitry Andric kmp_stg_parse_func_t parse; // Parser function. 2490b57cec5SDimitry Andric kmp_stg_print_func_t print; // Print function. 2500b57cec5SDimitry Andric void *data; // Data passed to parser and printer. 2510b57cec5SDimitry Andric int set; // Variable set during this "session" 2520b57cec5SDimitry Andric // (__kmp_env_initialize() or kmp_set_defaults() call). 2530b57cec5SDimitry Andric int defined; // Variable set in any "session". 2540b57cec5SDimitry Andric }; // struct __kmp_setting 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric struct __kmp_stg_ss_data { 2570b57cec5SDimitry Andric size_t factor; // Default factor: 1 for KMP_STACKSIZE, 1024 for others. 2580b57cec5SDimitry Andric kmp_setting_t **rivals; // Array of pointers to rivals (including itself). 2590b57cec5SDimitry Andric }; // struct __kmp_stg_ss_data 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric struct __kmp_stg_wp_data { 2620b57cec5SDimitry Andric int omp; // 0 -- KMP_LIBRARY, 1 -- OMP_WAIT_POLICY. 2630b57cec5SDimitry Andric kmp_setting_t **rivals; // Array of pointers to rivals (including itself). 2640b57cec5SDimitry Andric }; // struct __kmp_stg_wp_data 2650b57cec5SDimitry Andric 2660b57cec5SDimitry Andric struct __kmp_stg_fr_data { 2670b57cec5SDimitry Andric int force; // 0 -- KMP_DETERMINISTIC_REDUCTION, 1 -- KMP_FORCE_REDUCTION. 2680b57cec5SDimitry Andric kmp_setting_t **rivals; // Array of pointers to rivals (including itself). 2690b57cec5SDimitry Andric }; // struct __kmp_stg_fr_data 2700b57cec5SDimitry Andric 2710b57cec5SDimitry Andric static int __kmp_stg_check_rivals( // 0 -- Ok, 1 -- errors found. 2720b57cec5SDimitry Andric char const *name, // Name of variable. 2730b57cec5SDimitry Andric char const *value, // Value of the variable. 2740b57cec5SDimitry Andric kmp_setting_t **rivals // List of rival settings (must include current one). 2750b57cec5SDimitry Andric ); 2760b57cec5SDimitry Andric 2770b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 2780b57cec5SDimitry Andric // Helper parse functions. 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric static void __kmp_stg_parse_bool(char const *name, char const *value, 2810b57cec5SDimitry Andric int *out) { 2820b57cec5SDimitry Andric if (__kmp_str_match_true(value)) { 2830b57cec5SDimitry Andric *out = TRUE; 2840b57cec5SDimitry Andric } else if (__kmp_str_match_false(value)) { 2850b57cec5SDimitry Andric *out = FALSE; 2860b57cec5SDimitry Andric } else { 2870b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(BadBoolValue, name, value), 2880b57cec5SDimitry Andric KMP_HNT(ValidBoolValues), __kmp_msg_null); 2890b57cec5SDimitry Andric } 2900b57cec5SDimitry Andric } // __kmp_stg_parse_bool 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric // placed here in order to use __kmp_round4k static function 2930b57cec5SDimitry Andric void __kmp_check_stksize(size_t *val) { 2940b57cec5SDimitry Andric // if system stack size is too big then limit the size for worker threads 2950b57cec5SDimitry Andric if (*val > KMP_DEFAULT_STKSIZE * 16) // just a heuristics... 2960b57cec5SDimitry Andric *val = KMP_DEFAULT_STKSIZE * 16; 2970b57cec5SDimitry Andric if (*val < KMP_MIN_STKSIZE) 2980b57cec5SDimitry Andric *val = KMP_MIN_STKSIZE; 2990b57cec5SDimitry Andric if (*val > KMP_MAX_STKSIZE) 3000b57cec5SDimitry Andric *val = KMP_MAX_STKSIZE; // dead code currently, but may work in future 3010b57cec5SDimitry Andric #if KMP_OS_DARWIN 3020b57cec5SDimitry Andric *val = __kmp_round4k(*val); 3030b57cec5SDimitry Andric #endif // KMP_OS_DARWIN 3040b57cec5SDimitry Andric } 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andric static void __kmp_stg_parse_size(char const *name, char const *value, 3070b57cec5SDimitry Andric size_t size_min, size_t size_max, 3080b57cec5SDimitry Andric int *is_specified, size_t *out, 3090b57cec5SDimitry Andric size_t factor) { 3100b57cec5SDimitry Andric char const *msg = NULL; 3110b57cec5SDimitry Andric #if KMP_OS_DARWIN 3120b57cec5SDimitry Andric size_min = __kmp_round4k(size_min); 3130b57cec5SDimitry Andric size_max = __kmp_round4k(size_max); 3140b57cec5SDimitry Andric #endif // KMP_OS_DARWIN 3150b57cec5SDimitry Andric if (value) { 3160b57cec5SDimitry Andric if (is_specified != NULL) { 3170b57cec5SDimitry Andric *is_specified = 1; 3180b57cec5SDimitry Andric } 3190b57cec5SDimitry Andric __kmp_str_to_size(value, out, factor, &msg); 3200b57cec5SDimitry Andric if (msg == NULL) { 3210b57cec5SDimitry Andric if (*out > size_max) { 3220b57cec5SDimitry Andric *out = size_max; 3230b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooLarge); 3240b57cec5SDimitry Andric } else if (*out < size_min) { 3250b57cec5SDimitry Andric *out = size_min; 3260b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooSmall); 3270b57cec5SDimitry Andric } else { 3280b57cec5SDimitry Andric #if KMP_OS_DARWIN 3290b57cec5SDimitry Andric size_t round4k = __kmp_round4k(*out); 3300b57cec5SDimitry Andric if (*out != round4k) { 3310b57cec5SDimitry Andric *out = round4k; 3320b57cec5SDimitry Andric msg = KMP_I18N_STR(NotMultiple4K); 3330b57cec5SDimitry Andric } 3340b57cec5SDimitry Andric #endif 3350b57cec5SDimitry Andric } 3360b57cec5SDimitry Andric } else { 3370b57cec5SDimitry Andric // If integer overflow occurred, * out == KMP_SIZE_T_MAX. Cut it to 3380b57cec5SDimitry Andric // size_max silently. 3390b57cec5SDimitry Andric if (*out < size_min) { 3400b57cec5SDimitry Andric *out = size_max; 3410b57cec5SDimitry Andric } else if (*out > size_max) { 3420b57cec5SDimitry Andric *out = size_max; 3430b57cec5SDimitry Andric } 3440b57cec5SDimitry Andric } 3450b57cec5SDimitry Andric if (msg != NULL) { 3460b57cec5SDimitry Andric // Message is not empty. Print warning. 3470b57cec5SDimitry Andric kmp_str_buf_t buf; 3480b57cec5SDimitry Andric __kmp_str_buf_init(&buf); 3490b57cec5SDimitry Andric __kmp_str_buf_print_size(&buf, *out); 3500b57cec5SDimitry Andric KMP_WARNING(ParseSizeIntWarn, name, value, msg); 3510b57cec5SDimitry Andric KMP_INFORM(Using_str_Value, name, buf.str); 3520b57cec5SDimitry Andric __kmp_str_buf_free(&buf); 3530b57cec5SDimitry Andric } 3540b57cec5SDimitry Andric } 3550b57cec5SDimitry Andric } // __kmp_stg_parse_size 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andric static void __kmp_stg_parse_str(char const *name, char const *value, 3580b57cec5SDimitry Andric char **out) { 3590b57cec5SDimitry Andric __kmp_str_free(out); 3600b57cec5SDimitry Andric *out = __kmp_str_format("%s", value); 3610b57cec5SDimitry Andric } // __kmp_stg_parse_str 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andric static void __kmp_stg_parse_int( 3640b57cec5SDimitry Andric char const 3650b57cec5SDimitry Andric *name, // I: Name of environment variable (used in warning messages). 3660b57cec5SDimitry Andric char const *value, // I: Value of environment variable to parse. 3675ffd83dbSDimitry Andric int min, // I: Minimum allowed value. 3680b57cec5SDimitry Andric int max, // I: Maximum allowed value. 3690b57cec5SDimitry Andric int *out // O: Output (parsed) value. 3700b57cec5SDimitry Andric ) { 3710b57cec5SDimitry Andric char const *msg = NULL; 3720b57cec5SDimitry Andric kmp_uint64 uint = *out; 3730b57cec5SDimitry Andric __kmp_str_to_uint(value, &uint, &msg); 3740b57cec5SDimitry Andric if (msg == NULL) { 3750b57cec5SDimitry Andric if (uint < (unsigned int)min) { 3760b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooSmall); 3770b57cec5SDimitry Andric uint = min; 3780b57cec5SDimitry Andric } else if (uint > (unsigned int)max) { 3790b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooLarge); 3800b57cec5SDimitry Andric uint = max; 3810b57cec5SDimitry Andric } 3820b57cec5SDimitry Andric } else { 3830b57cec5SDimitry Andric // If overflow occurred msg contains error message and uint is very big. Cut 3840b57cec5SDimitry Andric // tmp it to INT_MAX. 3850b57cec5SDimitry Andric if (uint < (unsigned int)min) { 3860b57cec5SDimitry Andric uint = min; 3870b57cec5SDimitry Andric } else if (uint > (unsigned int)max) { 3880b57cec5SDimitry Andric uint = max; 3890b57cec5SDimitry Andric } 3900b57cec5SDimitry Andric } 3910b57cec5SDimitry Andric if (msg != NULL) { 3920b57cec5SDimitry Andric // Message is not empty. Print warning. 3930b57cec5SDimitry Andric kmp_str_buf_t buf; 3940b57cec5SDimitry Andric KMP_WARNING(ParseSizeIntWarn, name, value, msg); 3950b57cec5SDimitry Andric __kmp_str_buf_init(&buf); 3960b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "%" KMP_UINT64_SPEC "", uint); 3970b57cec5SDimitry Andric KMP_INFORM(Using_uint64_Value, name, buf.str); 3980b57cec5SDimitry Andric __kmp_str_buf_free(&buf); 3990b57cec5SDimitry Andric } 400*e8d8bef9SDimitry Andric __kmp_type_convert(uint, out); 4010b57cec5SDimitry Andric } // __kmp_stg_parse_int 4020b57cec5SDimitry Andric 4030b57cec5SDimitry Andric #if KMP_DEBUG_ADAPTIVE_LOCKS 4040b57cec5SDimitry Andric static void __kmp_stg_parse_file(char const *name, char const *value, 4050b57cec5SDimitry Andric const char *suffix, char **out) { 4060b57cec5SDimitry Andric char buffer[256]; 4070b57cec5SDimitry Andric char *t; 4080b57cec5SDimitry Andric int hasSuffix; 4090b57cec5SDimitry Andric __kmp_str_free(out); 4100b57cec5SDimitry Andric t = (char *)strrchr(value, '.'); 4110b57cec5SDimitry Andric hasSuffix = t && __kmp_str_eqf(t, suffix); 4120b57cec5SDimitry Andric t = __kmp_str_format("%s%s", value, hasSuffix ? "" : suffix); 4130b57cec5SDimitry Andric __kmp_expand_file_name(buffer, sizeof(buffer), t); 4140b57cec5SDimitry Andric __kmp_str_free(&t); 4150b57cec5SDimitry Andric *out = __kmp_str_format("%s", buffer); 4160b57cec5SDimitry Andric } // __kmp_stg_parse_file 4170b57cec5SDimitry Andric #endif 4180b57cec5SDimitry Andric 4190b57cec5SDimitry Andric #ifdef KMP_DEBUG 4200b57cec5SDimitry Andric static char *par_range_to_print = NULL; 4210b57cec5SDimitry Andric 4220b57cec5SDimitry Andric static void __kmp_stg_parse_par_range(char const *name, char const *value, 4230b57cec5SDimitry Andric int *out_range, char *out_routine, 4240b57cec5SDimitry Andric char *out_file, int *out_lb, 4250b57cec5SDimitry Andric int *out_ub) { 4260b57cec5SDimitry Andric size_t len = KMP_STRLEN(value) + 1; 4270b57cec5SDimitry Andric par_range_to_print = (char *)KMP_INTERNAL_MALLOC(len + 1); 4280b57cec5SDimitry Andric KMP_STRNCPY_S(par_range_to_print, len + 1, value, len + 1); 4290b57cec5SDimitry Andric __kmp_par_range = +1; 4300b57cec5SDimitry Andric __kmp_par_range_lb = 0; 4310b57cec5SDimitry Andric __kmp_par_range_ub = INT_MAX; 4320b57cec5SDimitry Andric for (;;) { 4330b57cec5SDimitry Andric unsigned int len; 4340b57cec5SDimitry Andric if (*value == '\0') { 4350b57cec5SDimitry Andric break; 4360b57cec5SDimitry Andric } 4370b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("routine", value, '=')) { 4380b57cec5SDimitry Andric value = strchr(value, '=') + 1; 4390b57cec5SDimitry Andric len = __kmp_readstr_with_sentinel(out_routine, value, 4400b57cec5SDimitry Andric KMP_PAR_RANGE_ROUTINE_LEN - 1, ','); 4410b57cec5SDimitry Andric if (len == 0) { 4420b57cec5SDimitry Andric goto par_range_error; 4430b57cec5SDimitry Andric } 4440b57cec5SDimitry Andric value = strchr(value, ','); 4450b57cec5SDimitry Andric if (value != NULL) { 4460b57cec5SDimitry Andric value++; 4470b57cec5SDimitry Andric } 4480b57cec5SDimitry Andric continue; 4490b57cec5SDimitry Andric } 4500b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("filename", value, '=')) { 4510b57cec5SDimitry Andric value = strchr(value, '=') + 1; 4520b57cec5SDimitry Andric len = __kmp_readstr_with_sentinel(out_file, value, 4530b57cec5SDimitry Andric KMP_PAR_RANGE_FILENAME_LEN - 1, ','); 4540b57cec5SDimitry Andric if (len == 0) { 4550b57cec5SDimitry Andric goto par_range_error; 4560b57cec5SDimitry Andric } 4570b57cec5SDimitry Andric value = strchr(value, ','); 4580b57cec5SDimitry Andric if (value != NULL) { 4590b57cec5SDimitry Andric value++; 4600b57cec5SDimitry Andric } 4610b57cec5SDimitry Andric continue; 4620b57cec5SDimitry Andric } 4630b57cec5SDimitry Andric if ((!__kmp_strcasecmp_with_sentinel("range", value, '=')) || 4640b57cec5SDimitry Andric (!__kmp_strcasecmp_with_sentinel("incl_range", value, '='))) { 4650b57cec5SDimitry Andric value = strchr(value, '=') + 1; 4660b57cec5SDimitry Andric if (KMP_SSCANF(value, "%d:%d", out_lb, out_ub) != 2) { 4670b57cec5SDimitry Andric goto par_range_error; 4680b57cec5SDimitry Andric } 4690b57cec5SDimitry Andric *out_range = +1; 4700b57cec5SDimitry Andric value = strchr(value, ','); 4710b57cec5SDimitry Andric if (value != NULL) { 4720b57cec5SDimitry Andric value++; 4730b57cec5SDimitry Andric } 4740b57cec5SDimitry Andric continue; 4750b57cec5SDimitry Andric } 4760b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("excl_range", value, '=')) { 4770b57cec5SDimitry Andric value = strchr(value, '=') + 1; 4780b57cec5SDimitry Andric if (KMP_SSCANF(value, "%d:%d", out_lb, out_ub) != 2) { 4790b57cec5SDimitry Andric goto par_range_error; 4800b57cec5SDimitry Andric } 4810b57cec5SDimitry Andric *out_range = -1; 4820b57cec5SDimitry Andric value = strchr(value, ','); 4830b57cec5SDimitry Andric if (value != NULL) { 4840b57cec5SDimitry Andric value++; 4850b57cec5SDimitry Andric } 4860b57cec5SDimitry Andric continue; 4870b57cec5SDimitry Andric } 4880b57cec5SDimitry Andric par_range_error: 4890b57cec5SDimitry Andric KMP_WARNING(ParRangeSyntax, name); 4900b57cec5SDimitry Andric __kmp_par_range = 0; 4910b57cec5SDimitry Andric break; 4920b57cec5SDimitry Andric } 4930b57cec5SDimitry Andric } // __kmp_stg_parse_par_range 4940b57cec5SDimitry Andric #endif 4950b57cec5SDimitry Andric 4960b57cec5SDimitry Andric int __kmp_initial_threads_capacity(int req_nproc) { 4970b57cec5SDimitry Andric int nth = 32; 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andric /* MIN( MAX( 32, 4 * $OMP_NUM_THREADS, 4 * omp_get_num_procs() ), 5000b57cec5SDimitry Andric * __kmp_max_nth) */ 5010b57cec5SDimitry Andric if (nth < (4 * req_nproc)) 5020b57cec5SDimitry Andric nth = (4 * req_nproc); 5030b57cec5SDimitry Andric if (nth < (4 * __kmp_xproc)) 5040b57cec5SDimitry Andric nth = (4 * __kmp_xproc); 5050b57cec5SDimitry Andric 506*e8d8bef9SDimitry Andric // If hidden helper task is enabled, we initialize the thread capacity with 507*e8d8bef9SDimitry Andric // extra 508*e8d8bef9SDimitry Andric // __kmp_hidden_helper_threads_num. 509*e8d8bef9SDimitry Andric nth += __kmp_hidden_helper_threads_num; 510*e8d8bef9SDimitry Andric 5110b57cec5SDimitry Andric if (nth > __kmp_max_nth) 5120b57cec5SDimitry Andric nth = __kmp_max_nth; 5130b57cec5SDimitry Andric 5140b57cec5SDimitry Andric return nth; 5150b57cec5SDimitry Andric } 5160b57cec5SDimitry Andric 5170b57cec5SDimitry Andric int __kmp_default_tp_capacity(int req_nproc, int max_nth, 5180b57cec5SDimitry Andric int all_threads_specified) { 5190b57cec5SDimitry Andric int nth = 128; 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric if (all_threads_specified) 5220b57cec5SDimitry Andric return max_nth; 5230b57cec5SDimitry Andric /* MIN( MAX (128, 4 * $OMP_NUM_THREADS, 4 * omp_get_num_procs() ), 5240b57cec5SDimitry Andric * __kmp_max_nth ) */ 5250b57cec5SDimitry Andric if (nth < (4 * req_nproc)) 5260b57cec5SDimitry Andric nth = (4 * req_nproc); 5270b57cec5SDimitry Andric if (nth < (4 * __kmp_xproc)) 5280b57cec5SDimitry Andric nth = (4 * __kmp_xproc); 5290b57cec5SDimitry Andric 5300b57cec5SDimitry Andric if (nth > __kmp_max_nth) 5310b57cec5SDimitry Andric nth = __kmp_max_nth; 5320b57cec5SDimitry Andric 5330b57cec5SDimitry Andric return nth; 5340b57cec5SDimitry Andric } 5350b57cec5SDimitry Andric 5360b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 5370b57cec5SDimitry Andric // Helper print functions. 5380b57cec5SDimitry Andric 5390b57cec5SDimitry Andric static void __kmp_stg_print_bool(kmp_str_buf_t *buffer, char const *name, 5400b57cec5SDimitry Andric int value) { 5410b57cec5SDimitry Andric if (__kmp_env_format) { 5420b57cec5SDimitry Andric KMP_STR_BUF_PRINT_BOOL; 5430b57cec5SDimitry Andric } else { 5440b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=%s\n", name, value ? "true" : "false"); 5450b57cec5SDimitry Andric } 5460b57cec5SDimitry Andric } // __kmp_stg_print_bool 5470b57cec5SDimitry Andric 5480b57cec5SDimitry Andric static void __kmp_stg_print_int(kmp_str_buf_t *buffer, char const *name, 5490b57cec5SDimitry Andric int value) { 5500b57cec5SDimitry Andric if (__kmp_env_format) { 5510b57cec5SDimitry Andric KMP_STR_BUF_PRINT_INT; 5520b57cec5SDimitry Andric } else { 5530b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=%d\n", name, value); 5540b57cec5SDimitry Andric } 5550b57cec5SDimitry Andric } // __kmp_stg_print_int 5560b57cec5SDimitry Andric 5570b57cec5SDimitry Andric static void __kmp_stg_print_uint64(kmp_str_buf_t *buffer, char const *name, 5580b57cec5SDimitry Andric kmp_uint64 value) { 5590b57cec5SDimitry Andric if (__kmp_env_format) { 5600b57cec5SDimitry Andric KMP_STR_BUF_PRINT_UINT64; 5610b57cec5SDimitry Andric } else { 5620b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=%" KMP_UINT64_SPEC "\n", name, value); 5630b57cec5SDimitry Andric } 5640b57cec5SDimitry Andric } // __kmp_stg_print_uint64 5650b57cec5SDimitry Andric 5660b57cec5SDimitry Andric static void __kmp_stg_print_str(kmp_str_buf_t *buffer, char const *name, 5670b57cec5SDimitry Andric char const *value) { 5680b57cec5SDimitry Andric if (__kmp_env_format) { 5690b57cec5SDimitry Andric KMP_STR_BUF_PRINT_STR; 5700b57cec5SDimitry Andric } else { 5710b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=%s\n", name, value); 5720b57cec5SDimitry Andric } 5730b57cec5SDimitry Andric } // __kmp_stg_print_str 5740b57cec5SDimitry Andric 5750b57cec5SDimitry Andric static void __kmp_stg_print_size(kmp_str_buf_t *buffer, char const *name, 5760b57cec5SDimitry Andric size_t value) { 5770b57cec5SDimitry Andric if (__kmp_env_format) { 5780b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 5790b57cec5SDimitry Andric __kmp_str_buf_print_size(buffer, value); 5800b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "'\n"); 5810b57cec5SDimitry Andric } else { 5820b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=", name); 5830b57cec5SDimitry Andric __kmp_str_buf_print_size(buffer, value); 5840b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "\n"); 5850b57cec5SDimitry Andric return; 5860b57cec5SDimitry Andric } 5870b57cec5SDimitry Andric } // __kmp_stg_print_size 5880b57cec5SDimitry Andric 5890b57cec5SDimitry Andric // ============================================================================= 5900b57cec5SDimitry Andric // Parse and print functions. 5910b57cec5SDimitry Andric 5920b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 5930b57cec5SDimitry Andric // KMP_DEVICE_THREAD_LIMIT, KMP_ALL_THREADS 5940b57cec5SDimitry Andric 5950b57cec5SDimitry Andric static void __kmp_stg_parse_device_thread_limit(char const *name, 5960b57cec5SDimitry Andric char const *value, void *data) { 5970b57cec5SDimitry Andric kmp_setting_t **rivals = (kmp_setting_t **)data; 5980b57cec5SDimitry Andric int rc; 5990b57cec5SDimitry Andric if (strcmp(name, "KMP_ALL_THREADS") == 0) { 6000b57cec5SDimitry Andric KMP_INFORM(EnvVarDeprecated, name, "KMP_DEVICE_THREAD_LIMIT"); 6010b57cec5SDimitry Andric } 6020b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, rivals); 6030b57cec5SDimitry Andric if (rc) { 6040b57cec5SDimitry Andric return; 6050b57cec5SDimitry Andric } 6060b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("all", value, 0)) { 6070b57cec5SDimitry Andric __kmp_max_nth = __kmp_xproc; 6080b57cec5SDimitry Andric __kmp_allThreadsSpecified = 1; 6090b57cec5SDimitry Andric } else { 6100b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth, &__kmp_max_nth); 6110b57cec5SDimitry Andric __kmp_allThreadsSpecified = 0; 6120b57cec5SDimitry Andric } 6130b57cec5SDimitry Andric K_DIAG(1, ("__kmp_max_nth == %d\n", __kmp_max_nth)); 6140b57cec5SDimitry Andric 6150b57cec5SDimitry Andric } // __kmp_stg_parse_device_thread_limit 6160b57cec5SDimitry Andric 6170b57cec5SDimitry Andric static void __kmp_stg_print_device_thread_limit(kmp_str_buf_t *buffer, 6180b57cec5SDimitry Andric char const *name, void *data) { 6190b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_max_nth); 6200b57cec5SDimitry Andric } // __kmp_stg_print_device_thread_limit 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 6230b57cec5SDimitry Andric // OMP_THREAD_LIMIT 6240b57cec5SDimitry Andric static void __kmp_stg_parse_thread_limit(char const *name, char const *value, 6250b57cec5SDimitry Andric void *data) { 6260b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth, &__kmp_cg_max_nth); 6270b57cec5SDimitry Andric K_DIAG(1, ("__kmp_cg_max_nth == %d\n", __kmp_cg_max_nth)); 6280b57cec5SDimitry Andric 6290b57cec5SDimitry Andric } // __kmp_stg_parse_thread_limit 6300b57cec5SDimitry Andric 6310b57cec5SDimitry Andric static void __kmp_stg_print_thread_limit(kmp_str_buf_t *buffer, 6320b57cec5SDimitry Andric char const *name, void *data) { 6330b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_cg_max_nth); 6340b57cec5SDimitry Andric } // __kmp_stg_print_thread_limit 6350b57cec5SDimitry Andric 6360b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 6370b57cec5SDimitry Andric // KMP_TEAMS_THREAD_LIMIT 6380b57cec5SDimitry Andric static void __kmp_stg_parse_teams_thread_limit(char const *name, 6390b57cec5SDimitry Andric char const *value, void *data) { 6400b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 1, __kmp_sys_max_nth, &__kmp_teams_max_nth); 6410b57cec5SDimitry Andric } // __kmp_stg_teams_thread_limit 6420b57cec5SDimitry Andric 6430b57cec5SDimitry Andric static void __kmp_stg_print_teams_thread_limit(kmp_str_buf_t *buffer, 6440b57cec5SDimitry Andric char const *name, void *data) { 6450b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_teams_max_nth); 6460b57cec5SDimitry Andric } // __kmp_stg_print_teams_thread_limit 6470b57cec5SDimitry Andric 6480b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 6490b57cec5SDimitry Andric // KMP_USE_YIELD 6500b57cec5SDimitry Andric static void __kmp_stg_parse_use_yield(char const *name, char const *value, 6510b57cec5SDimitry Andric void *data) { 6520b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, 2, &__kmp_use_yield); 6530b57cec5SDimitry Andric __kmp_use_yield_exp_set = 1; 6540b57cec5SDimitry Andric } // __kmp_stg_parse_use_yield 6550b57cec5SDimitry Andric 6560b57cec5SDimitry Andric static void __kmp_stg_print_use_yield(kmp_str_buf_t *buffer, char const *name, 6570b57cec5SDimitry Andric void *data) { 6580b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_use_yield); 6590b57cec5SDimitry Andric } // __kmp_stg_print_use_yield 6600b57cec5SDimitry Andric 6610b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 6620b57cec5SDimitry Andric // KMP_BLOCKTIME 6630b57cec5SDimitry Andric 6640b57cec5SDimitry Andric static void __kmp_stg_parse_blocktime(char const *name, char const *value, 6650b57cec5SDimitry Andric void *data) { 6660b57cec5SDimitry Andric __kmp_dflt_blocktime = __kmp_convert_to_milliseconds(value); 6670b57cec5SDimitry Andric if (__kmp_dflt_blocktime < 0) { 6680b57cec5SDimitry Andric __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME; 6690b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(InvalidValue, name, value), 6700b57cec5SDimitry Andric __kmp_msg_null); 6710b57cec5SDimitry Andric KMP_INFORM(Using_int_Value, name, __kmp_dflt_blocktime); 6720b57cec5SDimitry Andric __kmp_env_blocktime = FALSE; // Revert to default as if var not set. 6730b57cec5SDimitry Andric } else { 6740b57cec5SDimitry Andric if (__kmp_dflt_blocktime < KMP_MIN_BLOCKTIME) { 6750b57cec5SDimitry Andric __kmp_dflt_blocktime = KMP_MIN_BLOCKTIME; 6760b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(SmallValue, name, value), 6770b57cec5SDimitry Andric __kmp_msg_null); 6780b57cec5SDimitry Andric KMP_INFORM(MinValueUsing, name, __kmp_dflt_blocktime); 6790b57cec5SDimitry Andric } else if (__kmp_dflt_blocktime > KMP_MAX_BLOCKTIME) { 6800b57cec5SDimitry Andric __kmp_dflt_blocktime = KMP_MAX_BLOCKTIME; 6810b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(LargeValue, name, value), 6820b57cec5SDimitry Andric __kmp_msg_null); 6830b57cec5SDimitry Andric KMP_INFORM(MaxValueUsing, name, __kmp_dflt_blocktime); 6840b57cec5SDimitry Andric } 6850b57cec5SDimitry Andric __kmp_env_blocktime = TRUE; // KMP_BLOCKTIME was specified. 6860b57cec5SDimitry Andric } 6870b57cec5SDimitry Andric #if KMP_USE_MONITOR 6880b57cec5SDimitry Andric // calculate number of monitor thread wakeup intervals corresponding to 6890b57cec5SDimitry Andric // blocktime. 6900b57cec5SDimitry Andric __kmp_monitor_wakeups = 6910b57cec5SDimitry Andric KMP_WAKEUPS_FROM_BLOCKTIME(__kmp_dflt_blocktime, __kmp_monitor_wakeups); 6920b57cec5SDimitry Andric __kmp_bt_intervals = 6930b57cec5SDimitry Andric KMP_INTERVALS_FROM_BLOCKTIME(__kmp_dflt_blocktime, __kmp_monitor_wakeups); 6940b57cec5SDimitry Andric #endif 6950b57cec5SDimitry Andric K_DIAG(1, ("__kmp_env_blocktime == %d\n", __kmp_env_blocktime)); 6960b57cec5SDimitry Andric if (__kmp_env_blocktime) { 6970b57cec5SDimitry Andric K_DIAG(1, ("__kmp_dflt_blocktime == %d\n", __kmp_dflt_blocktime)); 6980b57cec5SDimitry Andric } 6990b57cec5SDimitry Andric } // __kmp_stg_parse_blocktime 7000b57cec5SDimitry Andric 7010b57cec5SDimitry Andric static void __kmp_stg_print_blocktime(kmp_str_buf_t *buffer, char const *name, 7020b57cec5SDimitry Andric void *data) { 7030b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_dflt_blocktime); 7040b57cec5SDimitry Andric } // __kmp_stg_print_blocktime 7050b57cec5SDimitry Andric 7060b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 7070b57cec5SDimitry Andric // KMP_DUPLICATE_LIB_OK 7080b57cec5SDimitry Andric 7090b57cec5SDimitry Andric static void __kmp_stg_parse_duplicate_lib_ok(char const *name, 7100b57cec5SDimitry Andric char const *value, void *data) { 7110b57cec5SDimitry Andric /* actually this variable is not supported, put here for compatibility with 7120b57cec5SDimitry Andric earlier builds and for static/dynamic combination */ 7130b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_duplicate_library_ok); 7140b57cec5SDimitry Andric } // __kmp_stg_parse_duplicate_lib_ok 7150b57cec5SDimitry Andric 7160b57cec5SDimitry Andric static void __kmp_stg_print_duplicate_lib_ok(kmp_str_buf_t *buffer, 7170b57cec5SDimitry Andric char const *name, void *data) { 7180b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_duplicate_library_ok); 7190b57cec5SDimitry Andric } // __kmp_stg_print_duplicate_lib_ok 7200b57cec5SDimitry Andric 7210b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 7220b57cec5SDimitry Andric // KMP_INHERIT_FP_CONTROL 7230b57cec5SDimitry Andric 7240b57cec5SDimitry Andric #if KMP_ARCH_X86 || KMP_ARCH_X86_64 7250b57cec5SDimitry Andric 7260b57cec5SDimitry Andric static void __kmp_stg_parse_inherit_fp_control(char const *name, 7270b57cec5SDimitry Andric char const *value, void *data) { 7280b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_inherit_fp_control); 7290b57cec5SDimitry Andric } // __kmp_stg_parse_inherit_fp_control 7300b57cec5SDimitry Andric 7310b57cec5SDimitry Andric static void __kmp_stg_print_inherit_fp_control(kmp_str_buf_t *buffer, 7320b57cec5SDimitry Andric char const *name, void *data) { 7330b57cec5SDimitry Andric #if KMP_DEBUG 7340b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_inherit_fp_control); 7350b57cec5SDimitry Andric #endif /* KMP_DEBUG */ 7360b57cec5SDimitry Andric } // __kmp_stg_print_inherit_fp_control 7370b57cec5SDimitry Andric 7380b57cec5SDimitry Andric #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ 7390b57cec5SDimitry Andric 7400b57cec5SDimitry Andric // Used for OMP_WAIT_POLICY 7410b57cec5SDimitry Andric static char const *blocktime_str = NULL; 7420b57cec5SDimitry Andric 7430b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 7440b57cec5SDimitry Andric // KMP_LIBRARY, OMP_WAIT_POLICY 7450b57cec5SDimitry Andric 7460b57cec5SDimitry Andric static void __kmp_stg_parse_wait_policy(char const *name, char const *value, 7470b57cec5SDimitry Andric void *data) { 7480b57cec5SDimitry Andric 7490b57cec5SDimitry Andric kmp_stg_wp_data_t *wait = (kmp_stg_wp_data_t *)data; 7500b57cec5SDimitry Andric int rc; 7510b57cec5SDimitry Andric 7520b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, wait->rivals); 7530b57cec5SDimitry Andric if (rc) { 7540b57cec5SDimitry Andric return; 7550b57cec5SDimitry Andric } 7560b57cec5SDimitry Andric 7570b57cec5SDimitry Andric if (wait->omp) { 7580b57cec5SDimitry Andric if (__kmp_str_match("ACTIVE", 1, value)) { 7590b57cec5SDimitry Andric __kmp_library = library_turnaround; 7600b57cec5SDimitry Andric if (blocktime_str == NULL) { 7610b57cec5SDimitry Andric // KMP_BLOCKTIME not specified, so set default to "infinite". 7620b57cec5SDimitry Andric __kmp_dflt_blocktime = KMP_MAX_BLOCKTIME; 7630b57cec5SDimitry Andric } 7640b57cec5SDimitry Andric } else if (__kmp_str_match("PASSIVE", 1, value)) { 7650b57cec5SDimitry Andric __kmp_library = library_throughput; 7660b57cec5SDimitry Andric if (blocktime_str == NULL) { 7670b57cec5SDimitry Andric // KMP_BLOCKTIME not specified, so set default to 0. 7680b57cec5SDimitry Andric __kmp_dflt_blocktime = 0; 7690b57cec5SDimitry Andric } 7700b57cec5SDimitry Andric } else { 7710b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 7720b57cec5SDimitry Andric } 7730b57cec5SDimitry Andric } else { 7740b57cec5SDimitry Andric if (__kmp_str_match("serial", 1, value)) { /* S */ 7750b57cec5SDimitry Andric __kmp_library = library_serial; 7760b57cec5SDimitry Andric } else if (__kmp_str_match("throughput", 2, value)) { /* TH */ 7770b57cec5SDimitry Andric __kmp_library = library_throughput; 7780b57cec5SDimitry Andric if (blocktime_str == NULL) { 7790b57cec5SDimitry Andric // KMP_BLOCKTIME not specified, so set default to 0. 7800b57cec5SDimitry Andric __kmp_dflt_blocktime = 0; 7810b57cec5SDimitry Andric } 7820b57cec5SDimitry Andric } else if (__kmp_str_match("turnaround", 2, value)) { /* TU */ 7830b57cec5SDimitry Andric __kmp_library = library_turnaround; 7840b57cec5SDimitry Andric } else if (__kmp_str_match("dedicated", 1, value)) { /* D */ 7850b57cec5SDimitry Andric __kmp_library = library_turnaround; 7860b57cec5SDimitry Andric } else if (__kmp_str_match("multiuser", 1, value)) { /* M */ 7870b57cec5SDimitry Andric __kmp_library = library_throughput; 7880b57cec5SDimitry Andric if (blocktime_str == NULL) { 7890b57cec5SDimitry Andric // KMP_BLOCKTIME not specified, so set default to 0. 7900b57cec5SDimitry Andric __kmp_dflt_blocktime = 0; 7910b57cec5SDimitry Andric } 7920b57cec5SDimitry Andric } else { 7930b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 7940b57cec5SDimitry Andric } 7950b57cec5SDimitry Andric } 7960b57cec5SDimitry Andric } // __kmp_stg_parse_wait_policy 7970b57cec5SDimitry Andric 7980b57cec5SDimitry Andric static void __kmp_stg_print_wait_policy(kmp_str_buf_t *buffer, char const *name, 7990b57cec5SDimitry Andric void *data) { 8000b57cec5SDimitry Andric 8010b57cec5SDimitry Andric kmp_stg_wp_data_t *wait = (kmp_stg_wp_data_t *)data; 8020b57cec5SDimitry Andric char const *value = NULL; 8030b57cec5SDimitry Andric 8040b57cec5SDimitry Andric if (wait->omp) { 8050b57cec5SDimitry Andric switch (__kmp_library) { 8060b57cec5SDimitry Andric case library_turnaround: { 8070b57cec5SDimitry Andric value = "ACTIVE"; 8080b57cec5SDimitry Andric } break; 8090b57cec5SDimitry Andric case library_throughput: { 8100b57cec5SDimitry Andric value = "PASSIVE"; 8110b57cec5SDimitry Andric } break; 8120b57cec5SDimitry Andric } 8130b57cec5SDimitry Andric } else { 8140b57cec5SDimitry Andric switch (__kmp_library) { 8150b57cec5SDimitry Andric case library_serial: { 8160b57cec5SDimitry Andric value = "serial"; 8170b57cec5SDimitry Andric } break; 8180b57cec5SDimitry Andric case library_turnaround: { 8190b57cec5SDimitry Andric value = "turnaround"; 8200b57cec5SDimitry Andric } break; 8210b57cec5SDimitry Andric case library_throughput: { 8220b57cec5SDimitry Andric value = "throughput"; 8230b57cec5SDimitry Andric } break; 8240b57cec5SDimitry Andric } 8250b57cec5SDimitry Andric } 8260b57cec5SDimitry Andric if (value != NULL) { 8270b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, value); 8280b57cec5SDimitry Andric } 8290b57cec5SDimitry Andric 8300b57cec5SDimitry Andric } // __kmp_stg_print_wait_policy 8310b57cec5SDimitry Andric 8320b57cec5SDimitry Andric #if KMP_USE_MONITOR 8330b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 8340b57cec5SDimitry Andric // KMP_MONITOR_STACKSIZE 8350b57cec5SDimitry Andric 8360b57cec5SDimitry Andric static void __kmp_stg_parse_monitor_stacksize(char const *name, 8370b57cec5SDimitry Andric char const *value, void *data) { 8380b57cec5SDimitry Andric __kmp_stg_parse_size(name, value, __kmp_sys_min_stksize, KMP_MAX_STKSIZE, 8390b57cec5SDimitry Andric NULL, &__kmp_monitor_stksize, 1); 8400b57cec5SDimitry Andric } // __kmp_stg_parse_monitor_stacksize 8410b57cec5SDimitry Andric 8420b57cec5SDimitry Andric static void __kmp_stg_print_monitor_stacksize(kmp_str_buf_t *buffer, 8430b57cec5SDimitry Andric char const *name, void *data) { 8440b57cec5SDimitry Andric if (__kmp_env_format) { 8450b57cec5SDimitry Andric if (__kmp_monitor_stksize > 0) 8460b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 8470b57cec5SDimitry Andric else 8480b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 8490b57cec5SDimitry Andric } else { 8500b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 8510b57cec5SDimitry Andric } 8520b57cec5SDimitry Andric if (__kmp_monitor_stksize > 0) { 8530b57cec5SDimitry Andric __kmp_str_buf_print_size(buffer, __kmp_monitor_stksize); 8540b57cec5SDimitry Andric } else { 8550b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 8560b57cec5SDimitry Andric } 8570b57cec5SDimitry Andric if (__kmp_env_format && __kmp_monitor_stksize) { 8580b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "'\n"); 8590b57cec5SDimitry Andric } 8600b57cec5SDimitry Andric } // __kmp_stg_print_monitor_stacksize 8610b57cec5SDimitry Andric #endif // KMP_USE_MONITOR 8620b57cec5SDimitry Andric 8630b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 8640b57cec5SDimitry Andric // KMP_SETTINGS 8650b57cec5SDimitry Andric 8660b57cec5SDimitry Andric static void __kmp_stg_parse_settings(char const *name, char const *value, 8670b57cec5SDimitry Andric void *data) { 8680b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_settings); 8690b57cec5SDimitry Andric } // __kmp_stg_parse_settings 8700b57cec5SDimitry Andric 8710b57cec5SDimitry Andric static void __kmp_stg_print_settings(kmp_str_buf_t *buffer, char const *name, 8720b57cec5SDimitry Andric void *data) { 8730b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_settings); 8740b57cec5SDimitry Andric } // __kmp_stg_print_settings 8750b57cec5SDimitry Andric 8760b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 8770b57cec5SDimitry Andric // KMP_STACKPAD 8780b57cec5SDimitry Andric 8790b57cec5SDimitry Andric static void __kmp_stg_parse_stackpad(char const *name, char const *value, 8800b57cec5SDimitry Andric void *data) { 8810b57cec5SDimitry Andric __kmp_stg_parse_int(name, // Env var name 8820b57cec5SDimitry Andric value, // Env var value 8830b57cec5SDimitry Andric KMP_MIN_STKPADDING, // Min value 8840b57cec5SDimitry Andric KMP_MAX_STKPADDING, // Max value 8850b57cec5SDimitry Andric &__kmp_stkpadding // Var to initialize 8860b57cec5SDimitry Andric ); 8870b57cec5SDimitry Andric } // __kmp_stg_parse_stackpad 8880b57cec5SDimitry Andric 8890b57cec5SDimitry Andric static void __kmp_stg_print_stackpad(kmp_str_buf_t *buffer, char const *name, 8900b57cec5SDimitry Andric void *data) { 8910b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_stkpadding); 8920b57cec5SDimitry Andric } // __kmp_stg_print_stackpad 8930b57cec5SDimitry Andric 8940b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 8950b57cec5SDimitry Andric // KMP_STACKOFFSET 8960b57cec5SDimitry Andric 8970b57cec5SDimitry Andric static void __kmp_stg_parse_stackoffset(char const *name, char const *value, 8980b57cec5SDimitry Andric void *data) { 8990b57cec5SDimitry Andric __kmp_stg_parse_size(name, // Env var name 9000b57cec5SDimitry Andric value, // Env var value 9010b57cec5SDimitry Andric KMP_MIN_STKOFFSET, // Min value 9020b57cec5SDimitry Andric KMP_MAX_STKOFFSET, // Max value 9030b57cec5SDimitry Andric NULL, // 9040b57cec5SDimitry Andric &__kmp_stkoffset, // Var to initialize 9050b57cec5SDimitry Andric 1); 9060b57cec5SDimitry Andric } // __kmp_stg_parse_stackoffset 9070b57cec5SDimitry Andric 9080b57cec5SDimitry Andric static void __kmp_stg_print_stackoffset(kmp_str_buf_t *buffer, char const *name, 9090b57cec5SDimitry Andric void *data) { 9100b57cec5SDimitry Andric __kmp_stg_print_size(buffer, name, __kmp_stkoffset); 9110b57cec5SDimitry Andric } // __kmp_stg_print_stackoffset 9120b57cec5SDimitry Andric 9130b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 9140b57cec5SDimitry Andric // KMP_STACKSIZE, OMP_STACKSIZE, GOMP_STACKSIZE 9150b57cec5SDimitry Andric 9160b57cec5SDimitry Andric static void __kmp_stg_parse_stacksize(char const *name, char const *value, 9170b57cec5SDimitry Andric void *data) { 9180b57cec5SDimitry Andric 9190b57cec5SDimitry Andric kmp_stg_ss_data_t *stacksize = (kmp_stg_ss_data_t *)data; 9200b57cec5SDimitry Andric int rc; 9210b57cec5SDimitry Andric 9220b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, stacksize->rivals); 9230b57cec5SDimitry Andric if (rc) { 9240b57cec5SDimitry Andric return; 9250b57cec5SDimitry Andric } 9260b57cec5SDimitry Andric __kmp_stg_parse_size(name, // Env var name 9270b57cec5SDimitry Andric value, // Env var value 9280b57cec5SDimitry Andric __kmp_sys_min_stksize, // Min value 9290b57cec5SDimitry Andric KMP_MAX_STKSIZE, // Max value 9300b57cec5SDimitry Andric &__kmp_env_stksize, // 9310b57cec5SDimitry Andric &__kmp_stksize, // Var to initialize 9320b57cec5SDimitry Andric stacksize->factor); 9330b57cec5SDimitry Andric 9340b57cec5SDimitry Andric } // __kmp_stg_parse_stacksize 9350b57cec5SDimitry Andric 9360b57cec5SDimitry Andric // This function is called for printing both KMP_STACKSIZE (factor is 1) and 9370b57cec5SDimitry Andric // OMP_STACKSIZE (factor is 1024). Currently it is not possible to print 9380b57cec5SDimitry Andric // OMP_STACKSIZE value in bytes. We can consider adding this possibility by a 9390b57cec5SDimitry Andric // customer request in future. 9400b57cec5SDimitry Andric static void __kmp_stg_print_stacksize(kmp_str_buf_t *buffer, char const *name, 9410b57cec5SDimitry Andric void *data) { 9420b57cec5SDimitry Andric kmp_stg_ss_data_t *stacksize = (kmp_stg_ss_data_t *)data; 9430b57cec5SDimitry Andric if (__kmp_env_format) { 9440b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 9450b57cec5SDimitry Andric __kmp_str_buf_print_size(buffer, (__kmp_stksize % 1024) 9460b57cec5SDimitry Andric ? __kmp_stksize / stacksize->factor 9470b57cec5SDimitry Andric : __kmp_stksize); 9480b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "'\n"); 9490b57cec5SDimitry Andric } else { 9500b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=", name); 9510b57cec5SDimitry Andric __kmp_str_buf_print_size(buffer, (__kmp_stksize % 1024) 9520b57cec5SDimitry Andric ? __kmp_stksize / stacksize->factor 9530b57cec5SDimitry Andric : __kmp_stksize); 9540b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "\n"); 9550b57cec5SDimitry Andric } 9560b57cec5SDimitry Andric } // __kmp_stg_print_stacksize 9570b57cec5SDimitry Andric 9580b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 9590b57cec5SDimitry Andric // KMP_VERSION 9600b57cec5SDimitry Andric 9610b57cec5SDimitry Andric static void __kmp_stg_parse_version(char const *name, char const *value, 9620b57cec5SDimitry Andric void *data) { 9630b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_version); 9640b57cec5SDimitry Andric } // __kmp_stg_parse_version 9650b57cec5SDimitry Andric 9660b57cec5SDimitry Andric static void __kmp_stg_print_version(kmp_str_buf_t *buffer, char const *name, 9670b57cec5SDimitry Andric void *data) { 9680b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_version); 9690b57cec5SDimitry Andric } // __kmp_stg_print_version 9700b57cec5SDimitry Andric 9710b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 9720b57cec5SDimitry Andric // KMP_WARNINGS 9730b57cec5SDimitry Andric 9740b57cec5SDimitry Andric static void __kmp_stg_parse_warnings(char const *name, char const *value, 9750b57cec5SDimitry Andric void *data) { 9760b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_generate_warnings); 9770b57cec5SDimitry Andric if (__kmp_generate_warnings != kmp_warnings_off) { 9780b57cec5SDimitry Andric // AC: only 0/1 values documented, so reset to explicit to distinguish from 9790b57cec5SDimitry Andric // default setting 9800b57cec5SDimitry Andric __kmp_generate_warnings = kmp_warnings_explicit; 9810b57cec5SDimitry Andric } 9820b57cec5SDimitry Andric } // __kmp_stg_parse_warnings 9830b57cec5SDimitry Andric 9840b57cec5SDimitry Andric static void __kmp_stg_print_warnings(kmp_str_buf_t *buffer, char const *name, 9850b57cec5SDimitry Andric void *data) { 9860b57cec5SDimitry Andric // AC: TODO: change to print_int? (needs documentation change) 9870b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_generate_warnings); 9880b57cec5SDimitry Andric } // __kmp_stg_print_warnings 9890b57cec5SDimitry Andric 9900b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 9910b57cec5SDimitry Andric // OMP_NESTED, OMP_NUM_THREADS 9920b57cec5SDimitry Andric 9930b57cec5SDimitry Andric static void __kmp_stg_parse_nested(char const *name, char const *value, 9940b57cec5SDimitry Andric void *data) { 9950b57cec5SDimitry Andric int nested; 9960b57cec5SDimitry Andric KMP_INFORM(EnvVarDeprecated, name, "OMP_MAX_ACTIVE_LEVELS"); 9970b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &nested); 9980b57cec5SDimitry Andric if (nested) { 9990b57cec5SDimitry Andric if (!__kmp_dflt_max_active_levels_set) 10000b57cec5SDimitry Andric __kmp_dflt_max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT; 10010b57cec5SDimitry Andric } else { // nesting explicitly turned off 10020b57cec5SDimitry Andric __kmp_dflt_max_active_levels = 1; 10030b57cec5SDimitry Andric __kmp_dflt_max_active_levels_set = true; 10040b57cec5SDimitry Andric } 10050b57cec5SDimitry Andric } // __kmp_stg_parse_nested 10060b57cec5SDimitry Andric 10070b57cec5SDimitry Andric static void __kmp_stg_print_nested(kmp_str_buf_t *buffer, char const *name, 10080b57cec5SDimitry Andric void *data) { 10090b57cec5SDimitry Andric if (__kmp_env_format) { 10100b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 10110b57cec5SDimitry Andric } else { 10120b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 10130b57cec5SDimitry Andric } 10140b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": deprecated; max-active-levels-var=%d\n", 10150b57cec5SDimitry Andric __kmp_dflt_max_active_levels); 10160b57cec5SDimitry Andric } // __kmp_stg_print_nested 10170b57cec5SDimitry Andric 10180b57cec5SDimitry Andric static void __kmp_parse_nested_num_threads(const char *var, const char *env, 10190b57cec5SDimitry Andric kmp_nested_nthreads_t *nth_array) { 10200b57cec5SDimitry Andric const char *next = env; 10210b57cec5SDimitry Andric const char *scan = next; 10220b57cec5SDimitry Andric 10230b57cec5SDimitry Andric int total = 0; // Count elements that were set. It'll be used as an array size 10240b57cec5SDimitry Andric int prev_comma = FALSE; // For correct processing sequential commas 10250b57cec5SDimitry Andric 10260b57cec5SDimitry Andric // Count the number of values in the env. var string 10270b57cec5SDimitry Andric for (;;) { 10280b57cec5SDimitry Andric SKIP_WS(next); 10290b57cec5SDimitry Andric 10300b57cec5SDimitry Andric if (*next == '\0') { 10310b57cec5SDimitry Andric break; 10320b57cec5SDimitry Andric } 10330b57cec5SDimitry Andric // Next character is not an integer or not a comma => end of list 10340b57cec5SDimitry Andric if (((*next < '0') || (*next > '9')) && (*next != ',')) { 10350b57cec5SDimitry Andric KMP_WARNING(NthSyntaxError, var, env); 10360b57cec5SDimitry Andric return; 10370b57cec5SDimitry Andric } 10380b57cec5SDimitry Andric // The next character is ',' 10390b57cec5SDimitry Andric if (*next == ',') { 1040480093f4SDimitry Andric // ',' is the first character 10410b57cec5SDimitry Andric if (total == 0 || prev_comma) { 10420b57cec5SDimitry Andric total++; 10430b57cec5SDimitry Andric } 10440b57cec5SDimitry Andric prev_comma = TRUE; 10450b57cec5SDimitry Andric next++; // skip ',' 10460b57cec5SDimitry Andric SKIP_WS(next); 10470b57cec5SDimitry Andric } 10480b57cec5SDimitry Andric // Next character is a digit 10490b57cec5SDimitry Andric if (*next >= '0' && *next <= '9') { 10500b57cec5SDimitry Andric prev_comma = FALSE; 10510b57cec5SDimitry Andric SKIP_DIGITS(next); 10520b57cec5SDimitry Andric total++; 10530b57cec5SDimitry Andric const char *tmp = next; 10540b57cec5SDimitry Andric SKIP_WS(tmp); 10550b57cec5SDimitry Andric if ((*next == ' ' || *next == '\t') && (*tmp >= '0' && *tmp <= '9')) { 10560b57cec5SDimitry Andric KMP_WARNING(NthSpacesNotAllowed, var, env); 10570b57cec5SDimitry Andric return; 10580b57cec5SDimitry Andric } 10590b57cec5SDimitry Andric } 10600b57cec5SDimitry Andric } 10610b57cec5SDimitry Andric if (!__kmp_dflt_max_active_levels_set && total > 1) 10620b57cec5SDimitry Andric __kmp_dflt_max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT; 10630b57cec5SDimitry Andric KMP_DEBUG_ASSERT(total > 0); 10640b57cec5SDimitry Andric if (total <= 0) { 10650b57cec5SDimitry Andric KMP_WARNING(NthSyntaxError, var, env); 10660b57cec5SDimitry Andric return; 10670b57cec5SDimitry Andric } 10680b57cec5SDimitry Andric 10690b57cec5SDimitry Andric // Check if the nested nthreads array exists 10700b57cec5SDimitry Andric if (!nth_array->nth) { 10710b57cec5SDimitry Andric // Allocate an array of double size 10720b57cec5SDimitry Andric nth_array->nth = (int *)KMP_INTERNAL_MALLOC(sizeof(int) * total * 2); 10730b57cec5SDimitry Andric if (nth_array->nth == NULL) { 10740b57cec5SDimitry Andric KMP_FATAL(MemoryAllocFailed); 10750b57cec5SDimitry Andric } 10760b57cec5SDimitry Andric nth_array->size = total * 2; 10770b57cec5SDimitry Andric } else { 10780b57cec5SDimitry Andric if (nth_array->size < total) { 10790b57cec5SDimitry Andric // Increase the array size 10800b57cec5SDimitry Andric do { 10810b57cec5SDimitry Andric nth_array->size *= 2; 10820b57cec5SDimitry Andric } while (nth_array->size < total); 10830b57cec5SDimitry Andric 10840b57cec5SDimitry Andric nth_array->nth = (int *)KMP_INTERNAL_REALLOC( 10850b57cec5SDimitry Andric nth_array->nth, sizeof(int) * nth_array->size); 10860b57cec5SDimitry Andric if (nth_array->nth == NULL) { 10870b57cec5SDimitry Andric KMP_FATAL(MemoryAllocFailed); 10880b57cec5SDimitry Andric } 10890b57cec5SDimitry Andric } 10900b57cec5SDimitry Andric } 10910b57cec5SDimitry Andric nth_array->used = total; 10920b57cec5SDimitry Andric int i = 0; 10930b57cec5SDimitry Andric 10940b57cec5SDimitry Andric prev_comma = FALSE; 10950b57cec5SDimitry Andric total = 0; 10960b57cec5SDimitry Andric // Save values in the array 10970b57cec5SDimitry Andric for (;;) { 10980b57cec5SDimitry Andric SKIP_WS(scan); 10990b57cec5SDimitry Andric if (*scan == '\0') { 11000b57cec5SDimitry Andric break; 11010b57cec5SDimitry Andric } 11020b57cec5SDimitry Andric // The next character is ',' 11030b57cec5SDimitry Andric if (*scan == ',') { 11040b57cec5SDimitry Andric // ',' in the beginning of the list 11050b57cec5SDimitry Andric if (total == 0) { 11060b57cec5SDimitry Andric // The value is supposed to be equal to __kmp_avail_proc but it is 11070b57cec5SDimitry Andric // unknown at the moment. 11080b57cec5SDimitry Andric // So let's put a placeholder (#threads = 0) to correct it later. 11090b57cec5SDimitry Andric nth_array->nth[i++] = 0; 11100b57cec5SDimitry Andric total++; 11110b57cec5SDimitry Andric } else if (prev_comma) { 11120b57cec5SDimitry Andric // Num threads is inherited from the previous level 11130b57cec5SDimitry Andric nth_array->nth[i] = nth_array->nth[i - 1]; 11140b57cec5SDimitry Andric i++; 11150b57cec5SDimitry Andric total++; 11160b57cec5SDimitry Andric } 11170b57cec5SDimitry Andric prev_comma = TRUE; 11180b57cec5SDimitry Andric scan++; // skip ',' 11190b57cec5SDimitry Andric SKIP_WS(scan); 11200b57cec5SDimitry Andric } 11210b57cec5SDimitry Andric // Next character is a digit 11220b57cec5SDimitry Andric if (*scan >= '0' && *scan <= '9') { 11230b57cec5SDimitry Andric int num; 11240b57cec5SDimitry Andric const char *buf = scan; 11250b57cec5SDimitry Andric char const *msg = NULL; 11260b57cec5SDimitry Andric prev_comma = FALSE; 11270b57cec5SDimitry Andric SKIP_DIGITS(scan); 11280b57cec5SDimitry Andric total++; 11290b57cec5SDimitry Andric 11300b57cec5SDimitry Andric num = __kmp_str_to_int(buf, *scan); 11310b57cec5SDimitry Andric if (num < KMP_MIN_NTH) { 11320b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooSmall); 11330b57cec5SDimitry Andric num = KMP_MIN_NTH; 11340b57cec5SDimitry Andric } else if (num > __kmp_sys_max_nth) { 11350b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooLarge); 11360b57cec5SDimitry Andric num = __kmp_sys_max_nth; 11370b57cec5SDimitry Andric } 11380b57cec5SDimitry Andric if (msg != NULL) { 11390b57cec5SDimitry Andric // Message is not empty. Print warning. 11400b57cec5SDimitry Andric KMP_WARNING(ParseSizeIntWarn, var, env, msg); 11410b57cec5SDimitry Andric KMP_INFORM(Using_int_Value, var, num); 11420b57cec5SDimitry Andric } 11430b57cec5SDimitry Andric nth_array->nth[i++] = num; 11440b57cec5SDimitry Andric } 11450b57cec5SDimitry Andric } 11460b57cec5SDimitry Andric } 11470b57cec5SDimitry Andric 11480b57cec5SDimitry Andric static void __kmp_stg_parse_num_threads(char const *name, char const *value, 11490b57cec5SDimitry Andric void *data) { 11500b57cec5SDimitry Andric // TODO: Remove this option. OMP_NUM_THREADS is a list of positive integers! 11510b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("all", value, 0)) { 11520b57cec5SDimitry Andric // The array of 1 element 11530b57cec5SDimitry Andric __kmp_nested_nth.nth = (int *)KMP_INTERNAL_MALLOC(sizeof(int)); 11540b57cec5SDimitry Andric __kmp_nested_nth.size = __kmp_nested_nth.used = 1; 11550b57cec5SDimitry Andric __kmp_nested_nth.nth[0] = __kmp_dflt_team_nth = __kmp_dflt_team_nth_ub = 11560b57cec5SDimitry Andric __kmp_xproc; 11570b57cec5SDimitry Andric } else { 11580b57cec5SDimitry Andric __kmp_parse_nested_num_threads(name, value, &__kmp_nested_nth); 11590b57cec5SDimitry Andric if (__kmp_nested_nth.nth) { 11600b57cec5SDimitry Andric __kmp_dflt_team_nth = __kmp_nested_nth.nth[0]; 11610b57cec5SDimitry Andric if (__kmp_dflt_team_nth_ub < __kmp_dflt_team_nth) { 11620b57cec5SDimitry Andric __kmp_dflt_team_nth_ub = __kmp_dflt_team_nth; 11630b57cec5SDimitry Andric } 11640b57cec5SDimitry Andric } 11650b57cec5SDimitry Andric } 11660b57cec5SDimitry Andric K_DIAG(1, ("__kmp_dflt_team_nth == %d\n", __kmp_dflt_team_nth)); 11670b57cec5SDimitry Andric } // __kmp_stg_parse_num_threads 11680b57cec5SDimitry Andric 1169*e8d8bef9SDimitry Andric static void __kmp_stg_parse_num_hidden_helper_threads(char const *name, 1170*e8d8bef9SDimitry Andric char const *value, 1171*e8d8bef9SDimitry Andric void *data) { 1172*e8d8bef9SDimitry Andric __kmp_stg_parse_int(name, value, 0, 16, &__kmp_hidden_helper_threads_num); 1173*e8d8bef9SDimitry Andric // If the number of hidden helper threads is zero, we disable hidden helper 1174*e8d8bef9SDimitry Andric // task 1175*e8d8bef9SDimitry Andric if (__kmp_hidden_helper_threads_num == 0) { 1176*e8d8bef9SDimitry Andric __kmp_enable_hidden_helper = FALSE; 1177*e8d8bef9SDimitry Andric } 1178*e8d8bef9SDimitry Andric } // __kmp_stg_parse_num_hidden_helper_threads 1179*e8d8bef9SDimitry Andric 1180*e8d8bef9SDimitry Andric static void __kmp_stg_print_num_hidden_helper_threads(kmp_str_buf_t *buffer, 1181*e8d8bef9SDimitry Andric char const *name, 1182*e8d8bef9SDimitry Andric void *data) { 1183*e8d8bef9SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_hidden_helper_threads_num); 1184*e8d8bef9SDimitry Andric } // __kmp_stg_print_num_hidden_helper_threads 1185*e8d8bef9SDimitry Andric 1186*e8d8bef9SDimitry Andric static void __kmp_stg_parse_use_hidden_helper(char const *name, 1187*e8d8bef9SDimitry Andric char const *value, void *data) { 1188*e8d8bef9SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_enable_hidden_helper); 1189*e8d8bef9SDimitry Andric #if !KMP_OS_LINUX 1190*e8d8bef9SDimitry Andric __kmp_enable_hidden_helper = FALSE; 1191*e8d8bef9SDimitry Andric K_DIAG(1, 1192*e8d8bef9SDimitry Andric ("__kmp_stg_parse_use_hidden_helper: Disable hidden helper task on " 1193*e8d8bef9SDimitry Andric "non-Linux platform although it is enabled by user explicitly.\n")); 1194*e8d8bef9SDimitry Andric #endif 1195*e8d8bef9SDimitry Andric } // __kmp_stg_parse_use_hidden_helper 1196*e8d8bef9SDimitry Andric 1197*e8d8bef9SDimitry Andric static void __kmp_stg_print_use_hidden_helper(kmp_str_buf_t *buffer, 1198*e8d8bef9SDimitry Andric char const *name, void *data) { 1199*e8d8bef9SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_enable_hidden_helper); 1200*e8d8bef9SDimitry Andric } // __kmp_stg_print_use_hidden_helper 1201*e8d8bef9SDimitry Andric 12020b57cec5SDimitry Andric static void __kmp_stg_print_num_threads(kmp_str_buf_t *buffer, char const *name, 12030b57cec5SDimitry Andric void *data) { 12040b57cec5SDimitry Andric if (__kmp_env_format) { 12050b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 12060b57cec5SDimitry Andric } else { 12070b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 12080b57cec5SDimitry Andric } 12090b57cec5SDimitry Andric if (__kmp_nested_nth.used) { 12100b57cec5SDimitry Andric kmp_str_buf_t buf; 12110b57cec5SDimitry Andric __kmp_str_buf_init(&buf); 12120b57cec5SDimitry Andric for (int i = 0; i < __kmp_nested_nth.used; i++) { 12130b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "%d", __kmp_nested_nth.nth[i]); 12140b57cec5SDimitry Andric if (i < __kmp_nested_nth.used - 1) { 12150b57cec5SDimitry Andric __kmp_str_buf_print(&buf, ","); 12160b57cec5SDimitry Andric } 12170b57cec5SDimitry Andric } 12180b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='%s'\n", buf.str); 12190b57cec5SDimitry Andric __kmp_str_buf_free(&buf); 12200b57cec5SDimitry Andric } else { 12210b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 12220b57cec5SDimitry Andric } 12230b57cec5SDimitry Andric } // __kmp_stg_print_num_threads 12240b57cec5SDimitry Andric 12250b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 12260b57cec5SDimitry Andric // OpenMP 3.0: KMP_TASKING, OMP_MAX_ACTIVE_LEVELS, 12270b57cec5SDimitry Andric 12280b57cec5SDimitry Andric static void __kmp_stg_parse_tasking(char const *name, char const *value, 12290b57cec5SDimitry Andric void *data) { 12300b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, (int)tskm_max, 12310b57cec5SDimitry Andric (int *)&__kmp_tasking_mode); 12320b57cec5SDimitry Andric } // __kmp_stg_parse_tasking 12330b57cec5SDimitry Andric 12340b57cec5SDimitry Andric static void __kmp_stg_print_tasking(kmp_str_buf_t *buffer, char const *name, 12350b57cec5SDimitry Andric void *data) { 12360b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_tasking_mode); 12370b57cec5SDimitry Andric } // __kmp_stg_print_tasking 12380b57cec5SDimitry Andric 12390b57cec5SDimitry Andric static void __kmp_stg_parse_task_stealing(char const *name, char const *value, 12400b57cec5SDimitry Andric void *data) { 12410b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, 1, 12420b57cec5SDimitry Andric (int *)&__kmp_task_stealing_constraint); 12430b57cec5SDimitry Andric } // __kmp_stg_parse_task_stealing 12440b57cec5SDimitry Andric 12450b57cec5SDimitry Andric static void __kmp_stg_print_task_stealing(kmp_str_buf_t *buffer, 12460b57cec5SDimitry Andric char const *name, void *data) { 12470b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_task_stealing_constraint); 12480b57cec5SDimitry Andric } // __kmp_stg_print_task_stealing 12490b57cec5SDimitry Andric 12500b57cec5SDimitry Andric static void __kmp_stg_parse_max_active_levels(char const *name, 12510b57cec5SDimitry Andric char const *value, void *data) { 12520b57cec5SDimitry Andric kmp_uint64 tmp_dflt = 0; 12530b57cec5SDimitry Andric char const *msg = NULL; 12540b57cec5SDimitry Andric if (!__kmp_dflt_max_active_levels_set) { 12550b57cec5SDimitry Andric // Don't overwrite __kmp_dflt_max_active_levels if we get an invalid setting 12560b57cec5SDimitry Andric __kmp_str_to_uint(value, &tmp_dflt, &msg); 12570b57cec5SDimitry Andric if (msg != NULL) { // invalid setting; print warning and ignore 12580b57cec5SDimitry Andric KMP_WARNING(ParseSizeIntWarn, name, value, msg); 12590b57cec5SDimitry Andric } else if (tmp_dflt > KMP_MAX_ACTIVE_LEVELS_LIMIT) { 12600b57cec5SDimitry Andric // invalid setting; print warning and ignore 12610b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooLarge); 12620b57cec5SDimitry Andric KMP_WARNING(ParseSizeIntWarn, name, value, msg); 12630b57cec5SDimitry Andric } else { // valid setting 1264*e8d8bef9SDimitry Andric __kmp_type_convert(tmp_dflt, &(__kmp_dflt_max_active_levels)); 12650b57cec5SDimitry Andric __kmp_dflt_max_active_levels_set = true; 12660b57cec5SDimitry Andric } 12670b57cec5SDimitry Andric } 12680b57cec5SDimitry Andric } // __kmp_stg_parse_max_active_levels 12690b57cec5SDimitry Andric 12700b57cec5SDimitry Andric static void __kmp_stg_print_max_active_levels(kmp_str_buf_t *buffer, 12710b57cec5SDimitry Andric char const *name, void *data) { 12720b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_dflt_max_active_levels); 12730b57cec5SDimitry Andric } // __kmp_stg_print_max_active_levels 12740b57cec5SDimitry Andric 12750b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 12760b57cec5SDimitry Andric // OpenMP 4.0: OMP_DEFAULT_DEVICE 12770b57cec5SDimitry Andric static void __kmp_stg_parse_default_device(char const *name, char const *value, 12780b57cec5SDimitry Andric void *data) { 12790b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, KMP_MAX_DEFAULT_DEVICE_LIMIT, 12800b57cec5SDimitry Andric &__kmp_default_device); 12810b57cec5SDimitry Andric } // __kmp_stg_parse_default_device 12820b57cec5SDimitry Andric 12830b57cec5SDimitry Andric static void __kmp_stg_print_default_device(kmp_str_buf_t *buffer, 12840b57cec5SDimitry Andric char const *name, void *data) { 12850b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_default_device); 12860b57cec5SDimitry Andric } // __kmp_stg_print_default_device 12870b57cec5SDimitry Andric 12880b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 12890b57cec5SDimitry Andric // OpenMP 5.0: OMP_TARGET_OFFLOAD 12900b57cec5SDimitry Andric static void __kmp_stg_parse_target_offload(char const *name, char const *value, 12910b57cec5SDimitry Andric void *data) { 12920b57cec5SDimitry Andric const char *next = value; 12930b57cec5SDimitry Andric const char *scan = next; 12940b57cec5SDimitry Andric 12950b57cec5SDimitry Andric __kmp_target_offload = tgt_default; 12960b57cec5SDimitry Andric SKIP_WS(next); 12970b57cec5SDimitry Andric if (*next == '\0') 12980b57cec5SDimitry Andric return; 12990b57cec5SDimitry Andric scan = next; 13000b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("mandatory", scan, 0)) { 13010b57cec5SDimitry Andric __kmp_target_offload = tgt_mandatory; 13020b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("disabled", scan, 0)) { 13030b57cec5SDimitry Andric __kmp_target_offload = tgt_disabled; 13040b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("default", scan, 0)) { 13050b57cec5SDimitry Andric __kmp_target_offload = tgt_default; 13060b57cec5SDimitry Andric } else { 13070b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, name, "DEFAULT"); 13080b57cec5SDimitry Andric } 13090b57cec5SDimitry Andric 13100b57cec5SDimitry Andric } // __kmp_stg_parse_target_offload 13110b57cec5SDimitry Andric 13120b57cec5SDimitry Andric static void __kmp_stg_print_target_offload(kmp_str_buf_t *buffer, 13130b57cec5SDimitry Andric char const *name, void *data) { 13140b57cec5SDimitry Andric const char *value = NULL; 13150b57cec5SDimitry Andric if (__kmp_target_offload == tgt_default) 13160b57cec5SDimitry Andric value = "DEFAULT"; 13170b57cec5SDimitry Andric else if (__kmp_target_offload == tgt_mandatory) 13180b57cec5SDimitry Andric value = "MANDATORY"; 13190b57cec5SDimitry Andric else if (__kmp_target_offload == tgt_disabled) 13200b57cec5SDimitry Andric value = "DISABLED"; 13210b57cec5SDimitry Andric KMP_DEBUG_ASSERT(value); 13220b57cec5SDimitry Andric if (__kmp_env_format) { 13230b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 13240b57cec5SDimitry Andric } else { 13250b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 13260b57cec5SDimitry Andric } 13270b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "=%s\n", value); 13280b57cec5SDimitry Andric } // __kmp_stg_print_target_offload 13290b57cec5SDimitry Andric 13300b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 13310b57cec5SDimitry Andric // OpenMP 4.5: OMP_MAX_TASK_PRIORITY 13320b57cec5SDimitry Andric static void __kmp_stg_parse_max_task_priority(char const *name, 13330b57cec5SDimitry Andric char const *value, void *data) { 13340b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, KMP_MAX_TASK_PRIORITY_LIMIT, 13350b57cec5SDimitry Andric &__kmp_max_task_priority); 13360b57cec5SDimitry Andric } // __kmp_stg_parse_max_task_priority 13370b57cec5SDimitry Andric 13380b57cec5SDimitry Andric static void __kmp_stg_print_max_task_priority(kmp_str_buf_t *buffer, 13390b57cec5SDimitry Andric char const *name, void *data) { 13400b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_max_task_priority); 13410b57cec5SDimitry Andric } // __kmp_stg_print_max_task_priority 13420b57cec5SDimitry Andric 13430b57cec5SDimitry Andric // KMP_TASKLOOP_MIN_TASKS 13445ffd83dbSDimitry Andric // taskloop threshold to switch from recursive to linear tasks creation 13450b57cec5SDimitry Andric static void __kmp_stg_parse_taskloop_min_tasks(char const *name, 13460b57cec5SDimitry Andric char const *value, void *data) { 13470b57cec5SDimitry Andric int tmp; 13480b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, INT_MAX, &tmp); 13490b57cec5SDimitry Andric __kmp_taskloop_min_tasks = tmp; 13500b57cec5SDimitry Andric } // __kmp_stg_parse_taskloop_min_tasks 13510b57cec5SDimitry Andric 13520b57cec5SDimitry Andric static void __kmp_stg_print_taskloop_min_tasks(kmp_str_buf_t *buffer, 13530b57cec5SDimitry Andric char const *name, void *data) { 1354*e8d8bef9SDimitry Andric __kmp_stg_print_uint64(buffer, name, __kmp_taskloop_min_tasks); 13550b57cec5SDimitry Andric } // __kmp_stg_print_taskloop_min_tasks 13560b57cec5SDimitry Andric 13570b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 13580b57cec5SDimitry Andric // KMP_DISP_NUM_BUFFERS 13590b57cec5SDimitry Andric static void __kmp_stg_parse_disp_buffers(char const *name, char const *value, 13600b57cec5SDimitry Andric void *data) { 13610b57cec5SDimitry Andric if (TCR_4(__kmp_init_serial)) { 13620b57cec5SDimitry Andric KMP_WARNING(EnvSerialWarn, name); 13630b57cec5SDimitry Andric return; 13640b57cec5SDimitry Andric } // read value before serial initialization only 13650b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 1, KMP_MAX_NTH, &__kmp_dispatch_num_buffers); 13660b57cec5SDimitry Andric } // __kmp_stg_parse_disp_buffers 13670b57cec5SDimitry Andric 13680b57cec5SDimitry Andric static void __kmp_stg_print_disp_buffers(kmp_str_buf_t *buffer, 13690b57cec5SDimitry Andric char const *name, void *data) { 13700b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_dispatch_num_buffers); 13710b57cec5SDimitry Andric } // __kmp_stg_print_disp_buffers 13720b57cec5SDimitry Andric 13730b57cec5SDimitry Andric #if KMP_NESTED_HOT_TEAMS 13740b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 13750b57cec5SDimitry Andric // KMP_HOT_TEAMS_MAX_LEVEL, KMP_HOT_TEAMS_MODE 13760b57cec5SDimitry Andric 13770b57cec5SDimitry Andric static void __kmp_stg_parse_hot_teams_level(char const *name, char const *value, 13780b57cec5SDimitry Andric void *data) { 13790b57cec5SDimitry Andric if (TCR_4(__kmp_init_parallel)) { 13800b57cec5SDimitry Andric KMP_WARNING(EnvParallelWarn, name); 13810b57cec5SDimitry Andric return; 13820b57cec5SDimitry Andric } // read value before first parallel only 13830b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, KMP_MAX_ACTIVE_LEVELS_LIMIT, 13840b57cec5SDimitry Andric &__kmp_hot_teams_max_level); 13850b57cec5SDimitry Andric } // __kmp_stg_parse_hot_teams_level 13860b57cec5SDimitry Andric 13870b57cec5SDimitry Andric static void __kmp_stg_print_hot_teams_level(kmp_str_buf_t *buffer, 13880b57cec5SDimitry Andric char const *name, void *data) { 13890b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_hot_teams_max_level); 13900b57cec5SDimitry Andric } // __kmp_stg_print_hot_teams_level 13910b57cec5SDimitry Andric 13920b57cec5SDimitry Andric static void __kmp_stg_parse_hot_teams_mode(char const *name, char const *value, 13930b57cec5SDimitry Andric void *data) { 13940b57cec5SDimitry Andric if (TCR_4(__kmp_init_parallel)) { 13950b57cec5SDimitry Andric KMP_WARNING(EnvParallelWarn, name); 13960b57cec5SDimitry Andric return; 13970b57cec5SDimitry Andric } // read value before first parallel only 13980b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, KMP_MAX_ACTIVE_LEVELS_LIMIT, 13990b57cec5SDimitry Andric &__kmp_hot_teams_mode); 14000b57cec5SDimitry Andric } // __kmp_stg_parse_hot_teams_mode 14010b57cec5SDimitry Andric 14020b57cec5SDimitry Andric static void __kmp_stg_print_hot_teams_mode(kmp_str_buf_t *buffer, 14030b57cec5SDimitry Andric char const *name, void *data) { 14040b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_hot_teams_mode); 14050b57cec5SDimitry Andric } // __kmp_stg_print_hot_teams_mode 14060b57cec5SDimitry Andric 14070b57cec5SDimitry Andric #endif // KMP_NESTED_HOT_TEAMS 14080b57cec5SDimitry Andric 14090b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 14100b57cec5SDimitry Andric // KMP_HANDLE_SIGNALS 14110b57cec5SDimitry Andric 14120b57cec5SDimitry Andric #if KMP_HANDLE_SIGNALS 14130b57cec5SDimitry Andric 14140b57cec5SDimitry Andric static void __kmp_stg_parse_handle_signals(char const *name, char const *value, 14150b57cec5SDimitry Andric void *data) { 14160b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_handle_signals); 14170b57cec5SDimitry Andric } // __kmp_stg_parse_handle_signals 14180b57cec5SDimitry Andric 14190b57cec5SDimitry Andric static void __kmp_stg_print_handle_signals(kmp_str_buf_t *buffer, 14200b57cec5SDimitry Andric char const *name, void *data) { 14210b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_handle_signals); 14220b57cec5SDimitry Andric } // __kmp_stg_print_handle_signals 14230b57cec5SDimitry Andric 14240b57cec5SDimitry Andric #endif // KMP_HANDLE_SIGNALS 14250b57cec5SDimitry Andric 14260b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 14270b57cec5SDimitry Andric // KMP_X_DEBUG, KMP_DEBUG, KMP_DEBUG_BUF_*, KMP_DIAG 14280b57cec5SDimitry Andric 14290b57cec5SDimitry Andric #ifdef KMP_DEBUG 14300b57cec5SDimitry Andric 14310b57cec5SDimitry Andric #define KMP_STG_X_DEBUG(x) \ 14320b57cec5SDimitry Andric static void __kmp_stg_parse_##x##_debug(char const *name, char const *value, \ 14330b57cec5SDimitry Andric void *data) { \ 14340b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, INT_MAX, &kmp_##x##_debug); \ 14350b57cec5SDimitry Andric } /* __kmp_stg_parse_x_debug */ \ 14360b57cec5SDimitry Andric static void __kmp_stg_print_##x##_debug(kmp_str_buf_t *buffer, \ 14370b57cec5SDimitry Andric char const *name, void *data) { \ 14380b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, kmp_##x##_debug); \ 14390b57cec5SDimitry Andric } /* __kmp_stg_print_x_debug */ 14400b57cec5SDimitry Andric 14410b57cec5SDimitry Andric KMP_STG_X_DEBUG(a) 14420b57cec5SDimitry Andric KMP_STG_X_DEBUG(b) 14430b57cec5SDimitry Andric KMP_STG_X_DEBUG(c) 14440b57cec5SDimitry Andric KMP_STG_X_DEBUG(d) 14450b57cec5SDimitry Andric KMP_STG_X_DEBUG(e) 14460b57cec5SDimitry Andric KMP_STG_X_DEBUG(f) 14470b57cec5SDimitry Andric 14480b57cec5SDimitry Andric #undef KMP_STG_X_DEBUG 14490b57cec5SDimitry Andric 14500b57cec5SDimitry Andric static void __kmp_stg_parse_debug(char const *name, char const *value, 14510b57cec5SDimitry Andric void *data) { 14520b57cec5SDimitry Andric int debug = 0; 14530b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, INT_MAX, &debug); 14540b57cec5SDimitry Andric if (kmp_a_debug < debug) { 14550b57cec5SDimitry Andric kmp_a_debug = debug; 14560b57cec5SDimitry Andric } 14570b57cec5SDimitry Andric if (kmp_b_debug < debug) { 14580b57cec5SDimitry Andric kmp_b_debug = debug; 14590b57cec5SDimitry Andric } 14600b57cec5SDimitry Andric if (kmp_c_debug < debug) { 14610b57cec5SDimitry Andric kmp_c_debug = debug; 14620b57cec5SDimitry Andric } 14630b57cec5SDimitry Andric if (kmp_d_debug < debug) { 14640b57cec5SDimitry Andric kmp_d_debug = debug; 14650b57cec5SDimitry Andric } 14660b57cec5SDimitry Andric if (kmp_e_debug < debug) { 14670b57cec5SDimitry Andric kmp_e_debug = debug; 14680b57cec5SDimitry Andric } 14690b57cec5SDimitry Andric if (kmp_f_debug < debug) { 14700b57cec5SDimitry Andric kmp_f_debug = debug; 14710b57cec5SDimitry Andric } 14720b57cec5SDimitry Andric } // __kmp_stg_parse_debug 14730b57cec5SDimitry Andric 14740b57cec5SDimitry Andric static void __kmp_stg_parse_debug_buf(char const *name, char const *value, 14750b57cec5SDimitry Andric void *data) { 14760b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_debug_buf); 14770b57cec5SDimitry Andric // !!! TODO: Move buffer initialization of of this file! It may works 14780b57cec5SDimitry Andric // incorrectly if KMP_DEBUG_BUF is parsed before KMP_DEBUG_BUF_LINES or 14790b57cec5SDimitry Andric // KMP_DEBUG_BUF_CHARS. 14800b57cec5SDimitry Andric if (__kmp_debug_buf) { 14810b57cec5SDimitry Andric int i; 14820b57cec5SDimitry Andric int elements = __kmp_debug_buf_lines * __kmp_debug_buf_chars; 14830b57cec5SDimitry Andric 14840b57cec5SDimitry Andric /* allocate and initialize all entries in debug buffer to empty */ 14850b57cec5SDimitry Andric __kmp_debug_buffer = (char *)__kmp_page_allocate(elements * sizeof(char)); 14860b57cec5SDimitry Andric for (i = 0; i < elements; i += __kmp_debug_buf_chars) 14870b57cec5SDimitry Andric __kmp_debug_buffer[i] = '\0'; 14880b57cec5SDimitry Andric 14890b57cec5SDimitry Andric __kmp_debug_count = 0; 14900b57cec5SDimitry Andric } 14910b57cec5SDimitry Andric K_DIAG(1, ("__kmp_debug_buf = %d\n", __kmp_debug_buf)); 14920b57cec5SDimitry Andric } // __kmp_stg_parse_debug_buf 14930b57cec5SDimitry Andric 14940b57cec5SDimitry Andric static void __kmp_stg_print_debug_buf(kmp_str_buf_t *buffer, char const *name, 14950b57cec5SDimitry Andric void *data) { 14960b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_debug_buf); 14970b57cec5SDimitry Andric } // __kmp_stg_print_debug_buf 14980b57cec5SDimitry Andric 14990b57cec5SDimitry Andric static void __kmp_stg_parse_debug_buf_atomic(char const *name, 15000b57cec5SDimitry Andric char const *value, void *data) { 15010b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_debug_buf_atomic); 15020b57cec5SDimitry Andric } // __kmp_stg_parse_debug_buf_atomic 15030b57cec5SDimitry Andric 15040b57cec5SDimitry Andric static void __kmp_stg_print_debug_buf_atomic(kmp_str_buf_t *buffer, 15050b57cec5SDimitry Andric char const *name, void *data) { 15060b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_debug_buf_atomic); 15070b57cec5SDimitry Andric } // __kmp_stg_print_debug_buf_atomic 15080b57cec5SDimitry Andric 15090b57cec5SDimitry Andric static void __kmp_stg_parse_debug_buf_chars(char const *name, char const *value, 15100b57cec5SDimitry Andric void *data) { 15110b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, KMP_DEBUG_BUF_CHARS_MIN, INT_MAX, 15120b57cec5SDimitry Andric &__kmp_debug_buf_chars); 15130b57cec5SDimitry Andric } // __kmp_stg_debug_parse_buf_chars 15140b57cec5SDimitry Andric 15150b57cec5SDimitry Andric static void __kmp_stg_print_debug_buf_chars(kmp_str_buf_t *buffer, 15160b57cec5SDimitry Andric char const *name, void *data) { 15170b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_debug_buf_chars); 15180b57cec5SDimitry Andric } // __kmp_stg_print_debug_buf_chars 15190b57cec5SDimitry Andric 15200b57cec5SDimitry Andric static void __kmp_stg_parse_debug_buf_lines(char const *name, char const *value, 15210b57cec5SDimitry Andric void *data) { 15220b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, KMP_DEBUG_BUF_LINES_MIN, INT_MAX, 15230b57cec5SDimitry Andric &__kmp_debug_buf_lines); 15240b57cec5SDimitry Andric } // __kmp_stg_parse_debug_buf_lines 15250b57cec5SDimitry Andric 15260b57cec5SDimitry Andric static void __kmp_stg_print_debug_buf_lines(kmp_str_buf_t *buffer, 15270b57cec5SDimitry Andric char const *name, void *data) { 15280b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_debug_buf_lines); 15290b57cec5SDimitry Andric } // __kmp_stg_print_debug_buf_lines 15300b57cec5SDimitry Andric 15310b57cec5SDimitry Andric static void __kmp_stg_parse_diag(char const *name, char const *value, 15320b57cec5SDimitry Andric void *data) { 15330b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, INT_MAX, &kmp_diag); 15340b57cec5SDimitry Andric } // __kmp_stg_parse_diag 15350b57cec5SDimitry Andric 15360b57cec5SDimitry Andric static void __kmp_stg_print_diag(kmp_str_buf_t *buffer, char const *name, 15370b57cec5SDimitry Andric void *data) { 15380b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, kmp_diag); 15390b57cec5SDimitry Andric } // __kmp_stg_print_diag 15400b57cec5SDimitry Andric 15410b57cec5SDimitry Andric #endif // KMP_DEBUG 15420b57cec5SDimitry Andric 15430b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 15440b57cec5SDimitry Andric // KMP_ALIGN_ALLOC 15450b57cec5SDimitry Andric 15460b57cec5SDimitry Andric static void __kmp_stg_parse_align_alloc(char const *name, char const *value, 15470b57cec5SDimitry Andric void *data) { 15480b57cec5SDimitry Andric __kmp_stg_parse_size(name, value, CACHE_LINE, INT_MAX, NULL, 15490b57cec5SDimitry Andric &__kmp_align_alloc, 1); 15500b57cec5SDimitry Andric } // __kmp_stg_parse_align_alloc 15510b57cec5SDimitry Andric 15520b57cec5SDimitry Andric static void __kmp_stg_print_align_alloc(kmp_str_buf_t *buffer, char const *name, 15530b57cec5SDimitry Andric void *data) { 15540b57cec5SDimitry Andric __kmp_stg_print_size(buffer, name, __kmp_align_alloc); 15550b57cec5SDimitry Andric } // __kmp_stg_print_align_alloc 15560b57cec5SDimitry Andric 15570b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 15580b57cec5SDimitry Andric // KMP_PLAIN_BARRIER, KMP_FORKJOIN_BARRIER, KMP_REDUCTION_BARRIER 15590b57cec5SDimitry Andric 15600b57cec5SDimitry Andric // TODO: Remove __kmp_barrier_branch_bit_env_name varibale, remove loops from 15610b57cec5SDimitry Andric // parse and print functions, pass required info through data argument. 15620b57cec5SDimitry Andric 15630b57cec5SDimitry Andric static void __kmp_stg_parse_barrier_branch_bit(char const *name, 15640b57cec5SDimitry Andric char const *value, void *data) { 15650b57cec5SDimitry Andric const char *var; 15660b57cec5SDimitry Andric 15670b57cec5SDimitry Andric /* ---------- Barrier branch bit control ------------ */ 15680b57cec5SDimitry Andric for (int i = bs_plain_barrier; i < bs_last_barrier; i++) { 15690b57cec5SDimitry Andric var = __kmp_barrier_branch_bit_env_name[i]; 15700b57cec5SDimitry Andric if ((strcmp(var, name) == 0) && (value != 0)) { 15710b57cec5SDimitry Andric char *comma; 15720b57cec5SDimitry Andric 15730b57cec5SDimitry Andric comma = CCAST(char *, strchr(value, ',')); 15740b57cec5SDimitry Andric __kmp_barrier_gather_branch_bits[i] = 15750b57cec5SDimitry Andric (kmp_uint32)__kmp_str_to_int(value, ','); 15760b57cec5SDimitry Andric /* is there a specified release parameter? */ 15770b57cec5SDimitry Andric if (comma == NULL) { 15780b57cec5SDimitry Andric __kmp_barrier_release_branch_bits[i] = __kmp_barrier_release_bb_dflt; 15790b57cec5SDimitry Andric } else { 15800b57cec5SDimitry Andric __kmp_barrier_release_branch_bits[i] = 15810b57cec5SDimitry Andric (kmp_uint32)__kmp_str_to_int(comma + 1, 0); 15820b57cec5SDimitry Andric 15830b57cec5SDimitry Andric if (__kmp_barrier_release_branch_bits[i] > KMP_MAX_BRANCH_BITS) { 15840b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, 15850b57cec5SDimitry Andric KMP_MSG(BarrReleaseValueInvalid, name, comma + 1), 15860b57cec5SDimitry Andric __kmp_msg_null); 15870b57cec5SDimitry Andric __kmp_barrier_release_branch_bits[i] = __kmp_barrier_release_bb_dflt; 15880b57cec5SDimitry Andric } 15890b57cec5SDimitry Andric } 15900b57cec5SDimitry Andric if (__kmp_barrier_gather_branch_bits[i] > KMP_MAX_BRANCH_BITS) { 15910b57cec5SDimitry Andric KMP_WARNING(BarrGatherValueInvalid, name, value); 15920b57cec5SDimitry Andric KMP_INFORM(Using_uint_Value, name, __kmp_barrier_gather_bb_dflt); 15930b57cec5SDimitry Andric __kmp_barrier_gather_branch_bits[i] = __kmp_barrier_gather_bb_dflt; 15940b57cec5SDimitry Andric } 15950b57cec5SDimitry Andric } 15960b57cec5SDimitry Andric K_DIAG(1, ("%s == %d,%d\n", __kmp_barrier_branch_bit_env_name[i], 15970b57cec5SDimitry Andric __kmp_barrier_gather_branch_bits[i], 15980b57cec5SDimitry Andric __kmp_barrier_release_branch_bits[i])) 15990b57cec5SDimitry Andric } 16000b57cec5SDimitry Andric } // __kmp_stg_parse_barrier_branch_bit 16010b57cec5SDimitry Andric 16020b57cec5SDimitry Andric static void __kmp_stg_print_barrier_branch_bit(kmp_str_buf_t *buffer, 16030b57cec5SDimitry Andric char const *name, void *data) { 16040b57cec5SDimitry Andric const char *var; 16050b57cec5SDimitry Andric for (int i = bs_plain_barrier; i < bs_last_barrier; i++) { 16060b57cec5SDimitry Andric var = __kmp_barrier_branch_bit_env_name[i]; 16070b57cec5SDimitry Andric if (strcmp(var, name) == 0) { 16080b57cec5SDimitry Andric if (__kmp_env_format) { 16090b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(__kmp_barrier_branch_bit_env_name[i]); 16100b57cec5SDimitry Andric } else { 16110b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", 16120b57cec5SDimitry Andric __kmp_barrier_branch_bit_env_name[i]); 16130b57cec5SDimitry Andric } 16140b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%d,%d'\n", 16150b57cec5SDimitry Andric __kmp_barrier_gather_branch_bits[i], 16160b57cec5SDimitry Andric __kmp_barrier_release_branch_bits[i]); 16170b57cec5SDimitry Andric } 16180b57cec5SDimitry Andric } 16190b57cec5SDimitry Andric } // __kmp_stg_print_barrier_branch_bit 16200b57cec5SDimitry Andric 16210b57cec5SDimitry Andric // ---------------------------------------------------------------------------- 16220b57cec5SDimitry Andric // KMP_PLAIN_BARRIER_PATTERN, KMP_FORKJOIN_BARRIER_PATTERN, 16230b57cec5SDimitry Andric // KMP_REDUCTION_BARRIER_PATTERN 16240b57cec5SDimitry Andric 16250b57cec5SDimitry Andric // TODO: Remove __kmp_barrier_pattern_name variable, remove loops from parse and 16260b57cec5SDimitry Andric // print functions, pass required data to functions through data argument. 16270b57cec5SDimitry Andric 16280b57cec5SDimitry Andric static void __kmp_stg_parse_barrier_pattern(char const *name, char const *value, 16290b57cec5SDimitry Andric void *data) { 16300b57cec5SDimitry Andric const char *var; 16310b57cec5SDimitry Andric /* ---------- Barrier method control ------------ */ 16320b57cec5SDimitry Andric 16330b57cec5SDimitry Andric for (int i = bs_plain_barrier; i < bs_last_barrier; i++) { 16340b57cec5SDimitry Andric var = __kmp_barrier_pattern_env_name[i]; 16350b57cec5SDimitry Andric 16360b57cec5SDimitry Andric if ((strcmp(var, name) == 0) && (value != 0)) { 16370b57cec5SDimitry Andric int j; 16380b57cec5SDimitry Andric char *comma = CCAST(char *, strchr(value, ',')); 16390b57cec5SDimitry Andric 16400b57cec5SDimitry Andric /* handle first parameter: gather pattern */ 16410b57cec5SDimitry Andric for (j = bp_linear_bar; j < bp_last_bar; j++) { 16420b57cec5SDimitry Andric if (__kmp_match_with_sentinel(__kmp_barrier_pattern_name[j], value, 1, 16430b57cec5SDimitry Andric ',')) { 16440b57cec5SDimitry Andric __kmp_barrier_gather_pattern[i] = (kmp_bar_pat_e)j; 16450b57cec5SDimitry Andric break; 16460b57cec5SDimitry Andric } 16470b57cec5SDimitry Andric } 16480b57cec5SDimitry Andric if (j == bp_last_bar) { 16490b57cec5SDimitry Andric KMP_WARNING(BarrGatherValueInvalid, name, value); 16500b57cec5SDimitry Andric KMP_INFORM(Using_str_Value, name, 16510b57cec5SDimitry Andric __kmp_barrier_pattern_name[bp_linear_bar]); 16520b57cec5SDimitry Andric } 16530b57cec5SDimitry Andric 16540b57cec5SDimitry Andric /* handle second parameter: release pattern */ 16550b57cec5SDimitry Andric if (comma != NULL) { 16560b57cec5SDimitry Andric for (j = bp_linear_bar; j < bp_last_bar; j++) { 16570b57cec5SDimitry Andric if (__kmp_str_match(__kmp_barrier_pattern_name[j], 1, comma + 1)) { 16580b57cec5SDimitry Andric __kmp_barrier_release_pattern[i] = (kmp_bar_pat_e)j; 16590b57cec5SDimitry Andric break; 16600b57cec5SDimitry Andric } 16610b57cec5SDimitry Andric } 16620b57cec5SDimitry Andric if (j == bp_last_bar) { 16630b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, 16640b57cec5SDimitry Andric KMP_MSG(BarrReleaseValueInvalid, name, comma + 1), 16650b57cec5SDimitry Andric __kmp_msg_null); 16660b57cec5SDimitry Andric KMP_INFORM(Using_str_Value, name, 16670b57cec5SDimitry Andric __kmp_barrier_pattern_name[bp_linear_bar]); 16680b57cec5SDimitry Andric } 16690b57cec5SDimitry Andric } 16700b57cec5SDimitry Andric } 16710b57cec5SDimitry Andric } 16720b57cec5SDimitry Andric } // __kmp_stg_parse_barrier_pattern 16730b57cec5SDimitry Andric 16740b57cec5SDimitry Andric static void __kmp_stg_print_barrier_pattern(kmp_str_buf_t *buffer, 16750b57cec5SDimitry Andric char const *name, void *data) { 16760b57cec5SDimitry Andric const char *var; 16770b57cec5SDimitry Andric for (int i = bs_plain_barrier; i < bs_last_barrier; i++) { 16780b57cec5SDimitry Andric var = __kmp_barrier_pattern_env_name[i]; 16790b57cec5SDimitry Andric if (strcmp(var, name) == 0) { 16800b57cec5SDimitry Andric int j = __kmp_barrier_gather_pattern[i]; 16810b57cec5SDimitry Andric int k = __kmp_barrier_release_pattern[i]; 16820b57cec5SDimitry Andric if (__kmp_env_format) { 16830b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(__kmp_barrier_pattern_env_name[i]); 16840b57cec5SDimitry Andric } else { 16850b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", 16860b57cec5SDimitry Andric __kmp_barrier_pattern_env_name[i]); 16870b57cec5SDimitry Andric } 16880b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%s'\n", __kmp_barrier_pattern_name[j], 16890b57cec5SDimitry Andric __kmp_barrier_pattern_name[k]); 16900b57cec5SDimitry Andric } 16910b57cec5SDimitry Andric } 16920b57cec5SDimitry Andric } // __kmp_stg_print_barrier_pattern 16930b57cec5SDimitry Andric 16940b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 16950b57cec5SDimitry Andric // KMP_ABORT_DELAY 16960b57cec5SDimitry Andric 16970b57cec5SDimitry Andric static void __kmp_stg_parse_abort_delay(char const *name, char const *value, 16980b57cec5SDimitry Andric void *data) { 16990b57cec5SDimitry Andric // Units of KMP_DELAY_ABORT are seconds, units of __kmp_abort_delay is 17000b57cec5SDimitry Andric // milliseconds. 17010b57cec5SDimitry Andric int delay = __kmp_abort_delay / 1000; 17020b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, INT_MAX / 1000, &delay); 17030b57cec5SDimitry Andric __kmp_abort_delay = delay * 1000; 17040b57cec5SDimitry Andric } // __kmp_stg_parse_abort_delay 17050b57cec5SDimitry Andric 17060b57cec5SDimitry Andric static void __kmp_stg_print_abort_delay(kmp_str_buf_t *buffer, char const *name, 17070b57cec5SDimitry Andric void *data) { 17080b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_abort_delay); 17090b57cec5SDimitry Andric } // __kmp_stg_print_abort_delay 17100b57cec5SDimitry Andric 17110b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 17120b57cec5SDimitry Andric // KMP_CPUINFO_FILE 17130b57cec5SDimitry Andric 17140b57cec5SDimitry Andric static void __kmp_stg_parse_cpuinfo_file(char const *name, char const *value, 17150b57cec5SDimitry Andric void *data) { 17160b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 17170b57cec5SDimitry Andric __kmp_stg_parse_str(name, value, &__kmp_cpuinfo_file); 17180b57cec5SDimitry Andric K_DIAG(1, ("__kmp_cpuinfo_file == %s\n", __kmp_cpuinfo_file)); 17190b57cec5SDimitry Andric #endif 17200b57cec5SDimitry Andric } //__kmp_stg_parse_cpuinfo_file 17210b57cec5SDimitry Andric 17220b57cec5SDimitry Andric static void __kmp_stg_print_cpuinfo_file(kmp_str_buf_t *buffer, 17230b57cec5SDimitry Andric char const *name, void *data) { 17240b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 17250b57cec5SDimitry Andric if (__kmp_env_format) { 17260b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 17270b57cec5SDimitry Andric } else { 17280b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 17290b57cec5SDimitry Andric } 17300b57cec5SDimitry Andric if (__kmp_cpuinfo_file) { 17310b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='%s'\n", __kmp_cpuinfo_file); 17320b57cec5SDimitry Andric } else { 17330b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 17340b57cec5SDimitry Andric } 17350b57cec5SDimitry Andric #endif 17360b57cec5SDimitry Andric } //__kmp_stg_print_cpuinfo_file 17370b57cec5SDimitry Andric 17380b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 17390b57cec5SDimitry Andric // KMP_FORCE_REDUCTION, KMP_DETERMINISTIC_REDUCTION 17400b57cec5SDimitry Andric 17410b57cec5SDimitry Andric static void __kmp_stg_parse_force_reduction(char const *name, char const *value, 17420b57cec5SDimitry Andric void *data) { 17430b57cec5SDimitry Andric kmp_stg_fr_data_t *reduction = (kmp_stg_fr_data_t *)data; 17440b57cec5SDimitry Andric int rc; 17450b57cec5SDimitry Andric 17460b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, reduction->rivals); 17470b57cec5SDimitry Andric if (rc) { 17480b57cec5SDimitry Andric return; 17490b57cec5SDimitry Andric } 17500b57cec5SDimitry Andric if (reduction->force) { 17510b57cec5SDimitry Andric if (value != 0) { 17520b57cec5SDimitry Andric if (__kmp_str_match("critical", 0, value)) 17530b57cec5SDimitry Andric __kmp_force_reduction_method = critical_reduce_block; 17540b57cec5SDimitry Andric else if (__kmp_str_match("atomic", 0, value)) 17550b57cec5SDimitry Andric __kmp_force_reduction_method = atomic_reduce_block; 17560b57cec5SDimitry Andric else if (__kmp_str_match("tree", 0, value)) 17570b57cec5SDimitry Andric __kmp_force_reduction_method = tree_reduce_block; 17580b57cec5SDimitry Andric else { 17590b57cec5SDimitry Andric KMP_FATAL(UnknownForceReduction, name, value); 17600b57cec5SDimitry Andric } 17610b57cec5SDimitry Andric } 17620b57cec5SDimitry Andric } else { 17630b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_determ_red); 17640b57cec5SDimitry Andric if (__kmp_determ_red) { 17650b57cec5SDimitry Andric __kmp_force_reduction_method = tree_reduce_block; 17660b57cec5SDimitry Andric } else { 17670b57cec5SDimitry Andric __kmp_force_reduction_method = reduction_method_not_defined; 17680b57cec5SDimitry Andric } 17690b57cec5SDimitry Andric } 17700b57cec5SDimitry Andric K_DIAG(1, ("__kmp_force_reduction_method == %d\n", 17710b57cec5SDimitry Andric __kmp_force_reduction_method)); 17720b57cec5SDimitry Andric } // __kmp_stg_parse_force_reduction 17730b57cec5SDimitry Andric 17740b57cec5SDimitry Andric static void __kmp_stg_print_force_reduction(kmp_str_buf_t *buffer, 17750b57cec5SDimitry Andric char const *name, void *data) { 17760b57cec5SDimitry Andric 17770b57cec5SDimitry Andric kmp_stg_fr_data_t *reduction = (kmp_stg_fr_data_t *)data; 17780b57cec5SDimitry Andric if (reduction->force) { 17790b57cec5SDimitry Andric if (__kmp_force_reduction_method == critical_reduce_block) { 17800b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "critical"); 17810b57cec5SDimitry Andric } else if (__kmp_force_reduction_method == atomic_reduce_block) { 17820b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "atomic"); 17830b57cec5SDimitry Andric } else if (__kmp_force_reduction_method == tree_reduce_block) { 17840b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "tree"); 17850b57cec5SDimitry Andric } else { 17860b57cec5SDimitry Andric if (__kmp_env_format) { 17870b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 17880b57cec5SDimitry Andric } else { 17890b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 17900b57cec5SDimitry Andric } 17910b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 17920b57cec5SDimitry Andric } 17930b57cec5SDimitry Andric } else { 17940b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_determ_red); 17950b57cec5SDimitry Andric } 17960b57cec5SDimitry Andric 17970b57cec5SDimitry Andric } // __kmp_stg_print_force_reduction 17980b57cec5SDimitry Andric 17990b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 18000b57cec5SDimitry Andric // KMP_STORAGE_MAP 18010b57cec5SDimitry Andric 18020b57cec5SDimitry Andric static void __kmp_stg_parse_storage_map(char const *name, char const *value, 18030b57cec5SDimitry Andric void *data) { 18040b57cec5SDimitry Andric if (__kmp_str_match("verbose", 1, value)) { 18050b57cec5SDimitry Andric __kmp_storage_map = TRUE; 18060b57cec5SDimitry Andric __kmp_storage_map_verbose = TRUE; 18070b57cec5SDimitry Andric __kmp_storage_map_verbose_specified = TRUE; 18080b57cec5SDimitry Andric 18090b57cec5SDimitry Andric } else { 18100b57cec5SDimitry Andric __kmp_storage_map_verbose = FALSE; 18110b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_storage_map); // !!! 18120b57cec5SDimitry Andric } 18130b57cec5SDimitry Andric } // __kmp_stg_parse_storage_map 18140b57cec5SDimitry Andric 18150b57cec5SDimitry Andric static void __kmp_stg_print_storage_map(kmp_str_buf_t *buffer, char const *name, 18160b57cec5SDimitry Andric void *data) { 18170b57cec5SDimitry Andric if (__kmp_storage_map_verbose || __kmp_storage_map_verbose_specified) { 18180b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "verbose"); 18190b57cec5SDimitry Andric } else { 18200b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_storage_map); 18210b57cec5SDimitry Andric } 18220b57cec5SDimitry Andric } // __kmp_stg_print_storage_map 18230b57cec5SDimitry Andric 18240b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 18250b57cec5SDimitry Andric // KMP_ALL_THREADPRIVATE 18260b57cec5SDimitry Andric 18270b57cec5SDimitry Andric static void __kmp_stg_parse_all_threadprivate(char const *name, 18280b57cec5SDimitry Andric char const *value, void *data) { 18290b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 18300b57cec5SDimitry Andric __kmp_allThreadsSpecified ? __kmp_max_nth : 1, 18310b57cec5SDimitry Andric __kmp_max_nth, &__kmp_tp_capacity); 18320b57cec5SDimitry Andric } // __kmp_stg_parse_all_threadprivate 18330b57cec5SDimitry Andric 18340b57cec5SDimitry Andric static void __kmp_stg_print_all_threadprivate(kmp_str_buf_t *buffer, 18350b57cec5SDimitry Andric char const *name, void *data) { 18360b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_tp_capacity); 18370b57cec5SDimitry Andric } 18380b57cec5SDimitry Andric 18390b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 18400b57cec5SDimitry Andric // KMP_FOREIGN_THREADS_THREADPRIVATE 18410b57cec5SDimitry Andric 18420b57cec5SDimitry Andric static void __kmp_stg_parse_foreign_threads_threadprivate(char const *name, 18430b57cec5SDimitry Andric char const *value, 18440b57cec5SDimitry Andric void *data) { 18450b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_foreign_tp); 18460b57cec5SDimitry Andric } // __kmp_stg_parse_foreign_threads_threadprivate 18470b57cec5SDimitry Andric 18480b57cec5SDimitry Andric static void __kmp_stg_print_foreign_threads_threadprivate(kmp_str_buf_t *buffer, 18490b57cec5SDimitry Andric char const *name, 18500b57cec5SDimitry Andric void *data) { 18510b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_foreign_tp); 18520b57cec5SDimitry Andric } // __kmp_stg_print_foreign_threads_threadprivate 18530b57cec5SDimitry Andric 18540b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 18550b57cec5SDimitry Andric // KMP_AFFINITY, GOMP_CPU_AFFINITY, KMP_TOPOLOGY_METHOD 18560b57cec5SDimitry Andric 18570b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 18580b57cec5SDimitry Andric // Parse the proc id list. Return TRUE if successful, FALSE otherwise. 18590b57cec5SDimitry Andric static int __kmp_parse_affinity_proc_id_list(const char *var, const char *env, 18600b57cec5SDimitry Andric const char **nextEnv, 18610b57cec5SDimitry Andric char **proclist) { 18620b57cec5SDimitry Andric const char *scan = env; 18630b57cec5SDimitry Andric const char *next = scan; 18640b57cec5SDimitry Andric int empty = TRUE; 18650b57cec5SDimitry Andric 18660b57cec5SDimitry Andric *proclist = NULL; 18670b57cec5SDimitry Andric 18680b57cec5SDimitry Andric for (;;) { 18690b57cec5SDimitry Andric int start, end, stride; 18700b57cec5SDimitry Andric 18710b57cec5SDimitry Andric SKIP_WS(scan); 18720b57cec5SDimitry Andric next = scan; 18730b57cec5SDimitry Andric if (*next == '\0') { 18740b57cec5SDimitry Andric break; 18750b57cec5SDimitry Andric } 18760b57cec5SDimitry Andric 18770b57cec5SDimitry Andric if (*next == '{') { 18780b57cec5SDimitry Andric int num; 18790b57cec5SDimitry Andric next++; // skip '{' 18800b57cec5SDimitry Andric SKIP_WS(next); 18810b57cec5SDimitry Andric scan = next; 18820b57cec5SDimitry Andric 18830b57cec5SDimitry Andric // Read the first integer in the set. 18840b57cec5SDimitry Andric if ((*next < '0') || (*next > '9')) { 18850b57cec5SDimitry Andric KMP_WARNING(AffSyntaxError, var); 18860b57cec5SDimitry Andric return FALSE; 18870b57cec5SDimitry Andric } 18880b57cec5SDimitry Andric SKIP_DIGITS(next); 18890b57cec5SDimitry Andric num = __kmp_str_to_int(scan, *next); 18900b57cec5SDimitry Andric KMP_ASSERT(num >= 0); 18910b57cec5SDimitry Andric 18920b57cec5SDimitry Andric for (;;) { 18930b57cec5SDimitry Andric // Check for end of set. 18940b57cec5SDimitry Andric SKIP_WS(next); 18950b57cec5SDimitry Andric if (*next == '}') { 18960b57cec5SDimitry Andric next++; // skip '}' 18970b57cec5SDimitry Andric break; 18980b57cec5SDimitry Andric } 18990b57cec5SDimitry Andric 19000b57cec5SDimitry Andric // Skip optional comma. 19010b57cec5SDimitry Andric if (*next == ',') { 19020b57cec5SDimitry Andric next++; 19030b57cec5SDimitry Andric } 19040b57cec5SDimitry Andric SKIP_WS(next); 19050b57cec5SDimitry Andric 19060b57cec5SDimitry Andric // Read the next integer in the set. 19070b57cec5SDimitry Andric scan = next; 19080b57cec5SDimitry Andric if ((*next < '0') || (*next > '9')) { 19090b57cec5SDimitry Andric KMP_WARNING(AffSyntaxError, var); 19100b57cec5SDimitry Andric return FALSE; 19110b57cec5SDimitry Andric } 19120b57cec5SDimitry Andric 19130b57cec5SDimitry Andric SKIP_DIGITS(next); 19140b57cec5SDimitry Andric num = __kmp_str_to_int(scan, *next); 19150b57cec5SDimitry Andric KMP_ASSERT(num >= 0); 19160b57cec5SDimitry Andric } 19170b57cec5SDimitry Andric empty = FALSE; 19180b57cec5SDimitry Andric 19190b57cec5SDimitry Andric SKIP_WS(next); 19200b57cec5SDimitry Andric if (*next == ',') { 19210b57cec5SDimitry Andric next++; 19220b57cec5SDimitry Andric } 19230b57cec5SDimitry Andric scan = next; 19240b57cec5SDimitry Andric continue; 19250b57cec5SDimitry Andric } 19260b57cec5SDimitry Andric 19270b57cec5SDimitry Andric // Next character is not an integer => end of list 19280b57cec5SDimitry Andric if ((*next < '0') || (*next > '9')) { 19290b57cec5SDimitry Andric if (empty) { 19300b57cec5SDimitry Andric KMP_WARNING(AffSyntaxError, var); 19310b57cec5SDimitry Andric return FALSE; 19320b57cec5SDimitry Andric } 19330b57cec5SDimitry Andric break; 19340b57cec5SDimitry Andric } 19350b57cec5SDimitry Andric 19360b57cec5SDimitry Andric // Read the first integer. 19370b57cec5SDimitry Andric SKIP_DIGITS(next); 19380b57cec5SDimitry Andric start = __kmp_str_to_int(scan, *next); 19390b57cec5SDimitry Andric KMP_ASSERT(start >= 0); 19400b57cec5SDimitry Andric SKIP_WS(next); 19410b57cec5SDimitry Andric 19420b57cec5SDimitry Andric // If this isn't a range, then go on. 19430b57cec5SDimitry Andric if (*next != '-') { 19440b57cec5SDimitry Andric empty = FALSE; 19450b57cec5SDimitry Andric 19460b57cec5SDimitry Andric // Skip optional comma. 19470b57cec5SDimitry Andric if (*next == ',') { 19480b57cec5SDimitry Andric next++; 19490b57cec5SDimitry Andric } 19500b57cec5SDimitry Andric scan = next; 19510b57cec5SDimitry Andric continue; 19520b57cec5SDimitry Andric } 19530b57cec5SDimitry Andric 19540b57cec5SDimitry Andric // This is a range. Skip over the '-' and read in the 2nd int. 19550b57cec5SDimitry Andric next++; // skip '-' 19560b57cec5SDimitry Andric SKIP_WS(next); 19570b57cec5SDimitry Andric scan = next; 19580b57cec5SDimitry Andric if ((*next < '0') || (*next > '9')) { 19590b57cec5SDimitry Andric KMP_WARNING(AffSyntaxError, var); 19600b57cec5SDimitry Andric return FALSE; 19610b57cec5SDimitry Andric } 19620b57cec5SDimitry Andric SKIP_DIGITS(next); 19630b57cec5SDimitry Andric end = __kmp_str_to_int(scan, *next); 19640b57cec5SDimitry Andric KMP_ASSERT(end >= 0); 19650b57cec5SDimitry Andric 19660b57cec5SDimitry Andric // Check for a stride parameter 19670b57cec5SDimitry Andric stride = 1; 19680b57cec5SDimitry Andric SKIP_WS(next); 19690b57cec5SDimitry Andric if (*next == ':') { 19700b57cec5SDimitry Andric // A stride is specified. Skip over the ':" and read the 3rd int. 19710b57cec5SDimitry Andric int sign = +1; 19720b57cec5SDimitry Andric next++; // skip ':' 19730b57cec5SDimitry Andric SKIP_WS(next); 19740b57cec5SDimitry Andric scan = next; 19750b57cec5SDimitry Andric if (*next == '-') { 19760b57cec5SDimitry Andric sign = -1; 19770b57cec5SDimitry Andric next++; 19780b57cec5SDimitry Andric SKIP_WS(next); 19790b57cec5SDimitry Andric scan = next; 19800b57cec5SDimitry Andric } 19810b57cec5SDimitry Andric if ((*next < '0') || (*next > '9')) { 19820b57cec5SDimitry Andric KMP_WARNING(AffSyntaxError, var); 19830b57cec5SDimitry Andric return FALSE; 19840b57cec5SDimitry Andric } 19850b57cec5SDimitry Andric SKIP_DIGITS(next); 19860b57cec5SDimitry Andric stride = __kmp_str_to_int(scan, *next); 19870b57cec5SDimitry Andric KMP_ASSERT(stride >= 0); 19880b57cec5SDimitry Andric stride *= sign; 19890b57cec5SDimitry Andric } 19900b57cec5SDimitry Andric 19910b57cec5SDimitry Andric // Do some range checks. 19920b57cec5SDimitry Andric if (stride == 0) { 19930b57cec5SDimitry Andric KMP_WARNING(AffZeroStride, var); 19940b57cec5SDimitry Andric return FALSE; 19950b57cec5SDimitry Andric } 19960b57cec5SDimitry Andric if (stride > 0) { 19970b57cec5SDimitry Andric if (start > end) { 19980b57cec5SDimitry Andric KMP_WARNING(AffStartGreaterEnd, var, start, end); 19990b57cec5SDimitry Andric return FALSE; 20000b57cec5SDimitry Andric } 20010b57cec5SDimitry Andric } else { 20020b57cec5SDimitry Andric if (start < end) { 20030b57cec5SDimitry Andric KMP_WARNING(AffStrideLessZero, var, start, end); 20040b57cec5SDimitry Andric return FALSE; 20050b57cec5SDimitry Andric } 20060b57cec5SDimitry Andric } 20070b57cec5SDimitry Andric if ((end - start) / stride > 65536) { 20080b57cec5SDimitry Andric KMP_WARNING(AffRangeTooBig, var, end, start, stride); 20090b57cec5SDimitry Andric return FALSE; 20100b57cec5SDimitry Andric } 20110b57cec5SDimitry Andric 20120b57cec5SDimitry Andric empty = FALSE; 20130b57cec5SDimitry Andric 20140b57cec5SDimitry Andric // Skip optional comma. 20150b57cec5SDimitry Andric SKIP_WS(next); 20160b57cec5SDimitry Andric if (*next == ',') { 20170b57cec5SDimitry Andric next++; 20180b57cec5SDimitry Andric } 20190b57cec5SDimitry Andric scan = next; 20200b57cec5SDimitry Andric } 20210b57cec5SDimitry Andric 20220b57cec5SDimitry Andric *nextEnv = next; 20230b57cec5SDimitry Andric 20240b57cec5SDimitry Andric { 2025*e8d8bef9SDimitry Andric ptrdiff_t len = next - env; 20260b57cec5SDimitry Andric char *retlist = (char *)__kmp_allocate((len + 1) * sizeof(char)); 20270b57cec5SDimitry Andric KMP_MEMCPY_S(retlist, (len + 1) * sizeof(char), env, len * sizeof(char)); 20280b57cec5SDimitry Andric retlist[len] = '\0'; 20290b57cec5SDimitry Andric *proclist = retlist; 20300b57cec5SDimitry Andric } 20310b57cec5SDimitry Andric return TRUE; 20320b57cec5SDimitry Andric } 20330b57cec5SDimitry Andric 20340b57cec5SDimitry Andric // If KMP_AFFINITY is specified without a type, then 20350b57cec5SDimitry Andric // __kmp_affinity_notype should point to its setting. 20360b57cec5SDimitry Andric static kmp_setting_t *__kmp_affinity_notype = NULL; 20370b57cec5SDimitry Andric 20380b57cec5SDimitry Andric static void __kmp_parse_affinity_env(char const *name, char const *value, 20390b57cec5SDimitry Andric enum affinity_type *out_type, 20400b57cec5SDimitry Andric char **out_proclist, int *out_verbose, 20410b57cec5SDimitry Andric int *out_warn, int *out_respect, 20420b57cec5SDimitry Andric enum affinity_gran *out_gran, 20430b57cec5SDimitry Andric int *out_gran_levels, int *out_dups, 20440b57cec5SDimitry Andric int *out_compact, int *out_offset) { 20450b57cec5SDimitry Andric char *buffer = NULL; // Copy of env var value. 20460b57cec5SDimitry Andric char *buf = NULL; // Buffer for strtok_r() function. 20470b57cec5SDimitry Andric char *next = NULL; // end of token / start of next. 20480b57cec5SDimitry Andric const char *start; // start of current token (for err msgs) 20490b57cec5SDimitry Andric int count = 0; // Counter of parsed integer numbers. 20500b57cec5SDimitry Andric int number[2]; // Parsed numbers. 20510b57cec5SDimitry Andric 20520b57cec5SDimitry Andric // Guards. 20530b57cec5SDimitry Andric int type = 0; 20540b57cec5SDimitry Andric int proclist = 0; 20550b57cec5SDimitry Andric int verbose = 0; 20560b57cec5SDimitry Andric int warnings = 0; 20570b57cec5SDimitry Andric int respect = 0; 20580b57cec5SDimitry Andric int gran = 0; 20590b57cec5SDimitry Andric int dups = 0; 20600b57cec5SDimitry Andric 20610b57cec5SDimitry Andric KMP_ASSERT(value != NULL); 20620b57cec5SDimitry Andric 20630b57cec5SDimitry Andric if (TCR_4(__kmp_init_middle)) { 20640b57cec5SDimitry Andric KMP_WARNING(EnvMiddleWarn, name); 20650b57cec5SDimitry Andric __kmp_env_toPrint(name, 0); 20660b57cec5SDimitry Andric return; 20670b57cec5SDimitry Andric } 20680b57cec5SDimitry Andric __kmp_env_toPrint(name, 1); 20690b57cec5SDimitry Andric 20700b57cec5SDimitry Andric buffer = 20710b57cec5SDimitry Andric __kmp_str_format("%s", value); // Copy env var to keep original intact. 20720b57cec5SDimitry Andric buf = buffer; 20730b57cec5SDimitry Andric SKIP_WS(buf); 20740b57cec5SDimitry Andric 20750b57cec5SDimitry Andric // Helper macros. 20760b57cec5SDimitry Andric 20770b57cec5SDimitry Andric // If we see a parse error, emit a warning and scan to the next ",". 20780b57cec5SDimitry Andric // 20790b57cec5SDimitry Andric // FIXME - there's got to be a better way to print an error 20805ffd83dbSDimitry Andric // message, hopefully without overwriting peices of buf. 20810b57cec5SDimitry Andric #define EMIT_WARN(skip, errlist) \ 20820b57cec5SDimitry Andric { \ 20830b57cec5SDimitry Andric char ch; \ 20840b57cec5SDimitry Andric if (skip) { \ 20850b57cec5SDimitry Andric SKIP_TO(next, ','); \ 20860b57cec5SDimitry Andric } \ 20870b57cec5SDimitry Andric ch = *next; \ 20880b57cec5SDimitry Andric *next = '\0'; \ 20890b57cec5SDimitry Andric KMP_WARNING errlist; \ 20900b57cec5SDimitry Andric *next = ch; \ 20910b57cec5SDimitry Andric if (skip) { \ 20920b57cec5SDimitry Andric if (ch == ',') \ 20930b57cec5SDimitry Andric next++; \ 20940b57cec5SDimitry Andric } \ 20950b57cec5SDimitry Andric buf = next; \ 20960b57cec5SDimitry Andric } 20970b57cec5SDimitry Andric 20980b57cec5SDimitry Andric #define _set_param(_guard, _var, _val) \ 20990b57cec5SDimitry Andric { \ 21000b57cec5SDimitry Andric if (_guard == 0) { \ 21010b57cec5SDimitry Andric _var = _val; \ 21020b57cec5SDimitry Andric } else { \ 21030b57cec5SDimitry Andric EMIT_WARN(FALSE, (AffParamDefined, name, start)); \ 21040b57cec5SDimitry Andric } \ 21050b57cec5SDimitry Andric ++_guard; \ 21060b57cec5SDimitry Andric } 21070b57cec5SDimitry Andric 21080b57cec5SDimitry Andric #define set_type(val) _set_param(type, *out_type, val) 21090b57cec5SDimitry Andric #define set_verbose(val) _set_param(verbose, *out_verbose, val) 21100b57cec5SDimitry Andric #define set_warnings(val) _set_param(warnings, *out_warn, val) 21110b57cec5SDimitry Andric #define set_respect(val) _set_param(respect, *out_respect, val) 21120b57cec5SDimitry Andric #define set_dups(val) _set_param(dups, *out_dups, val) 21130b57cec5SDimitry Andric #define set_proclist(val) _set_param(proclist, *out_proclist, val) 21140b57cec5SDimitry Andric 21150b57cec5SDimitry Andric #define set_gran(val, levels) \ 21160b57cec5SDimitry Andric { \ 21170b57cec5SDimitry Andric if (gran == 0) { \ 21180b57cec5SDimitry Andric *out_gran = val; \ 21190b57cec5SDimitry Andric *out_gran_levels = levels; \ 21200b57cec5SDimitry Andric } else { \ 21210b57cec5SDimitry Andric EMIT_WARN(FALSE, (AffParamDefined, name, start)); \ 21220b57cec5SDimitry Andric } \ 21230b57cec5SDimitry Andric ++gran; \ 21240b57cec5SDimitry Andric } 21250b57cec5SDimitry Andric 21260b57cec5SDimitry Andric KMP_DEBUG_ASSERT((__kmp_nested_proc_bind.bind_types != NULL) && 21270b57cec5SDimitry Andric (__kmp_nested_proc_bind.used > 0)); 21280b57cec5SDimitry Andric 21290b57cec5SDimitry Andric while (*buf != '\0') { 21300b57cec5SDimitry Andric start = next = buf; 21310b57cec5SDimitry Andric 21320b57cec5SDimitry Andric if (__kmp_match_str("none", buf, CCAST(const char **, &next))) { 21330b57cec5SDimitry Andric set_type(affinity_none); 21340b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 21350b57cec5SDimitry Andric buf = next; 21360b57cec5SDimitry Andric } else if (__kmp_match_str("scatter", buf, CCAST(const char **, &next))) { 21370b57cec5SDimitry Andric set_type(affinity_scatter); 21380b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 21390b57cec5SDimitry Andric buf = next; 21400b57cec5SDimitry Andric } else if (__kmp_match_str("compact", buf, CCAST(const char **, &next))) { 21410b57cec5SDimitry Andric set_type(affinity_compact); 21420b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 21430b57cec5SDimitry Andric buf = next; 21440b57cec5SDimitry Andric } else if (__kmp_match_str("logical", buf, CCAST(const char **, &next))) { 21450b57cec5SDimitry Andric set_type(affinity_logical); 21460b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 21470b57cec5SDimitry Andric buf = next; 21480b57cec5SDimitry Andric } else if (__kmp_match_str("physical", buf, CCAST(const char **, &next))) { 21490b57cec5SDimitry Andric set_type(affinity_physical); 21500b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 21510b57cec5SDimitry Andric buf = next; 21520b57cec5SDimitry Andric } else if (__kmp_match_str("explicit", buf, CCAST(const char **, &next))) { 21530b57cec5SDimitry Andric set_type(affinity_explicit); 21540b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 21550b57cec5SDimitry Andric buf = next; 21560b57cec5SDimitry Andric } else if (__kmp_match_str("balanced", buf, CCAST(const char **, &next))) { 21570b57cec5SDimitry Andric set_type(affinity_balanced); 21580b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 21590b57cec5SDimitry Andric buf = next; 21600b57cec5SDimitry Andric } else if (__kmp_match_str("disabled", buf, CCAST(const char **, &next))) { 21610b57cec5SDimitry Andric set_type(affinity_disabled); 21620b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 21630b57cec5SDimitry Andric buf = next; 21640b57cec5SDimitry Andric } else if (__kmp_match_str("verbose", buf, CCAST(const char **, &next))) { 21650b57cec5SDimitry Andric set_verbose(TRUE); 21660b57cec5SDimitry Andric buf = next; 21670b57cec5SDimitry Andric } else if (__kmp_match_str("noverbose", buf, CCAST(const char **, &next))) { 21680b57cec5SDimitry Andric set_verbose(FALSE); 21690b57cec5SDimitry Andric buf = next; 21700b57cec5SDimitry Andric } else if (__kmp_match_str("warnings", buf, CCAST(const char **, &next))) { 21710b57cec5SDimitry Andric set_warnings(TRUE); 21720b57cec5SDimitry Andric buf = next; 21730b57cec5SDimitry Andric } else if (__kmp_match_str("nowarnings", buf, 21740b57cec5SDimitry Andric CCAST(const char **, &next))) { 21750b57cec5SDimitry Andric set_warnings(FALSE); 21760b57cec5SDimitry Andric buf = next; 21770b57cec5SDimitry Andric } else if (__kmp_match_str("respect", buf, CCAST(const char **, &next))) { 21780b57cec5SDimitry Andric set_respect(TRUE); 21790b57cec5SDimitry Andric buf = next; 21800b57cec5SDimitry Andric } else if (__kmp_match_str("norespect", buf, CCAST(const char **, &next))) { 21810b57cec5SDimitry Andric set_respect(FALSE); 21820b57cec5SDimitry Andric buf = next; 21830b57cec5SDimitry Andric } else if (__kmp_match_str("duplicates", buf, 21840b57cec5SDimitry Andric CCAST(const char **, &next)) || 21850b57cec5SDimitry Andric __kmp_match_str("dups", buf, CCAST(const char **, &next))) { 21860b57cec5SDimitry Andric set_dups(TRUE); 21870b57cec5SDimitry Andric buf = next; 21880b57cec5SDimitry Andric } else if (__kmp_match_str("noduplicates", buf, 21890b57cec5SDimitry Andric CCAST(const char **, &next)) || 21900b57cec5SDimitry Andric __kmp_match_str("nodups", buf, CCAST(const char **, &next))) { 21910b57cec5SDimitry Andric set_dups(FALSE); 21920b57cec5SDimitry Andric buf = next; 21930b57cec5SDimitry Andric } else if (__kmp_match_str("granularity", buf, 21940b57cec5SDimitry Andric CCAST(const char **, &next)) || 21950b57cec5SDimitry Andric __kmp_match_str("gran", buf, CCAST(const char **, &next))) { 21960b57cec5SDimitry Andric SKIP_WS(next); 21970b57cec5SDimitry Andric if (*next != '=') { 21980b57cec5SDimitry Andric EMIT_WARN(TRUE, (AffInvalidParam, name, start)); 21990b57cec5SDimitry Andric continue; 22000b57cec5SDimitry Andric } 22010b57cec5SDimitry Andric next++; // skip '=' 22020b57cec5SDimitry Andric SKIP_WS(next); 22030b57cec5SDimitry Andric 22040b57cec5SDimitry Andric buf = next; 22050b57cec5SDimitry Andric if (__kmp_match_str("fine", buf, CCAST(const char **, &next))) { 22060b57cec5SDimitry Andric set_gran(affinity_gran_fine, -1); 22070b57cec5SDimitry Andric buf = next; 22080b57cec5SDimitry Andric } else if (__kmp_match_str("thread", buf, CCAST(const char **, &next))) { 22090b57cec5SDimitry Andric set_gran(affinity_gran_thread, -1); 22100b57cec5SDimitry Andric buf = next; 22110b57cec5SDimitry Andric } else if (__kmp_match_str("core", buf, CCAST(const char **, &next))) { 22120b57cec5SDimitry Andric set_gran(affinity_gran_core, -1); 22130b57cec5SDimitry Andric buf = next; 22140b57cec5SDimitry Andric #if KMP_USE_HWLOC 22150b57cec5SDimitry Andric } else if (__kmp_match_str("tile", buf, CCAST(const char **, &next))) { 22160b57cec5SDimitry Andric set_gran(affinity_gran_tile, -1); 22170b57cec5SDimitry Andric buf = next; 22180b57cec5SDimitry Andric #endif 22190b57cec5SDimitry Andric } else if (__kmp_match_str("package", buf, CCAST(const char **, &next))) { 22200b57cec5SDimitry Andric set_gran(affinity_gran_package, -1); 22210b57cec5SDimitry Andric buf = next; 22220b57cec5SDimitry Andric } else if (__kmp_match_str("node", buf, CCAST(const char **, &next))) { 22230b57cec5SDimitry Andric set_gran(affinity_gran_node, -1); 22240b57cec5SDimitry Andric buf = next; 22250b57cec5SDimitry Andric #if KMP_GROUP_AFFINITY 22260b57cec5SDimitry Andric } else if (__kmp_match_str("group", buf, CCAST(const char **, &next))) { 22270b57cec5SDimitry Andric set_gran(affinity_gran_group, -1); 22280b57cec5SDimitry Andric buf = next; 22290b57cec5SDimitry Andric #endif /* KMP_GROUP AFFINITY */ 22300b57cec5SDimitry Andric } else if ((*buf >= '0') && (*buf <= '9')) { 22310b57cec5SDimitry Andric int n; 22320b57cec5SDimitry Andric next = buf; 22330b57cec5SDimitry Andric SKIP_DIGITS(next); 22340b57cec5SDimitry Andric n = __kmp_str_to_int(buf, *next); 22350b57cec5SDimitry Andric KMP_ASSERT(n >= 0); 22360b57cec5SDimitry Andric buf = next; 22370b57cec5SDimitry Andric set_gran(affinity_gran_default, n); 22380b57cec5SDimitry Andric } else { 22390b57cec5SDimitry Andric EMIT_WARN(TRUE, (AffInvalidParam, name, start)); 22400b57cec5SDimitry Andric continue; 22410b57cec5SDimitry Andric } 22420b57cec5SDimitry Andric } else if (__kmp_match_str("proclist", buf, CCAST(const char **, &next))) { 22430b57cec5SDimitry Andric char *temp_proclist; 22440b57cec5SDimitry Andric 22450b57cec5SDimitry Andric SKIP_WS(next); 22460b57cec5SDimitry Andric if (*next != '=') { 22470b57cec5SDimitry Andric EMIT_WARN(TRUE, (AffInvalidParam, name, start)); 22480b57cec5SDimitry Andric continue; 22490b57cec5SDimitry Andric } 22500b57cec5SDimitry Andric next++; // skip '=' 22510b57cec5SDimitry Andric SKIP_WS(next); 22520b57cec5SDimitry Andric if (*next != '[') { 22530b57cec5SDimitry Andric EMIT_WARN(TRUE, (AffInvalidParam, name, start)); 22540b57cec5SDimitry Andric continue; 22550b57cec5SDimitry Andric } 22560b57cec5SDimitry Andric next++; // skip '[' 22570b57cec5SDimitry Andric buf = next; 22580b57cec5SDimitry Andric if (!__kmp_parse_affinity_proc_id_list( 22590b57cec5SDimitry Andric name, buf, CCAST(const char **, &next), &temp_proclist)) { 22600b57cec5SDimitry Andric // warning already emitted. 22610b57cec5SDimitry Andric SKIP_TO(next, ']'); 22620b57cec5SDimitry Andric if (*next == ']') 22630b57cec5SDimitry Andric next++; 22640b57cec5SDimitry Andric SKIP_TO(next, ','); 22650b57cec5SDimitry Andric if (*next == ',') 22660b57cec5SDimitry Andric next++; 22670b57cec5SDimitry Andric buf = next; 22680b57cec5SDimitry Andric continue; 22690b57cec5SDimitry Andric } 22700b57cec5SDimitry Andric if (*next != ']') { 22710b57cec5SDimitry Andric EMIT_WARN(TRUE, (AffInvalidParam, name, start)); 22720b57cec5SDimitry Andric continue; 22730b57cec5SDimitry Andric } 22740b57cec5SDimitry Andric next++; // skip ']' 22750b57cec5SDimitry Andric set_proclist(temp_proclist); 22760b57cec5SDimitry Andric } else if ((*buf >= '0') && (*buf <= '9')) { 22770b57cec5SDimitry Andric // Parse integer numbers -- permute and offset. 22780b57cec5SDimitry Andric int n; 22790b57cec5SDimitry Andric next = buf; 22800b57cec5SDimitry Andric SKIP_DIGITS(next); 22810b57cec5SDimitry Andric n = __kmp_str_to_int(buf, *next); 22820b57cec5SDimitry Andric KMP_ASSERT(n >= 0); 22830b57cec5SDimitry Andric buf = next; 22840b57cec5SDimitry Andric if (count < 2) { 22850b57cec5SDimitry Andric number[count] = n; 22860b57cec5SDimitry Andric } else { 22870b57cec5SDimitry Andric KMP_WARNING(AffManyParams, name, start); 22880b57cec5SDimitry Andric } 22890b57cec5SDimitry Andric ++count; 22900b57cec5SDimitry Andric } else { 22910b57cec5SDimitry Andric EMIT_WARN(TRUE, (AffInvalidParam, name, start)); 22920b57cec5SDimitry Andric continue; 22930b57cec5SDimitry Andric } 22940b57cec5SDimitry Andric 22950b57cec5SDimitry Andric SKIP_WS(next); 22960b57cec5SDimitry Andric if (*next == ',') { 22970b57cec5SDimitry Andric next++; 22980b57cec5SDimitry Andric SKIP_WS(next); 22990b57cec5SDimitry Andric } else if (*next != '\0') { 23000b57cec5SDimitry Andric const char *temp = next; 23010b57cec5SDimitry Andric EMIT_WARN(TRUE, (ParseExtraCharsWarn, name, temp)); 23020b57cec5SDimitry Andric continue; 23030b57cec5SDimitry Andric } 23040b57cec5SDimitry Andric buf = next; 23050b57cec5SDimitry Andric } // while 23060b57cec5SDimitry Andric 23070b57cec5SDimitry Andric #undef EMIT_WARN 23080b57cec5SDimitry Andric #undef _set_param 23090b57cec5SDimitry Andric #undef set_type 23100b57cec5SDimitry Andric #undef set_verbose 23110b57cec5SDimitry Andric #undef set_warnings 23120b57cec5SDimitry Andric #undef set_respect 23130b57cec5SDimitry Andric #undef set_granularity 23140b57cec5SDimitry Andric 23150b57cec5SDimitry Andric __kmp_str_free(&buffer); 23160b57cec5SDimitry Andric 23170b57cec5SDimitry Andric if (proclist) { 23180b57cec5SDimitry Andric if (!type) { 23190b57cec5SDimitry Andric KMP_WARNING(AffProcListNoType, name); 23200b57cec5SDimitry Andric *out_type = affinity_explicit; 23210b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 23220b57cec5SDimitry Andric } else if (*out_type != affinity_explicit) { 23230b57cec5SDimitry Andric KMP_WARNING(AffProcListNotExplicit, name); 23240b57cec5SDimitry Andric KMP_ASSERT(*out_proclist != NULL); 23250b57cec5SDimitry Andric KMP_INTERNAL_FREE(*out_proclist); 23260b57cec5SDimitry Andric *out_proclist = NULL; 23270b57cec5SDimitry Andric } 23280b57cec5SDimitry Andric } 23290b57cec5SDimitry Andric switch (*out_type) { 23300b57cec5SDimitry Andric case affinity_logical: 23310b57cec5SDimitry Andric case affinity_physical: { 23320b57cec5SDimitry Andric if (count > 0) { 23330b57cec5SDimitry Andric *out_offset = number[0]; 23340b57cec5SDimitry Andric } 23350b57cec5SDimitry Andric if (count > 1) { 23360b57cec5SDimitry Andric KMP_WARNING(AffManyParamsForLogic, name, number[1]); 23370b57cec5SDimitry Andric } 23380b57cec5SDimitry Andric } break; 23390b57cec5SDimitry Andric case affinity_balanced: { 23400b57cec5SDimitry Andric if (count > 0) { 23410b57cec5SDimitry Andric *out_compact = number[0]; 23420b57cec5SDimitry Andric } 23430b57cec5SDimitry Andric if (count > 1) { 23440b57cec5SDimitry Andric *out_offset = number[1]; 23450b57cec5SDimitry Andric } 23460b57cec5SDimitry Andric 23470b57cec5SDimitry Andric if (__kmp_affinity_gran == affinity_gran_default) { 23480b57cec5SDimitry Andric #if KMP_MIC_SUPPORTED 23490b57cec5SDimitry Andric if (__kmp_mic_type != non_mic) { 23500b57cec5SDimitry Andric if (__kmp_affinity_verbose || __kmp_affinity_warnings) { 23510b57cec5SDimitry Andric KMP_WARNING(AffGranUsing, "KMP_AFFINITY", "fine"); 23520b57cec5SDimitry Andric } 23530b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_fine; 23540b57cec5SDimitry Andric } else 23550b57cec5SDimitry Andric #endif 23560b57cec5SDimitry Andric { 23570b57cec5SDimitry Andric if (__kmp_affinity_verbose || __kmp_affinity_warnings) { 23580b57cec5SDimitry Andric KMP_WARNING(AffGranUsing, "KMP_AFFINITY", "core"); 23590b57cec5SDimitry Andric } 23600b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_core; 23610b57cec5SDimitry Andric } 23620b57cec5SDimitry Andric } 23630b57cec5SDimitry Andric } break; 23640b57cec5SDimitry Andric case affinity_scatter: 23650b57cec5SDimitry Andric case affinity_compact: { 23660b57cec5SDimitry Andric if (count > 0) { 23670b57cec5SDimitry Andric *out_compact = number[0]; 23680b57cec5SDimitry Andric } 23690b57cec5SDimitry Andric if (count > 1) { 23700b57cec5SDimitry Andric *out_offset = number[1]; 23710b57cec5SDimitry Andric } 23720b57cec5SDimitry Andric } break; 23730b57cec5SDimitry Andric case affinity_explicit: { 23740b57cec5SDimitry Andric if (*out_proclist == NULL) { 23750b57cec5SDimitry Andric KMP_WARNING(AffNoProcList, name); 23760b57cec5SDimitry Andric __kmp_affinity_type = affinity_none; 23770b57cec5SDimitry Andric } 23780b57cec5SDimitry Andric if (count > 0) { 23790b57cec5SDimitry Andric KMP_WARNING(AffNoParam, name, "explicit"); 23800b57cec5SDimitry Andric } 23810b57cec5SDimitry Andric } break; 23820b57cec5SDimitry Andric case affinity_none: { 23830b57cec5SDimitry Andric if (count > 0) { 23840b57cec5SDimitry Andric KMP_WARNING(AffNoParam, name, "none"); 23850b57cec5SDimitry Andric } 23860b57cec5SDimitry Andric } break; 23870b57cec5SDimitry Andric case affinity_disabled: { 23880b57cec5SDimitry Andric if (count > 0) { 23890b57cec5SDimitry Andric KMP_WARNING(AffNoParam, name, "disabled"); 23900b57cec5SDimitry Andric } 23910b57cec5SDimitry Andric } break; 23920b57cec5SDimitry Andric case affinity_default: { 23930b57cec5SDimitry Andric if (count > 0) { 23940b57cec5SDimitry Andric KMP_WARNING(AffNoParam, name, "default"); 23950b57cec5SDimitry Andric } 23960b57cec5SDimitry Andric } break; 23970b57cec5SDimitry Andric default: { KMP_ASSERT(0); } 23980b57cec5SDimitry Andric } 23990b57cec5SDimitry Andric } // __kmp_parse_affinity_env 24000b57cec5SDimitry Andric 24010b57cec5SDimitry Andric static void __kmp_stg_parse_affinity(char const *name, char const *value, 24020b57cec5SDimitry Andric void *data) { 24030b57cec5SDimitry Andric kmp_setting_t **rivals = (kmp_setting_t **)data; 24040b57cec5SDimitry Andric int rc; 24050b57cec5SDimitry Andric 24060b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, rivals); 24070b57cec5SDimitry Andric if (rc) { 24080b57cec5SDimitry Andric return; 24090b57cec5SDimitry Andric } 24100b57cec5SDimitry Andric 24110b57cec5SDimitry Andric __kmp_parse_affinity_env(name, value, &__kmp_affinity_type, 24120b57cec5SDimitry Andric &__kmp_affinity_proclist, &__kmp_affinity_verbose, 24130b57cec5SDimitry Andric &__kmp_affinity_warnings, 24140b57cec5SDimitry Andric &__kmp_affinity_respect_mask, &__kmp_affinity_gran, 24150b57cec5SDimitry Andric &__kmp_affinity_gran_levels, &__kmp_affinity_dups, 24160b57cec5SDimitry Andric &__kmp_affinity_compact, &__kmp_affinity_offset); 24170b57cec5SDimitry Andric 24180b57cec5SDimitry Andric } // __kmp_stg_parse_affinity 24190b57cec5SDimitry Andric 24200b57cec5SDimitry Andric static void __kmp_stg_print_affinity(kmp_str_buf_t *buffer, char const *name, 24210b57cec5SDimitry Andric void *data) { 24220b57cec5SDimitry Andric if (__kmp_env_format) { 24230b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 24240b57cec5SDimitry Andric } else { 24250b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", name); 24260b57cec5SDimitry Andric } 24270b57cec5SDimitry Andric if (__kmp_affinity_verbose) { 24280b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,", "verbose"); 24290b57cec5SDimitry Andric } else { 24300b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,", "noverbose"); 24310b57cec5SDimitry Andric } 24320b57cec5SDimitry Andric if (__kmp_affinity_warnings) { 24330b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,", "warnings"); 24340b57cec5SDimitry Andric } else { 24350b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,", "nowarnings"); 24360b57cec5SDimitry Andric } 24370b57cec5SDimitry Andric if (KMP_AFFINITY_CAPABLE()) { 24380b57cec5SDimitry Andric if (__kmp_affinity_respect_mask) { 24390b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,", "respect"); 24400b57cec5SDimitry Andric } else { 24410b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,", "norespect"); 24420b57cec5SDimitry Andric } 24430b57cec5SDimitry Andric switch (__kmp_affinity_gran) { 24440b57cec5SDimitry Andric case affinity_gran_default: 24450b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "granularity=default,"); 24460b57cec5SDimitry Andric break; 24470b57cec5SDimitry Andric case affinity_gran_fine: 24480b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "granularity=fine,"); 24490b57cec5SDimitry Andric break; 24500b57cec5SDimitry Andric case affinity_gran_thread: 24510b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "granularity=thread,"); 24520b57cec5SDimitry Andric break; 24530b57cec5SDimitry Andric case affinity_gran_core: 24540b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "granularity=core,"); 24550b57cec5SDimitry Andric break; 24560b57cec5SDimitry Andric case affinity_gran_package: 24570b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "granularity=package,"); 24580b57cec5SDimitry Andric break; 24590b57cec5SDimitry Andric case affinity_gran_node: 24600b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "granularity=node,"); 24610b57cec5SDimitry Andric break; 24620b57cec5SDimitry Andric #if KMP_GROUP_AFFINITY 24630b57cec5SDimitry Andric case affinity_gran_group: 24640b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "granularity=group,"); 24650b57cec5SDimitry Andric break; 24660b57cec5SDimitry Andric #endif /* KMP_GROUP_AFFINITY */ 24670b57cec5SDimitry Andric } 24680b57cec5SDimitry Andric } 24690b57cec5SDimitry Andric if (!KMP_AFFINITY_CAPABLE()) { 24700b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "disabled"); 24710b57cec5SDimitry Andric } else 24720b57cec5SDimitry Andric switch (__kmp_affinity_type) { 24730b57cec5SDimitry Andric case affinity_none: 24740b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "none"); 24750b57cec5SDimitry Andric break; 24760b57cec5SDimitry Andric case affinity_physical: 24770b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d", "physical", __kmp_affinity_offset); 24780b57cec5SDimitry Andric break; 24790b57cec5SDimitry Andric case affinity_logical: 24800b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d", "logical", __kmp_affinity_offset); 24810b57cec5SDimitry Andric break; 24820b57cec5SDimitry Andric case affinity_compact: 24830b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d,%d", "compact", __kmp_affinity_compact, 24840b57cec5SDimitry Andric __kmp_affinity_offset); 24850b57cec5SDimitry Andric break; 24860b57cec5SDimitry Andric case affinity_scatter: 24870b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d,%d", "scatter", __kmp_affinity_compact, 24880b57cec5SDimitry Andric __kmp_affinity_offset); 24890b57cec5SDimitry Andric break; 24900b57cec5SDimitry Andric case affinity_explicit: 24910b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s=[%s],%s", "proclist", 24920b57cec5SDimitry Andric __kmp_affinity_proclist, "explicit"); 24930b57cec5SDimitry Andric break; 24940b57cec5SDimitry Andric case affinity_balanced: 24950b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d,%d", "balanced", 24960b57cec5SDimitry Andric __kmp_affinity_compact, __kmp_affinity_offset); 24970b57cec5SDimitry Andric break; 24980b57cec5SDimitry Andric case affinity_disabled: 24990b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "disabled"); 25000b57cec5SDimitry Andric break; 25010b57cec5SDimitry Andric case affinity_default: 25020b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "default"); 25030b57cec5SDimitry Andric break; 25040b57cec5SDimitry Andric default: 25050b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "<unknown>"); 25060b57cec5SDimitry Andric break; 25070b57cec5SDimitry Andric } 25080b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "'\n"); 25090b57cec5SDimitry Andric } //__kmp_stg_print_affinity 25100b57cec5SDimitry Andric 25110b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 25120b57cec5SDimitry Andric 25130b57cec5SDimitry Andric static void __kmp_stg_parse_gomp_cpu_affinity(char const *name, 25140b57cec5SDimitry Andric char const *value, void *data) { 25150b57cec5SDimitry Andric const char *next = NULL; 25160b57cec5SDimitry Andric char *temp_proclist; 25170b57cec5SDimitry Andric kmp_setting_t **rivals = (kmp_setting_t **)data; 25180b57cec5SDimitry Andric int rc; 25190b57cec5SDimitry Andric 25200b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, rivals); 25210b57cec5SDimitry Andric if (rc) { 25220b57cec5SDimitry Andric return; 25230b57cec5SDimitry Andric } 25240b57cec5SDimitry Andric 25250b57cec5SDimitry Andric if (TCR_4(__kmp_init_middle)) { 25260b57cec5SDimitry Andric KMP_WARNING(EnvMiddleWarn, name); 25270b57cec5SDimitry Andric __kmp_env_toPrint(name, 0); 25280b57cec5SDimitry Andric return; 25290b57cec5SDimitry Andric } 25300b57cec5SDimitry Andric 25310b57cec5SDimitry Andric __kmp_env_toPrint(name, 1); 25320b57cec5SDimitry Andric 25330b57cec5SDimitry Andric if (__kmp_parse_affinity_proc_id_list(name, value, &next, &temp_proclist)) { 25340b57cec5SDimitry Andric SKIP_WS(next); 25350b57cec5SDimitry Andric if (*next == '\0') { 25360b57cec5SDimitry Andric // GOMP_CPU_AFFINITY => granularity=fine,explicit,proclist=... 25370b57cec5SDimitry Andric __kmp_affinity_proclist = temp_proclist; 25380b57cec5SDimitry Andric __kmp_affinity_type = affinity_explicit; 25390b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_fine; 25400b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 25410b57cec5SDimitry Andric } else { 25420b57cec5SDimitry Andric KMP_WARNING(AffSyntaxError, name); 25430b57cec5SDimitry Andric if (temp_proclist != NULL) { 25440b57cec5SDimitry Andric KMP_INTERNAL_FREE((void *)temp_proclist); 25450b57cec5SDimitry Andric } 25460b57cec5SDimitry Andric } 25470b57cec5SDimitry Andric } else { 25480b57cec5SDimitry Andric // Warning already emitted 25490b57cec5SDimitry Andric __kmp_affinity_type = affinity_none; 25500b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 25510b57cec5SDimitry Andric } 25520b57cec5SDimitry Andric } // __kmp_stg_parse_gomp_cpu_affinity 25530b57cec5SDimitry Andric 25540b57cec5SDimitry Andric #endif /* KMP_GOMP_COMPAT */ 25550b57cec5SDimitry Andric 25560b57cec5SDimitry Andric /*----------------------------------------------------------------------------- 25570b57cec5SDimitry Andric The OMP_PLACES proc id list parser. Here is the grammar: 25580b57cec5SDimitry Andric 25590b57cec5SDimitry Andric place_list := place 25600b57cec5SDimitry Andric place_list := place , place_list 25610b57cec5SDimitry Andric place := num 25620b57cec5SDimitry Andric place := place : num 25630b57cec5SDimitry Andric place := place : num : signed 25640b57cec5SDimitry Andric place := { subplacelist } 25650b57cec5SDimitry Andric place := ! place // (lowest priority) 25660b57cec5SDimitry Andric subplace_list := subplace 25670b57cec5SDimitry Andric subplace_list := subplace , subplace_list 25680b57cec5SDimitry Andric subplace := num 25690b57cec5SDimitry Andric subplace := num : num 25700b57cec5SDimitry Andric subplace := num : num : signed 25710b57cec5SDimitry Andric signed := num 25720b57cec5SDimitry Andric signed := + signed 25730b57cec5SDimitry Andric signed := - signed 25740b57cec5SDimitry Andric -----------------------------------------------------------------------------*/ 25750b57cec5SDimitry Andric 25760b57cec5SDimitry Andric static int __kmp_parse_subplace_list(const char *var, const char **scan) { 25770b57cec5SDimitry Andric const char *next; 25780b57cec5SDimitry Andric 25790b57cec5SDimitry Andric for (;;) { 25800b57cec5SDimitry Andric int start, count, stride; 25810b57cec5SDimitry Andric 25820b57cec5SDimitry Andric // 25830b57cec5SDimitry Andric // Read in the starting proc id 25840b57cec5SDimitry Andric // 25850b57cec5SDimitry Andric SKIP_WS(*scan); 25860b57cec5SDimitry Andric if ((**scan < '0') || (**scan > '9')) { 25870b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 25880b57cec5SDimitry Andric return FALSE; 25890b57cec5SDimitry Andric } 25900b57cec5SDimitry Andric next = *scan; 25910b57cec5SDimitry Andric SKIP_DIGITS(next); 25920b57cec5SDimitry Andric start = __kmp_str_to_int(*scan, *next); 25930b57cec5SDimitry Andric KMP_ASSERT(start >= 0); 25940b57cec5SDimitry Andric *scan = next; 25950b57cec5SDimitry Andric 25960b57cec5SDimitry Andric // valid follow sets are ',' ':' and '}' 25970b57cec5SDimitry Andric SKIP_WS(*scan); 25980b57cec5SDimitry Andric if (**scan == '}') { 25990b57cec5SDimitry Andric break; 26000b57cec5SDimitry Andric } 26010b57cec5SDimitry Andric if (**scan == ',') { 26020b57cec5SDimitry Andric (*scan)++; // skip ',' 26030b57cec5SDimitry Andric continue; 26040b57cec5SDimitry Andric } 26050b57cec5SDimitry Andric if (**scan != ':') { 26060b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 26070b57cec5SDimitry Andric return FALSE; 26080b57cec5SDimitry Andric } 26090b57cec5SDimitry Andric (*scan)++; // skip ':' 26100b57cec5SDimitry Andric 26110b57cec5SDimitry Andric // Read count parameter 26120b57cec5SDimitry Andric SKIP_WS(*scan); 26130b57cec5SDimitry Andric if ((**scan < '0') || (**scan > '9')) { 26140b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 26150b57cec5SDimitry Andric return FALSE; 26160b57cec5SDimitry Andric } 26170b57cec5SDimitry Andric next = *scan; 26180b57cec5SDimitry Andric SKIP_DIGITS(next); 26190b57cec5SDimitry Andric count = __kmp_str_to_int(*scan, *next); 26200b57cec5SDimitry Andric KMP_ASSERT(count >= 0); 26210b57cec5SDimitry Andric *scan = next; 26220b57cec5SDimitry Andric 26230b57cec5SDimitry Andric // valid follow sets are ',' ':' and '}' 26240b57cec5SDimitry Andric SKIP_WS(*scan); 26250b57cec5SDimitry Andric if (**scan == '}') { 26260b57cec5SDimitry Andric break; 26270b57cec5SDimitry Andric } 26280b57cec5SDimitry Andric if (**scan == ',') { 26290b57cec5SDimitry Andric (*scan)++; // skip ',' 26300b57cec5SDimitry Andric continue; 26310b57cec5SDimitry Andric } 26320b57cec5SDimitry Andric if (**scan != ':') { 26330b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 26340b57cec5SDimitry Andric return FALSE; 26350b57cec5SDimitry Andric } 26360b57cec5SDimitry Andric (*scan)++; // skip ':' 26370b57cec5SDimitry Andric 26380b57cec5SDimitry Andric // Read stride parameter 26390b57cec5SDimitry Andric int sign = +1; 26400b57cec5SDimitry Andric for (;;) { 26410b57cec5SDimitry Andric SKIP_WS(*scan); 26420b57cec5SDimitry Andric if (**scan == '+') { 26430b57cec5SDimitry Andric (*scan)++; // skip '+' 26440b57cec5SDimitry Andric continue; 26450b57cec5SDimitry Andric } 26460b57cec5SDimitry Andric if (**scan == '-') { 26470b57cec5SDimitry Andric sign *= -1; 26480b57cec5SDimitry Andric (*scan)++; // skip '-' 26490b57cec5SDimitry Andric continue; 26500b57cec5SDimitry Andric } 26510b57cec5SDimitry Andric break; 26520b57cec5SDimitry Andric } 26530b57cec5SDimitry Andric SKIP_WS(*scan); 26540b57cec5SDimitry Andric if ((**scan < '0') || (**scan > '9')) { 26550b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 26560b57cec5SDimitry Andric return FALSE; 26570b57cec5SDimitry Andric } 26580b57cec5SDimitry Andric next = *scan; 26590b57cec5SDimitry Andric SKIP_DIGITS(next); 26600b57cec5SDimitry Andric stride = __kmp_str_to_int(*scan, *next); 26610b57cec5SDimitry Andric KMP_ASSERT(stride >= 0); 26620b57cec5SDimitry Andric *scan = next; 26630b57cec5SDimitry Andric stride *= sign; 26640b57cec5SDimitry Andric 26650b57cec5SDimitry Andric // valid follow sets are ',' and '}' 26660b57cec5SDimitry Andric SKIP_WS(*scan); 26670b57cec5SDimitry Andric if (**scan == '}') { 26680b57cec5SDimitry Andric break; 26690b57cec5SDimitry Andric } 26700b57cec5SDimitry Andric if (**scan == ',') { 26710b57cec5SDimitry Andric (*scan)++; // skip ',' 26720b57cec5SDimitry Andric continue; 26730b57cec5SDimitry Andric } 26740b57cec5SDimitry Andric 26750b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 26760b57cec5SDimitry Andric return FALSE; 26770b57cec5SDimitry Andric } 26780b57cec5SDimitry Andric return TRUE; 26790b57cec5SDimitry Andric } 26800b57cec5SDimitry Andric 26810b57cec5SDimitry Andric static int __kmp_parse_place(const char *var, const char **scan) { 26820b57cec5SDimitry Andric const char *next; 26830b57cec5SDimitry Andric 26840b57cec5SDimitry Andric // valid follow sets are '{' '!' and num 26850b57cec5SDimitry Andric SKIP_WS(*scan); 26860b57cec5SDimitry Andric if (**scan == '{') { 26870b57cec5SDimitry Andric (*scan)++; // skip '{' 26880b57cec5SDimitry Andric if (!__kmp_parse_subplace_list(var, scan)) { 26890b57cec5SDimitry Andric return FALSE; 26900b57cec5SDimitry Andric } 26910b57cec5SDimitry Andric if (**scan != '}') { 26920b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 26930b57cec5SDimitry Andric return FALSE; 26940b57cec5SDimitry Andric } 26950b57cec5SDimitry Andric (*scan)++; // skip '}' 26960b57cec5SDimitry Andric } else if (**scan == '!') { 26970b57cec5SDimitry Andric (*scan)++; // skip '!' 26980b57cec5SDimitry Andric return __kmp_parse_place(var, scan); //'!' has lower precedence than ':' 26990b57cec5SDimitry Andric } else if ((**scan >= '0') && (**scan <= '9')) { 27000b57cec5SDimitry Andric next = *scan; 27010b57cec5SDimitry Andric SKIP_DIGITS(next); 27020b57cec5SDimitry Andric int proc = __kmp_str_to_int(*scan, *next); 27030b57cec5SDimitry Andric KMP_ASSERT(proc >= 0); 27040b57cec5SDimitry Andric *scan = next; 27050b57cec5SDimitry Andric } else { 27060b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 27070b57cec5SDimitry Andric return FALSE; 27080b57cec5SDimitry Andric } 27090b57cec5SDimitry Andric return TRUE; 27100b57cec5SDimitry Andric } 27110b57cec5SDimitry Andric 27120b57cec5SDimitry Andric static int __kmp_parse_place_list(const char *var, const char *env, 27130b57cec5SDimitry Andric char **place_list) { 27140b57cec5SDimitry Andric const char *scan = env; 27150b57cec5SDimitry Andric const char *next = scan; 27160b57cec5SDimitry Andric 27170b57cec5SDimitry Andric for (;;) { 27180b57cec5SDimitry Andric int count, stride; 27190b57cec5SDimitry Andric 27200b57cec5SDimitry Andric if (!__kmp_parse_place(var, &scan)) { 27210b57cec5SDimitry Andric return FALSE; 27220b57cec5SDimitry Andric } 27230b57cec5SDimitry Andric 27240b57cec5SDimitry Andric // valid follow sets are ',' ':' and EOL 27250b57cec5SDimitry Andric SKIP_WS(scan); 27260b57cec5SDimitry Andric if (*scan == '\0') { 27270b57cec5SDimitry Andric break; 27280b57cec5SDimitry Andric } 27290b57cec5SDimitry Andric if (*scan == ',') { 27300b57cec5SDimitry Andric scan++; // skip ',' 27310b57cec5SDimitry Andric continue; 27320b57cec5SDimitry Andric } 27330b57cec5SDimitry Andric if (*scan != ':') { 27340b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 27350b57cec5SDimitry Andric return FALSE; 27360b57cec5SDimitry Andric } 27370b57cec5SDimitry Andric scan++; // skip ':' 27380b57cec5SDimitry Andric 27390b57cec5SDimitry Andric // Read count parameter 27400b57cec5SDimitry Andric SKIP_WS(scan); 27410b57cec5SDimitry Andric if ((*scan < '0') || (*scan > '9')) { 27420b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 27430b57cec5SDimitry Andric return FALSE; 27440b57cec5SDimitry Andric } 27450b57cec5SDimitry Andric next = scan; 27460b57cec5SDimitry Andric SKIP_DIGITS(next); 27470b57cec5SDimitry Andric count = __kmp_str_to_int(scan, *next); 27480b57cec5SDimitry Andric KMP_ASSERT(count >= 0); 27490b57cec5SDimitry Andric scan = next; 27500b57cec5SDimitry Andric 27510b57cec5SDimitry Andric // valid follow sets are ',' ':' and EOL 27520b57cec5SDimitry Andric SKIP_WS(scan); 27530b57cec5SDimitry Andric if (*scan == '\0') { 27540b57cec5SDimitry Andric break; 27550b57cec5SDimitry Andric } 27560b57cec5SDimitry Andric if (*scan == ',') { 27570b57cec5SDimitry Andric scan++; // skip ',' 27580b57cec5SDimitry Andric continue; 27590b57cec5SDimitry Andric } 27600b57cec5SDimitry Andric if (*scan != ':') { 27610b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 27620b57cec5SDimitry Andric return FALSE; 27630b57cec5SDimitry Andric } 27640b57cec5SDimitry Andric scan++; // skip ':' 27650b57cec5SDimitry Andric 27660b57cec5SDimitry Andric // Read stride parameter 27670b57cec5SDimitry Andric int sign = +1; 27680b57cec5SDimitry Andric for (;;) { 27690b57cec5SDimitry Andric SKIP_WS(scan); 27700b57cec5SDimitry Andric if (*scan == '+') { 27710b57cec5SDimitry Andric scan++; // skip '+' 27720b57cec5SDimitry Andric continue; 27730b57cec5SDimitry Andric } 27740b57cec5SDimitry Andric if (*scan == '-') { 27750b57cec5SDimitry Andric sign *= -1; 27760b57cec5SDimitry Andric scan++; // skip '-' 27770b57cec5SDimitry Andric continue; 27780b57cec5SDimitry Andric } 27790b57cec5SDimitry Andric break; 27800b57cec5SDimitry Andric } 27810b57cec5SDimitry Andric SKIP_WS(scan); 27820b57cec5SDimitry Andric if ((*scan < '0') || (*scan > '9')) { 27830b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 27840b57cec5SDimitry Andric return FALSE; 27850b57cec5SDimitry Andric } 27860b57cec5SDimitry Andric next = scan; 27870b57cec5SDimitry Andric SKIP_DIGITS(next); 27880b57cec5SDimitry Andric stride = __kmp_str_to_int(scan, *next); 27890b57cec5SDimitry Andric KMP_ASSERT(stride >= 0); 27900b57cec5SDimitry Andric scan = next; 27910b57cec5SDimitry Andric stride *= sign; 27920b57cec5SDimitry Andric 27930b57cec5SDimitry Andric // valid follow sets are ',' and EOL 27940b57cec5SDimitry Andric SKIP_WS(scan); 27950b57cec5SDimitry Andric if (*scan == '\0') { 27960b57cec5SDimitry Andric break; 27970b57cec5SDimitry Andric } 27980b57cec5SDimitry Andric if (*scan == ',') { 27990b57cec5SDimitry Andric scan++; // skip ',' 28000b57cec5SDimitry Andric continue; 28010b57cec5SDimitry Andric } 28020b57cec5SDimitry Andric 28030b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, var, "\"threads\""); 28040b57cec5SDimitry Andric return FALSE; 28050b57cec5SDimitry Andric } 28060b57cec5SDimitry Andric 28070b57cec5SDimitry Andric { 2808*e8d8bef9SDimitry Andric ptrdiff_t len = scan - env; 28090b57cec5SDimitry Andric char *retlist = (char *)__kmp_allocate((len + 1) * sizeof(char)); 28100b57cec5SDimitry Andric KMP_MEMCPY_S(retlist, (len + 1) * sizeof(char), env, len * sizeof(char)); 28110b57cec5SDimitry Andric retlist[len] = '\0'; 28120b57cec5SDimitry Andric *place_list = retlist; 28130b57cec5SDimitry Andric } 28140b57cec5SDimitry Andric return TRUE; 28150b57cec5SDimitry Andric } 28160b57cec5SDimitry Andric 28170b57cec5SDimitry Andric static void __kmp_stg_parse_places(char const *name, char const *value, 28180b57cec5SDimitry Andric void *data) { 28190b57cec5SDimitry Andric int count; 28200b57cec5SDimitry Andric const char *scan = value; 28210b57cec5SDimitry Andric const char *next = scan; 28220b57cec5SDimitry Andric const char *kind = "\"threads\""; 28230b57cec5SDimitry Andric kmp_setting_t **rivals = (kmp_setting_t **)data; 28240b57cec5SDimitry Andric int rc; 28250b57cec5SDimitry Andric 28260b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, rivals); 28270b57cec5SDimitry Andric if (rc) { 28280b57cec5SDimitry Andric return; 28290b57cec5SDimitry Andric } 28300b57cec5SDimitry Andric 28310b57cec5SDimitry Andric // If OMP_PROC_BIND is not specified but OMP_PLACES is, 28320b57cec5SDimitry Andric // then let OMP_PROC_BIND default to true. 28330b57cec5SDimitry Andric if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) { 28340b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_true; 28350b57cec5SDimitry Andric } 28360b57cec5SDimitry Andric 28370b57cec5SDimitry Andric //__kmp_affinity_num_places = 0; 28380b57cec5SDimitry Andric 28390b57cec5SDimitry Andric if (__kmp_match_str("threads", scan, &next)) { 28400b57cec5SDimitry Andric scan = next; 28410b57cec5SDimitry Andric __kmp_affinity_type = affinity_compact; 28420b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_thread; 28430b57cec5SDimitry Andric __kmp_affinity_dups = FALSE; 28440b57cec5SDimitry Andric kind = "\"threads\""; 28450b57cec5SDimitry Andric } else if (__kmp_match_str("cores", scan, &next)) { 28460b57cec5SDimitry Andric scan = next; 28470b57cec5SDimitry Andric __kmp_affinity_type = affinity_compact; 28480b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_core; 28490b57cec5SDimitry Andric __kmp_affinity_dups = FALSE; 28500b57cec5SDimitry Andric kind = "\"cores\""; 28510b57cec5SDimitry Andric #if KMP_USE_HWLOC 28520b57cec5SDimitry Andric } else if (__kmp_match_str("tiles", scan, &next)) { 28530b57cec5SDimitry Andric scan = next; 28540b57cec5SDimitry Andric __kmp_affinity_type = affinity_compact; 28550b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_tile; 28560b57cec5SDimitry Andric __kmp_affinity_dups = FALSE; 28570b57cec5SDimitry Andric kind = "\"tiles\""; 28580b57cec5SDimitry Andric #endif 28590b57cec5SDimitry Andric } else if (__kmp_match_str("sockets", scan, &next)) { 28600b57cec5SDimitry Andric scan = next; 28610b57cec5SDimitry Andric __kmp_affinity_type = affinity_compact; 28620b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_package; 28630b57cec5SDimitry Andric __kmp_affinity_dups = FALSE; 28640b57cec5SDimitry Andric kind = "\"sockets\""; 28650b57cec5SDimitry Andric } else { 28660b57cec5SDimitry Andric if (__kmp_affinity_proclist != NULL) { 28670b57cec5SDimitry Andric KMP_INTERNAL_FREE((void *)__kmp_affinity_proclist); 28680b57cec5SDimitry Andric __kmp_affinity_proclist = NULL; 28690b57cec5SDimitry Andric } 28700b57cec5SDimitry Andric if (__kmp_parse_place_list(name, value, &__kmp_affinity_proclist)) { 28710b57cec5SDimitry Andric __kmp_affinity_type = affinity_explicit; 28720b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_fine; 28730b57cec5SDimitry Andric __kmp_affinity_dups = FALSE; 28740b57cec5SDimitry Andric if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) { 28750b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_true; 28760b57cec5SDimitry Andric } 28770b57cec5SDimitry Andric } 28780b57cec5SDimitry Andric return; 28790b57cec5SDimitry Andric } 28800b57cec5SDimitry Andric 28810b57cec5SDimitry Andric if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) { 28820b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_true; 28830b57cec5SDimitry Andric } 28840b57cec5SDimitry Andric 28850b57cec5SDimitry Andric SKIP_WS(scan); 28860b57cec5SDimitry Andric if (*scan == '\0') { 28870b57cec5SDimitry Andric return; 28880b57cec5SDimitry Andric } 28890b57cec5SDimitry Andric 28900b57cec5SDimitry Andric // Parse option count parameter in parentheses 28910b57cec5SDimitry Andric if (*scan != '(') { 28920b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, name, kind); 28930b57cec5SDimitry Andric return; 28940b57cec5SDimitry Andric } 28950b57cec5SDimitry Andric scan++; // skip '(' 28960b57cec5SDimitry Andric 28970b57cec5SDimitry Andric SKIP_WS(scan); 28980b57cec5SDimitry Andric next = scan; 28990b57cec5SDimitry Andric SKIP_DIGITS(next); 29000b57cec5SDimitry Andric count = __kmp_str_to_int(scan, *next); 29010b57cec5SDimitry Andric KMP_ASSERT(count >= 0); 29020b57cec5SDimitry Andric scan = next; 29030b57cec5SDimitry Andric 29040b57cec5SDimitry Andric SKIP_WS(scan); 29050b57cec5SDimitry Andric if (*scan != ')') { 29060b57cec5SDimitry Andric KMP_WARNING(SyntaxErrorUsing, name, kind); 29070b57cec5SDimitry Andric return; 29080b57cec5SDimitry Andric } 29090b57cec5SDimitry Andric scan++; // skip ')' 29100b57cec5SDimitry Andric 29110b57cec5SDimitry Andric SKIP_WS(scan); 29120b57cec5SDimitry Andric if (*scan != '\0') { 29130b57cec5SDimitry Andric KMP_WARNING(ParseExtraCharsWarn, name, scan); 29140b57cec5SDimitry Andric } 29150b57cec5SDimitry Andric __kmp_affinity_num_places = count; 29160b57cec5SDimitry Andric } 29170b57cec5SDimitry Andric 29180b57cec5SDimitry Andric static void __kmp_stg_print_places(kmp_str_buf_t *buffer, char const *name, 29190b57cec5SDimitry Andric void *data) { 29200b57cec5SDimitry Andric if (__kmp_env_format) { 29210b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 29220b57cec5SDimitry Andric } else { 29230b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 29240b57cec5SDimitry Andric } 29250b57cec5SDimitry Andric if ((__kmp_nested_proc_bind.used == 0) || 29260b57cec5SDimitry Andric (__kmp_nested_proc_bind.bind_types == NULL) || 29270b57cec5SDimitry Andric (__kmp_nested_proc_bind.bind_types[0] == proc_bind_false)) { 29280b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 29290b57cec5SDimitry Andric } else if (__kmp_affinity_type == affinity_explicit) { 29300b57cec5SDimitry Andric if (__kmp_affinity_proclist != NULL) { 29310b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='%s'\n", __kmp_affinity_proclist); 29320b57cec5SDimitry Andric } else { 29330b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 29340b57cec5SDimitry Andric } 29350b57cec5SDimitry Andric } else if (__kmp_affinity_type == affinity_compact) { 29360b57cec5SDimitry Andric int num; 29370b57cec5SDimitry Andric if (__kmp_affinity_num_masks > 0) { 29380b57cec5SDimitry Andric num = __kmp_affinity_num_masks; 29390b57cec5SDimitry Andric } else if (__kmp_affinity_num_places > 0) { 29400b57cec5SDimitry Andric num = __kmp_affinity_num_places; 29410b57cec5SDimitry Andric } else { 29420b57cec5SDimitry Andric num = 0; 29430b57cec5SDimitry Andric } 29440b57cec5SDimitry Andric if (__kmp_affinity_gran == affinity_gran_thread) { 29450b57cec5SDimitry Andric if (num > 0) { 29460b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='threads(%d)'\n", num); 29470b57cec5SDimitry Andric } else { 29480b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='threads'\n"); 29490b57cec5SDimitry Andric } 29500b57cec5SDimitry Andric } else if (__kmp_affinity_gran == affinity_gran_core) { 29510b57cec5SDimitry Andric if (num > 0) { 29520b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='cores(%d)' \n", num); 29530b57cec5SDimitry Andric } else { 29540b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='cores'\n"); 29550b57cec5SDimitry Andric } 29560b57cec5SDimitry Andric #if KMP_USE_HWLOC 29570b57cec5SDimitry Andric } else if (__kmp_affinity_gran == affinity_gran_tile) { 29580b57cec5SDimitry Andric if (num > 0) { 29590b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='tiles(%d)' \n", num); 29600b57cec5SDimitry Andric } else { 29610b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='tiles'\n"); 29620b57cec5SDimitry Andric } 29630b57cec5SDimitry Andric #endif 29640b57cec5SDimitry Andric } else if (__kmp_affinity_gran == affinity_gran_package) { 29650b57cec5SDimitry Andric if (num > 0) { 29660b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='sockets(%d)'\n", num); 29670b57cec5SDimitry Andric } else { 29680b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='sockets'\n"); 29690b57cec5SDimitry Andric } 29700b57cec5SDimitry Andric } else { 29710b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 29720b57cec5SDimitry Andric } 29730b57cec5SDimitry Andric } else { 29740b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 29750b57cec5SDimitry Andric } 29760b57cec5SDimitry Andric } 29770b57cec5SDimitry Andric 29780b57cec5SDimitry Andric static void __kmp_stg_parse_topology_method(char const *name, char const *value, 29790b57cec5SDimitry Andric void *data) { 29800b57cec5SDimitry Andric if (__kmp_str_match("all", 1, value)) { 29810b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_all; 29820b57cec5SDimitry Andric } 29830b57cec5SDimitry Andric #if KMP_USE_HWLOC 29840b57cec5SDimitry Andric else if (__kmp_str_match("hwloc", 1, value)) { 29850b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_hwloc; 29860b57cec5SDimitry Andric } 29870b57cec5SDimitry Andric #endif 29880b57cec5SDimitry Andric #if KMP_ARCH_X86 || KMP_ARCH_X86_64 29890b57cec5SDimitry Andric else if (__kmp_str_match("x2apic id", 9, value) || 29900b57cec5SDimitry Andric __kmp_str_match("x2apic_id", 9, value) || 29910b57cec5SDimitry Andric __kmp_str_match("x2apic-id", 9, value) || 29920b57cec5SDimitry Andric __kmp_str_match("x2apicid", 8, value) || 29930b57cec5SDimitry Andric __kmp_str_match("cpuid leaf 11", 13, value) || 29940b57cec5SDimitry Andric __kmp_str_match("cpuid_leaf_11", 13, value) || 29950b57cec5SDimitry Andric __kmp_str_match("cpuid-leaf-11", 13, value) || 29960b57cec5SDimitry Andric __kmp_str_match("cpuid leaf11", 12, value) || 29970b57cec5SDimitry Andric __kmp_str_match("cpuid_leaf11", 12, value) || 29980b57cec5SDimitry Andric __kmp_str_match("cpuid-leaf11", 12, value) || 29990b57cec5SDimitry Andric __kmp_str_match("cpuidleaf 11", 12, value) || 30000b57cec5SDimitry Andric __kmp_str_match("cpuidleaf_11", 12, value) || 30010b57cec5SDimitry Andric __kmp_str_match("cpuidleaf-11", 12, value) || 30020b57cec5SDimitry Andric __kmp_str_match("cpuidleaf11", 11, value) || 30030b57cec5SDimitry Andric __kmp_str_match("cpuid 11", 8, value) || 30040b57cec5SDimitry Andric __kmp_str_match("cpuid_11", 8, value) || 30050b57cec5SDimitry Andric __kmp_str_match("cpuid-11", 8, value) || 30060b57cec5SDimitry Andric __kmp_str_match("cpuid11", 7, value) || 30070b57cec5SDimitry Andric __kmp_str_match("leaf 11", 7, value) || 30080b57cec5SDimitry Andric __kmp_str_match("leaf_11", 7, value) || 30090b57cec5SDimitry Andric __kmp_str_match("leaf-11", 7, value) || 30100b57cec5SDimitry Andric __kmp_str_match("leaf11", 6, value)) { 30110b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_x2apicid; 30120b57cec5SDimitry Andric } else if (__kmp_str_match("apic id", 7, value) || 30130b57cec5SDimitry Andric __kmp_str_match("apic_id", 7, value) || 30140b57cec5SDimitry Andric __kmp_str_match("apic-id", 7, value) || 30150b57cec5SDimitry Andric __kmp_str_match("apicid", 6, value) || 30160b57cec5SDimitry Andric __kmp_str_match("cpuid leaf 4", 12, value) || 30170b57cec5SDimitry Andric __kmp_str_match("cpuid_leaf_4", 12, value) || 30180b57cec5SDimitry Andric __kmp_str_match("cpuid-leaf-4", 12, value) || 30190b57cec5SDimitry Andric __kmp_str_match("cpuid leaf4", 11, value) || 30200b57cec5SDimitry Andric __kmp_str_match("cpuid_leaf4", 11, value) || 30210b57cec5SDimitry Andric __kmp_str_match("cpuid-leaf4", 11, value) || 30220b57cec5SDimitry Andric __kmp_str_match("cpuidleaf 4", 11, value) || 30230b57cec5SDimitry Andric __kmp_str_match("cpuidleaf_4", 11, value) || 30240b57cec5SDimitry Andric __kmp_str_match("cpuidleaf-4", 11, value) || 30250b57cec5SDimitry Andric __kmp_str_match("cpuidleaf4", 10, value) || 30260b57cec5SDimitry Andric __kmp_str_match("cpuid 4", 7, value) || 30270b57cec5SDimitry Andric __kmp_str_match("cpuid_4", 7, value) || 30280b57cec5SDimitry Andric __kmp_str_match("cpuid-4", 7, value) || 30290b57cec5SDimitry Andric __kmp_str_match("cpuid4", 6, value) || 30300b57cec5SDimitry Andric __kmp_str_match("leaf 4", 6, value) || 30310b57cec5SDimitry Andric __kmp_str_match("leaf_4", 6, value) || 30320b57cec5SDimitry Andric __kmp_str_match("leaf-4", 6, value) || 30330b57cec5SDimitry Andric __kmp_str_match("leaf4", 5, value)) { 30340b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_apicid; 30350b57cec5SDimitry Andric } 30360b57cec5SDimitry Andric #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ 30370b57cec5SDimitry Andric else if (__kmp_str_match("/proc/cpuinfo", 2, value) || 30380b57cec5SDimitry Andric __kmp_str_match("cpuinfo", 5, value)) { 30390b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_cpuinfo; 30400b57cec5SDimitry Andric } 30410b57cec5SDimitry Andric #if KMP_GROUP_AFFINITY 30420b57cec5SDimitry Andric else if (__kmp_str_match("group", 1, value)) { 30430b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_group; 30440b57cec5SDimitry Andric } 30450b57cec5SDimitry Andric #endif /* KMP_GROUP_AFFINITY */ 30460b57cec5SDimitry Andric else if (__kmp_str_match("flat", 1, value)) { 30470b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_flat; 30480b57cec5SDimitry Andric } else { 30490b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 30500b57cec5SDimitry Andric } 30510b57cec5SDimitry Andric } // __kmp_stg_parse_topology_method 30520b57cec5SDimitry Andric 30530b57cec5SDimitry Andric static void __kmp_stg_print_topology_method(kmp_str_buf_t *buffer, 30540b57cec5SDimitry Andric char const *name, void *data) { 30550b57cec5SDimitry Andric char const *value = NULL; 30560b57cec5SDimitry Andric 30570b57cec5SDimitry Andric switch (__kmp_affinity_top_method) { 30580b57cec5SDimitry Andric case affinity_top_method_default: 30590b57cec5SDimitry Andric value = "default"; 30600b57cec5SDimitry Andric break; 30610b57cec5SDimitry Andric 30620b57cec5SDimitry Andric case affinity_top_method_all: 30630b57cec5SDimitry Andric value = "all"; 30640b57cec5SDimitry Andric break; 30650b57cec5SDimitry Andric 30660b57cec5SDimitry Andric #if KMP_ARCH_X86 || KMP_ARCH_X86_64 30670b57cec5SDimitry Andric case affinity_top_method_x2apicid: 30680b57cec5SDimitry Andric value = "x2APIC id"; 30690b57cec5SDimitry Andric break; 30700b57cec5SDimitry Andric 30710b57cec5SDimitry Andric case affinity_top_method_apicid: 30720b57cec5SDimitry Andric value = "APIC id"; 30730b57cec5SDimitry Andric break; 30740b57cec5SDimitry Andric #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ 30750b57cec5SDimitry Andric 30760b57cec5SDimitry Andric #if KMP_USE_HWLOC 30770b57cec5SDimitry Andric case affinity_top_method_hwloc: 30780b57cec5SDimitry Andric value = "hwloc"; 30790b57cec5SDimitry Andric break; 30800b57cec5SDimitry Andric #endif 30810b57cec5SDimitry Andric 30820b57cec5SDimitry Andric case affinity_top_method_cpuinfo: 30830b57cec5SDimitry Andric value = "cpuinfo"; 30840b57cec5SDimitry Andric break; 30850b57cec5SDimitry Andric 30860b57cec5SDimitry Andric #if KMP_GROUP_AFFINITY 30870b57cec5SDimitry Andric case affinity_top_method_group: 30880b57cec5SDimitry Andric value = "group"; 30890b57cec5SDimitry Andric break; 30900b57cec5SDimitry Andric #endif /* KMP_GROUP_AFFINITY */ 30910b57cec5SDimitry Andric 30920b57cec5SDimitry Andric case affinity_top_method_flat: 30930b57cec5SDimitry Andric value = "flat"; 30940b57cec5SDimitry Andric break; 30950b57cec5SDimitry Andric } 30960b57cec5SDimitry Andric 30970b57cec5SDimitry Andric if (value != NULL) { 30980b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, value); 30990b57cec5SDimitry Andric } 31000b57cec5SDimitry Andric } // __kmp_stg_print_topology_method 31010b57cec5SDimitry Andric 31020b57cec5SDimitry Andric #endif /* KMP_AFFINITY_SUPPORTED */ 31030b57cec5SDimitry Andric 31040b57cec5SDimitry Andric // OMP_PROC_BIND / bind-var is functional on all 4.0 builds, including OS X* 31050b57cec5SDimitry Andric // OMP_PLACES / place-partition-var is not. 31060b57cec5SDimitry Andric static void __kmp_stg_parse_proc_bind(char const *name, char const *value, 31070b57cec5SDimitry Andric void *data) { 31080b57cec5SDimitry Andric kmp_setting_t **rivals = (kmp_setting_t **)data; 31090b57cec5SDimitry Andric int rc; 31100b57cec5SDimitry Andric 31110b57cec5SDimitry Andric rc = __kmp_stg_check_rivals(name, value, rivals); 31120b57cec5SDimitry Andric if (rc) { 31130b57cec5SDimitry Andric return; 31140b57cec5SDimitry Andric } 31150b57cec5SDimitry Andric 31160b57cec5SDimitry Andric // In OMP 4.0 OMP_PROC_BIND is a vector of proc_bind types. 31170b57cec5SDimitry Andric KMP_DEBUG_ASSERT((__kmp_nested_proc_bind.bind_types != NULL) && 31180b57cec5SDimitry Andric (__kmp_nested_proc_bind.used > 0)); 31190b57cec5SDimitry Andric 31200b57cec5SDimitry Andric const char *buf = value; 31210b57cec5SDimitry Andric const char *next; 31220b57cec5SDimitry Andric int num; 31230b57cec5SDimitry Andric SKIP_WS(buf); 31240b57cec5SDimitry Andric if ((*buf >= '0') && (*buf <= '9')) { 31250b57cec5SDimitry Andric next = buf; 31260b57cec5SDimitry Andric SKIP_DIGITS(next); 31270b57cec5SDimitry Andric num = __kmp_str_to_int(buf, *next); 31280b57cec5SDimitry Andric KMP_ASSERT(num >= 0); 31290b57cec5SDimitry Andric buf = next; 31300b57cec5SDimitry Andric SKIP_WS(buf); 31310b57cec5SDimitry Andric } else { 31320b57cec5SDimitry Andric num = -1; 31330b57cec5SDimitry Andric } 31340b57cec5SDimitry Andric 31350b57cec5SDimitry Andric next = buf; 31360b57cec5SDimitry Andric if (__kmp_match_str("disabled", buf, &next)) { 31370b57cec5SDimitry Andric buf = next; 31380b57cec5SDimitry Andric SKIP_WS(buf); 31390b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 31400b57cec5SDimitry Andric __kmp_affinity_type = affinity_disabled; 31410b57cec5SDimitry Andric #endif /* KMP_AFFINITY_SUPPORTED */ 31420b57cec5SDimitry Andric __kmp_nested_proc_bind.used = 1; 31430b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 31440b57cec5SDimitry Andric } else if ((num == (int)proc_bind_false) || 31450b57cec5SDimitry Andric __kmp_match_str("false", buf, &next)) { 31460b57cec5SDimitry Andric buf = next; 31470b57cec5SDimitry Andric SKIP_WS(buf); 31480b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 31490b57cec5SDimitry Andric __kmp_affinity_type = affinity_none; 31500b57cec5SDimitry Andric #endif /* KMP_AFFINITY_SUPPORTED */ 31510b57cec5SDimitry Andric __kmp_nested_proc_bind.used = 1; 31520b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 31530b57cec5SDimitry Andric } else if ((num == (int)proc_bind_true) || 31540b57cec5SDimitry Andric __kmp_match_str("true", buf, &next)) { 31550b57cec5SDimitry Andric buf = next; 31560b57cec5SDimitry Andric SKIP_WS(buf); 31570b57cec5SDimitry Andric __kmp_nested_proc_bind.used = 1; 31580b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_true; 31590b57cec5SDimitry Andric } else { 31600b57cec5SDimitry Andric // Count the number of values in the env var string 31610b57cec5SDimitry Andric const char *scan; 31620b57cec5SDimitry Andric int nelem = 1; 31630b57cec5SDimitry Andric for (scan = buf; *scan != '\0'; scan++) { 31640b57cec5SDimitry Andric if (*scan == ',') { 31650b57cec5SDimitry Andric nelem++; 31660b57cec5SDimitry Andric } 31670b57cec5SDimitry Andric } 31680b57cec5SDimitry Andric 31690b57cec5SDimitry Andric // Create / expand the nested proc_bind array as needed 31700b57cec5SDimitry Andric if (__kmp_nested_proc_bind.size < nelem) { 31710b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types = 31720b57cec5SDimitry Andric (kmp_proc_bind_t *)KMP_INTERNAL_REALLOC( 31730b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types, 31740b57cec5SDimitry Andric sizeof(kmp_proc_bind_t) * nelem); 31750b57cec5SDimitry Andric if (__kmp_nested_proc_bind.bind_types == NULL) { 31760b57cec5SDimitry Andric KMP_FATAL(MemoryAllocFailed); 31770b57cec5SDimitry Andric } 31780b57cec5SDimitry Andric __kmp_nested_proc_bind.size = nelem; 31790b57cec5SDimitry Andric } 31800b57cec5SDimitry Andric __kmp_nested_proc_bind.used = nelem; 31810b57cec5SDimitry Andric 31820b57cec5SDimitry Andric if (nelem > 1 && !__kmp_dflt_max_active_levels_set) 31830b57cec5SDimitry Andric __kmp_dflt_max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT; 31840b57cec5SDimitry Andric 31850b57cec5SDimitry Andric // Save values in the nested proc_bind array 31860b57cec5SDimitry Andric int i = 0; 31870b57cec5SDimitry Andric for (;;) { 31880b57cec5SDimitry Andric enum kmp_proc_bind_t bind; 31890b57cec5SDimitry Andric 31900b57cec5SDimitry Andric if ((num == (int)proc_bind_master) || 31910b57cec5SDimitry Andric __kmp_match_str("master", buf, &next)) { 31920b57cec5SDimitry Andric buf = next; 31930b57cec5SDimitry Andric SKIP_WS(buf); 31940b57cec5SDimitry Andric bind = proc_bind_master; 31950b57cec5SDimitry Andric } else if ((num == (int)proc_bind_close) || 31960b57cec5SDimitry Andric __kmp_match_str("close", buf, &next)) { 31970b57cec5SDimitry Andric buf = next; 31980b57cec5SDimitry Andric SKIP_WS(buf); 31990b57cec5SDimitry Andric bind = proc_bind_close; 32000b57cec5SDimitry Andric } else if ((num == (int)proc_bind_spread) || 32010b57cec5SDimitry Andric __kmp_match_str("spread", buf, &next)) { 32020b57cec5SDimitry Andric buf = next; 32030b57cec5SDimitry Andric SKIP_WS(buf); 32040b57cec5SDimitry Andric bind = proc_bind_spread; 32050b57cec5SDimitry Andric } else { 32060b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 32070b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 32080b57cec5SDimitry Andric __kmp_nested_proc_bind.used = 1; 32090b57cec5SDimitry Andric return; 32100b57cec5SDimitry Andric } 32110b57cec5SDimitry Andric 32120b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[i++] = bind; 32130b57cec5SDimitry Andric if (i >= nelem) { 32140b57cec5SDimitry Andric break; 32150b57cec5SDimitry Andric } 32160b57cec5SDimitry Andric KMP_DEBUG_ASSERT(*buf == ','); 32170b57cec5SDimitry Andric buf++; 32180b57cec5SDimitry Andric SKIP_WS(buf); 32190b57cec5SDimitry Andric 32200b57cec5SDimitry Andric // Read next value if it was specified as an integer 32210b57cec5SDimitry Andric if ((*buf >= '0') && (*buf <= '9')) { 32220b57cec5SDimitry Andric next = buf; 32230b57cec5SDimitry Andric SKIP_DIGITS(next); 32240b57cec5SDimitry Andric num = __kmp_str_to_int(buf, *next); 32250b57cec5SDimitry Andric KMP_ASSERT(num >= 0); 32260b57cec5SDimitry Andric buf = next; 32270b57cec5SDimitry Andric SKIP_WS(buf); 32280b57cec5SDimitry Andric } else { 32290b57cec5SDimitry Andric num = -1; 32300b57cec5SDimitry Andric } 32310b57cec5SDimitry Andric } 32320b57cec5SDimitry Andric SKIP_WS(buf); 32330b57cec5SDimitry Andric } 32340b57cec5SDimitry Andric if (*buf != '\0') { 32350b57cec5SDimitry Andric KMP_WARNING(ParseExtraCharsWarn, name, buf); 32360b57cec5SDimitry Andric } 32370b57cec5SDimitry Andric } 32380b57cec5SDimitry Andric 32390b57cec5SDimitry Andric static void __kmp_stg_print_proc_bind(kmp_str_buf_t *buffer, char const *name, 32400b57cec5SDimitry Andric void *data) { 32410b57cec5SDimitry Andric int nelem = __kmp_nested_proc_bind.used; 32420b57cec5SDimitry Andric if (__kmp_env_format) { 32430b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 32440b57cec5SDimitry Andric } else { 32450b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 32460b57cec5SDimitry Andric } 32470b57cec5SDimitry Andric if (nelem == 0) { 32480b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 32490b57cec5SDimitry Andric } else { 32500b57cec5SDimitry Andric int i; 32510b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "='", name); 32520b57cec5SDimitry Andric for (i = 0; i < nelem; i++) { 32530b57cec5SDimitry Andric switch (__kmp_nested_proc_bind.bind_types[i]) { 32540b57cec5SDimitry Andric case proc_bind_false: 32550b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "false"); 32560b57cec5SDimitry Andric break; 32570b57cec5SDimitry Andric 32580b57cec5SDimitry Andric case proc_bind_true: 32590b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "true"); 32600b57cec5SDimitry Andric break; 32610b57cec5SDimitry Andric 32620b57cec5SDimitry Andric case proc_bind_master: 32630b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "master"); 32640b57cec5SDimitry Andric break; 32650b57cec5SDimitry Andric 32660b57cec5SDimitry Andric case proc_bind_close: 32670b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "close"); 32680b57cec5SDimitry Andric break; 32690b57cec5SDimitry Andric 32700b57cec5SDimitry Andric case proc_bind_spread: 32710b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "spread"); 32720b57cec5SDimitry Andric break; 32730b57cec5SDimitry Andric 32740b57cec5SDimitry Andric case proc_bind_intel: 32750b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "intel"); 32760b57cec5SDimitry Andric break; 32770b57cec5SDimitry Andric 32780b57cec5SDimitry Andric case proc_bind_default: 32790b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "default"); 32800b57cec5SDimitry Andric break; 32810b57cec5SDimitry Andric } 32820b57cec5SDimitry Andric if (i < nelem - 1) { 32830b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ","); 32840b57cec5SDimitry Andric } 32850b57cec5SDimitry Andric } 32860b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "'\n"); 32870b57cec5SDimitry Andric } 32880b57cec5SDimitry Andric } 32890b57cec5SDimitry Andric 32900b57cec5SDimitry Andric static void __kmp_stg_parse_display_affinity(char const *name, 32910b57cec5SDimitry Andric char const *value, void *data) { 32920b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_display_affinity); 32930b57cec5SDimitry Andric } 32940b57cec5SDimitry Andric static void __kmp_stg_print_display_affinity(kmp_str_buf_t *buffer, 32950b57cec5SDimitry Andric char const *name, void *data) { 32960b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_display_affinity); 32970b57cec5SDimitry Andric } 32980b57cec5SDimitry Andric static void __kmp_stg_parse_affinity_format(char const *name, char const *value, 32990b57cec5SDimitry Andric void *data) { 33000b57cec5SDimitry Andric size_t length = KMP_STRLEN(value); 33010b57cec5SDimitry Andric __kmp_strncpy_truncate(__kmp_affinity_format, KMP_AFFINITY_FORMAT_SIZE, value, 33020b57cec5SDimitry Andric length); 33030b57cec5SDimitry Andric } 33040b57cec5SDimitry Andric static void __kmp_stg_print_affinity_format(kmp_str_buf_t *buffer, 33050b57cec5SDimitry Andric char const *name, void *data) { 33060b57cec5SDimitry Andric if (__kmp_env_format) { 33070b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 33080b57cec5SDimitry Andric } else { 33090b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", name); 33100b57cec5SDimitry Andric } 33110b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", __kmp_affinity_format); 33120b57cec5SDimitry Andric } 3313*e8d8bef9SDimitry Andric 3314*e8d8bef9SDimitry Andric /*----------------------------------------------------------------------------- 3315*e8d8bef9SDimitry Andric OMP_ALLOCATOR sets default allocator. Here is the grammar: 3316*e8d8bef9SDimitry Andric 3317*e8d8bef9SDimitry Andric <allocator> |= <predef-allocator> | <predef-mem-space> | 3318*e8d8bef9SDimitry Andric <predef-mem-space>:<traits> 3319*e8d8bef9SDimitry Andric <traits> |= <trait>=<value> | <trait>=<value>,<traits> 3320*e8d8bef9SDimitry Andric <predef-allocator> |= omp_default_mem_alloc | omp_large_cap_mem_alloc | 3321*e8d8bef9SDimitry Andric omp_const_mem_alloc | omp_high_bw_mem_alloc | 3322*e8d8bef9SDimitry Andric omp_low_lat_mem_alloc | omp_cgroup_mem_alloc | 3323*e8d8bef9SDimitry Andric omp_pteam_mem_alloc | omp_thread_mem_alloc 3324*e8d8bef9SDimitry Andric <predef-mem-space> |= omp_default_mem_space | omp_large_cap_mem_space | 3325*e8d8bef9SDimitry Andric omp_const_mem_space | omp_high_bw_mem_space | 3326*e8d8bef9SDimitry Andric omp_low_lat_mem_space 3327*e8d8bef9SDimitry Andric <trait> |= sync_hint | alignment | access | pool_size | fallback | 3328*e8d8bef9SDimitry Andric fb_data | pinned | partition 3329*e8d8bef9SDimitry Andric <value> |= one of the allowed values of trait | 3330*e8d8bef9SDimitry Andric non-negative integer | <predef-allocator> 3331*e8d8bef9SDimitry Andric -----------------------------------------------------------------------------*/ 3332*e8d8bef9SDimitry Andric 33330b57cec5SDimitry Andric static void __kmp_stg_parse_allocator(char const *name, char const *value, 33340b57cec5SDimitry Andric void *data) { 33350b57cec5SDimitry Andric const char *buf = value; 3336*e8d8bef9SDimitry Andric const char *next, *scan, *start; 3337*e8d8bef9SDimitry Andric char *key; 3338*e8d8bef9SDimitry Andric omp_allocator_handle_t al; 3339*e8d8bef9SDimitry Andric omp_memspace_handle_t ms = omp_default_mem_space; 3340*e8d8bef9SDimitry Andric bool is_memspace = false; 3341*e8d8bef9SDimitry Andric int ntraits = 0, count = 0; 3342*e8d8bef9SDimitry Andric 33430b57cec5SDimitry Andric SKIP_WS(buf); 33440b57cec5SDimitry Andric next = buf; 3345*e8d8bef9SDimitry Andric const char *delim = strchr(buf, ':'); 3346*e8d8bef9SDimitry Andric const char *predef_mem_space = strstr(buf, "mem_space"); 3347*e8d8bef9SDimitry Andric 3348*e8d8bef9SDimitry Andric bool is_memalloc = (!predef_mem_space && !delim) ? true : false; 3349*e8d8bef9SDimitry Andric 3350*e8d8bef9SDimitry Andric // Count the number of traits in the env var string 3351*e8d8bef9SDimitry Andric if (delim) { 3352*e8d8bef9SDimitry Andric ntraits = 1; 3353*e8d8bef9SDimitry Andric for (scan = buf; *scan != '\0'; scan++) { 3354*e8d8bef9SDimitry Andric if (*scan == ',') 3355*e8d8bef9SDimitry Andric ntraits++; 3356*e8d8bef9SDimitry Andric } 3357*e8d8bef9SDimitry Andric } 3358*e8d8bef9SDimitry Andric omp_alloctrait_t traits[ntraits]; 3359*e8d8bef9SDimitry Andric 3360*e8d8bef9SDimitry Andric // Helper macros 3361*e8d8bef9SDimitry Andric #define IS_POWER_OF_TWO(n) (((n) & ((n)-1)) == 0) 3362*e8d8bef9SDimitry Andric 3363*e8d8bef9SDimitry Andric #define GET_NEXT(sentinel) \ 3364*e8d8bef9SDimitry Andric { \ 3365*e8d8bef9SDimitry Andric SKIP_WS(next); \ 3366*e8d8bef9SDimitry Andric if (*next == sentinel) \ 3367*e8d8bef9SDimitry Andric next++; \ 3368*e8d8bef9SDimitry Andric SKIP_WS(next); \ 3369*e8d8bef9SDimitry Andric scan = next; \ 3370*e8d8bef9SDimitry Andric } 3371*e8d8bef9SDimitry Andric 3372*e8d8bef9SDimitry Andric #define SKIP_PAIR(key) \ 3373*e8d8bef9SDimitry Andric { \ 3374*e8d8bef9SDimitry Andric char const str_delimiter[] = {',', 0}; \ 3375*e8d8bef9SDimitry Andric char *value = __kmp_str_token(CCAST(char *, scan), str_delimiter, \ 3376*e8d8bef9SDimitry Andric CCAST(char **, &next)); \ 3377*e8d8bef9SDimitry Andric KMP_WARNING(StgInvalidValue, key, value); \ 3378*e8d8bef9SDimitry Andric ntraits--; \ 3379*e8d8bef9SDimitry Andric SKIP_WS(next); \ 3380*e8d8bef9SDimitry Andric scan = next; \ 3381*e8d8bef9SDimitry Andric } 3382*e8d8bef9SDimitry Andric 3383*e8d8bef9SDimitry Andric #define SET_KEY() \ 3384*e8d8bef9SDimitry Andric { \ 3385*e8d8bef9SDimitry Andric char const str_delimiter[] = {'=', 0}; \ 3386*e8d8bef9SDimitry Andric key = __kmp_str_token(CCAST(char *, start), str_delimiter, \ 3387*e8d8bef9SDimitry Andric CCAST(char **, &next)); \ 3388*e8d8bef9SDimitry Andric scan = next; \ 3389*e8d8bef9SDimitry Andric } 3390*e8d8bef9SDimitry Andric 3391*e8d8bef9SDimitry Andric scan = next; 3392*e8d8bef9SDimitry Andric while (*next != '\0') { 3393*e8d8bef9SDimitry Andric if (is_memalloc || 3394*e8d8bef9SDimitry Andric __kmp_match_str("fb_data", scan, &next)) { // allocator check 3395*e8d8bef9SDimitry Andric start = scan; 3396*e8d8bef9SDimitry Andric GET_NEXT('='); 3397*e8d8bef9SDimitry Andric // check HBW and LCAP first as the only non-default supported 3398*e8d8bef9SDimitry Andric if (__kmp_match_str("omp_high_bw_mem_alloc", scan, &next)) { 3399*e8d8bef9SDimitry Andric SKIP_WS(next); 3400*e8d8bef9SDimitry Andric if (is_memalloc) { 34010b57cec5SDimitry Andric if (__kmp_memkind_available) { 34020b57cec5SDimitry Andric __kmp_def_allocator = omp_high_bw_mem_alloc; 3403*e8d8bef9SDimitry Andric return; 34040b57cec5SDimitry Andric } else { 3405*e8d8bef9SDimitry Andric KMP_WARNING(OmpNoAllocator, "omp_high_bw_mem_alloc"); 34060b57cec5SDimitry Andric } 3407*e8d8bef9SDimitry Andric } else { 3408*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3409*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_high_bw_mem_alloc); 3410*e8d8bef9SDimitry Andric } 3411*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_large_cap_mem_alloc", scan, &next)) { 3412*e8d8bef9SDimitry Andric SKIP_WS(next); 3413*e8d8bef9SDimitry Andric if (is_memalloc) { 3414*e8d8bef9SDimitry Andric if (__kmp_memkind_available) { 3415*e8d8bef9SDimitry Andric __kmp_def_allocator = omp_large_cap_mem_alloc; 3416*e8d8bef9SDimitry Andric return; 3417*e8d8bef9SDimitry Andric } else { 3418*e8d8bef9SDimitry Andric KMP_WARNING(OmpNoAllocator, "omp_large_cap_mem_alloc"); 3419*e8d8bef9SDimitry Andric } 3420*e8d8bef9SDimitry Andric } else { 3421*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3422*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_large_cap_mem_alloc); 3423*e8d8bef9SDimitry Andric } 3424*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_default_mem_alloc", scan, &next)) { 3425*e8d8bef9SDimitry Andric // default requested 3426*e8d8bef9SDimitry Andric SKIP_WS(next); 3427*e8d8bef9SDimitry Andric if (!is_memalloc) { 3428*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3429*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_default_mem_alloc); 3430*e8d8bef9SDimitry Andric } 3431*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_const_mem_alloc", scan, &next)) { 3432*e8d8bef9SDimitry Andric SKIP_WS(next); 3433*e8d8bef9SDimitry Andric if (is_memalloc) { 3434*e8d8bef9SDimitry Andric KMP_WARNING(OmpNoAllocator, "omp_const_mem_alloc"); 3435*e8d8bef9SDimitry Andric } else { 3436*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3437*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_const_mem_alloc); 3438*e8d8bef9SDimitry Andric } 3439*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_low_lat_mem_alloc", scan, &next)) { 3440*e8d8bef9SDimitry Andric SKIP_WS(next); 3441*e8d8bef9SDimitry Andric if (is_memalloc) { 3442*e8d8bef9SDimitry Andric KMP_WARNING(OmpNoAllocator, "omp_low_lat_mem_alloc"); 3443*e8d8bef9SDimitry Andric } else { 3444*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3445*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_low_lat_mem_alloc); 3446*e8d8bef9SDimitry Andric } 3447*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_cgroup_mem_alloc", scan, &next)) { 3448*e8d8bef9SDimitry Andric SKIP_WS(next); 3449*e8d8bef9SDimitry Andric if (is_memalloc) { 3450*e8d8bef9SDimitry Andric KMP_WARNING(OmpNoAllocator, "omp_cgroup_mem_alloc"); 3451*e8d8bef9SDimitry Andric } else { 3452*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3453*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_cgroup_mem_alloc); 3454*e8d8bef9SDimitry Andric } 3455*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_pteam_mem_alloc", scan, &next)) { 3456*e8d8bef9SDimitry Andric SKIP_WS(next); 3457*e8d8bef9SDimitry Andric if (is_memalloc) { 3458*e8d8bef9SDimitry Andric KMP_WARNING(OmpNoAllocator, "omp_pteam_mem_alloc"); 3459*e8d8bef9SDimitry Andric } else { 3460*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3461*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_pteam_mem_alloc); 3462*e8d8bef9SDimitry Andric } 3463*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_thread_mem_alloc", scan, &next)) { 3464*e8d8bef9SDimitry Andric SKIP_WS(next); 3465*e8d8bef9SDimitry Andric if (is_memalloc) { 3466*e8d8bef9SDimitry Andric KMP_WARNING(OmpNoAllocator, "omp_thread_mem_alloc"); 3467*e8d8bef9SDimitry Andric } else { 3468*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fb_data; 3469*e8d8bef9SDimitry Andric traits[count].value = RCAST(omp_uintptr_t, omp_thread_mem_alloc); 3470*e8d8bef9SDimitry Andric } 3471*e8d8bef9SDimitry Andric } else { 3472*e8d8bef9SDimitry Andric if (!is_memalloc) { 3473*e8d8bef9SDimitry Andric SET_KEY(); 3474*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3475*e8d8bef9SDimitry Andric continue; 3476*e8d8bef9SDimitry Andric } 3477*e8d8bef9SDimitry Andric } 3478*e8d8bef9SDimitry Andric if (is_memalloc) { 34790b57cec5SDimitry Andric __kmp_def_allocator = omp_default_mem_alloc; 3480*e8d8bef9SDimitry Andric if (next == buf || *next != '\0') { 3481*e8d8bef9SDimitry Andric // either no match or extra symbols present after the matched token 3482*e8d8bef9SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 3483*e8d8bef9SDimitry Andric } 3484*e8d8bef9SDimitry Andric return; 3485*e8d8bef9SDimitry Andric } else { 3486*e8d8bef9SDimitry Andric ++count; 3487*e8d8bef9SDimitry Andric if (count == ntraits) 34880b57cec5SDimitry Andric break; 3489*e8d8bef9SDimitry Andric GET_NEXT(','); 3490*e8d8bef9SDimitry Andric } 3491*e8d8bef9SDimitry Andric } else { // memspace 3492*e8d8bef9SDimitry Andric if (!is_memspace) { 3493*e8d8bef9SDimitry Andric if (__kmp_match_str("omp_default_mem_space", scan, &next)) { 3494*e8d8bef9SDimitry Andric SKIP_WS(next); 3495*e8d8bef9SDimitry Andric ms = omp_default_mem_space; 3496*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_large_cap_mem_space", scan, &next)) { 3497*e8d8bef9SDimitry Andric SKIP_WS(next); 3498*e8d8bef9SDimitry Andric ms = omp_large_cap_mem_space; 3499*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_const_mem_space", scan, &next)) { 3500*e8d8bef9SDimitry Andric SKIP_WS(next); 3501*e8d8bef9SDimitry Andric ms = omp_const_mem_space; 3502*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_high_bw_mem_space", scan, &next)) { 3503*e8d8bef9SDimitry Andric SKIP_WS(next); 3504*e8d8bef9SDimitry Andric ms = omp_high_bw_mem_space; 3505*e8d8bef9SDimitry Andric } else if (__kmp_match_str("omp_low_lat_mem_space", scan, &next)) { 3506*e8d8bef9SDimitry Andric SKIP_WS(next); 3507*e8d8bef9SDimitry Andric ms = omp_low_lat_mem_space; 3508*e8d8bef9SDimitry Andric } else { 35090b57cec5SDimitry Andric __kmp_def_allocator = omp_default_mem_alloc; 3510*e8d8bef9SDimitry Andric if (next == buf || *next != '\0') { 3511*e8d8bef9SDimitry Andric // either no match or extra symbols present after the matched token 3512*e8d8bef9SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 35130b57cec5SDimitry Andric } 35140b57cec5SDimitry Andric return; 35150b57cec5SDimitry Andric } 3516*e8d8bef9SDimitry Andric is_memspace = true; 3517*e8d8bef9SDimitry Andric } 3518*e8d8bef9SDimitry Andric if (delim) { // traits 3519*e8d8bef9SDimitry Andric GET_NEXT(':'); 3520*e8d8bef9SDimitry Andric start = scan; 3521*e8d8bef9SDimitry Andric if (__kmp_match_str("sync_hint", scan, &next)) { 3522*e8d8bef9SDimitry Andric GET_NEXT('='); 3523*e8d8bef9SDimitry Andric traits[count].key = omp_atk_sync_hint; 3524*e8d8bef9SDimitry Andric if (__kmp_match_str("contended", scan, &next)) { 3525*e8d8bef9SDimitry Andric traits[count].value = omp_atv_contended; 3526*e8d8bef9SDimitry Andric } else if (__kmp_match_str("uncontended", scan, &next)) { 3527*e8d8bef9SDimitry Andric traits[count].value = omp_atv_uncontended; 3528*e8d8bef9SDimitry Andric } else if (__kmp_match_str("serialized", scan, &next)) { 3529*e8d8bef9SDimitry Andric traits[count].value = omp_atv_serialized; 3530*e8d8bef9SDimitry Andric } else if (__kmp_match_str("private", scan, &next)) { 3531*e8d8bef9SDimitry Andric traits[count].value = omp_atv_private; 35320b57cec5SDimitry Andric } else { 3533*e8d8bef9SDimitry Andric SET_KEY(); 3534*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3535*e8d8bef9SDimitry Andric continue; 35360b57cec5SDimitry Andric } 3537*e8d8bef9SDimitry Andric } else if (__kmp_match_str("alignment", scan, &next)) { 3538*e8d8bef9SDimitry Andric GET_NEXT('='); 3539*e8d8bef9SDimitry Andric if (!isdigit(*next)) { 3540*e8d8bef9SDimitry Andric SET_KEY(); 3541*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3542*e8d8bef9SDimitry Andric continue; 35430b57cec5SDimitry Andric } 3544*e8d8bef9SDimitry Andric SKIP_DIGITS(next); 3545*e8d8bef9SDimitry Andric int n = __kmp_str_to_int(scan, ','); 3546*e8d8bef9SDimitry Andric if (n < 0 || !IS_POWER_OF_TWO(n)) { 3547*e8d8bef9SDimitry Andric SET_KEY(); 3548*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3549*e8d8bef9SDimitry Andric continue; 35500b57cec5SDimitry Andric } 3551*e8d8bef9SDimitry Andric traits[count].key = omp_atk_alignment; 3552*e8d8bef9SDimitry Andric traits[count].value = n; 3553*e8d8bef9SDimitry Andric } else if (__kmp_match_str("access", scan, &next)) { 3554*e8d8bef9SDimitry Andric GET_NEXT('='); 3555*e8d8bef9SDimitry Andric traits[count].key = omp_atk_access; 3556*e8d8bef9SDimitry Andric if (__kmp_match_str("all", scan, &next)) { 3557*e8d8bef9SDimitry Andric traits[count].value = omp_atv_all; 3558*e8d8bef9SDimitry Andric } else if (__kmp_match_str("cgroup", scan, &next)) { 3559*e8d8bef9SDimitry Andric traits[count].value = omp_atv_cgroup; 3560*e8d8bef9SDimitry Andric } else if (__kmp_match_str("pteam", scan, &next)) { 3561*e8d8bef9SDimitry Andric traits[count].value = omp_atv_pteam; 3562*e8d8bef9SDimitry Andric } else if (__kmp_match_str("thread", scan, &next)) { 3563*e8d8bef9SDimitry Andric traits[count].value = omp_atv_thread; 3564*e8d8bef9SDimitry Andric } else { 3565*e8d8bef9SDimitry Andric SET_KEY(); 3566*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3567*e8d8bef9SDimitry Andric continue; 3568*e8d8bef9SDimitry Andric } 3569*e8d8bef9SDimitry Andric } else if (__kmp_match_str("pool_size", scan, &next)) { 3570*e8d8bef9SDimitry Andric GET_NEXT('='); 3571*e8d8bef9SDimitry Andric if (!isdigit(*next)) { 3572*e8d8bef9SDimitry Andric SET_KEY(); 3573*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3574*e8d8bef9SDimitry Andric continue; 3575*e8d8bef9SDimitry Andric } 3576*e8d8bef9SDimitry Andric SKIP_DIGITS(next); 3577*e8d8bef9SDimitry Andric int n = __kmp_str_to_int(scan, ','); 3578*e8d8bef9SDimitry Andric if (n < 0) { 3579*e8d8bef9SDimitry Andric SET_KEY(); 3580*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3581*e8d8bef9SDimitry Andric continue; 3582*e8d8bef9SDimitry Andric } 3583*e8d8bef9SDimitry Andric traits[count].key = omp_atk_pool_size; 3584*e8d8bef9SDimitry Andric traits[count].value = n; 3585*e8d8bef9SDimitry Andric } else if (__kmp_match_str("fallback", scan, &next)) { 3586*e8d8bef9SDimitry Andric GET_NEXT('='); 3587*e8d8bef9SDimitry Andric traits[count].key = omp_atk_fallback; 3588*e8d8bef9SDimitry Andric if (__kmp_match_str("default_mem_fb", scan, &next)) { 3589*e8d8bef9SDimitry Andric traits[count].value = omp_atv_default_mem_fb; 3590*e8d8bef9SDimitry Andric } else if (__kmp_match_str("null_fb", scan, &next)) { 3591*e8d8bef9SDimitry Andric traits[count].value = omp_atv_null_fb; 3592*e8d8bef9SDimitry Andric } else if (__kmp_match_str("abort_fb", scan, &next)) { 3593*e8d8bef9SDimitry Andric traits[count].value = omp_atv_abort_fb; 3594*e8d8bef9SDimitry Andric } else if (__kmp_match_str("allocator_fb", scan, &next)) { 3595*e8d8bef9SDimitry Andric traits[count].value = omp_atv_allocator_fb; 3596*e8d8bef9SDimitry Andric } else { 3597*e8d8bef9SDimitry Andric SET_KEY(); 3598*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3599*e8d8bef9SDimitry Andric continue; 3600*e8d8bef9SDimitry Andric } 3601*e8d8bef9SDimitry Andric } else if (__kmp_match_str("pinned", scan, &next)) { 3602*e8d8bef9SDimitry Andric GET_NEXT('='); 3603*e8d8bef9SDimitry Andric traits[count].key = omp_atk_pinned; 3604*e8d8bef9SDimitry Andric if (__kmp_str_match_true(next)) { 3605*e8d8bef9SDimitry Andric traits[count].value = omp_atv_true; 3606*e8d8bef9SDimitry Andric } else if (__kmp_str_match_false(next)) { 3607*e8d8bef9SDimitry Andric traits[count].value = omp_atv_false; 3608*e8d8bef9SDimitry Andric } else { 3609*e8d8bef9SDimitry Andric SET_KEY(); 3610*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3611*e8d8bef9SDimitry Andric continue; 3612*e8d8bef9SDimitry Andric } 3613*e8d8bef9SDimitry Andric } else if (__kmp_match_str("partition", scan, &next)) { 3614*e8d8bef9SDimitry Andric GET_NEXT('='); 3615*e8d8bef9SDimitry Andric traits[count].key = omp_atk_partition; 3616*e8d8bef9SDimitry Andric if (__kmp_match_str("environment", scan, &next)) { 3617*e8d8bef9SDimitry Andric traits[count].value = omp_atv_environment; 3618*e8d8bef9SDimitry Andric } else if (__kmp_match_str("nearest", scan, &next)) { 3619*e8d8bef9SDimitry Andric traits[count].value = omp_atv_nearest; 3620*e8d8bef9SDimitry Andric } else if (__kmp_match_str("blocked", scan, &next)) { 3621*e8d8bef9SDimitry Andric traits[count].value = omp_atv_blocked; 3622*e8d8bef9SDimitry Andric } else if (__kmp_match_str("interleaved", scan, &next)) { 3623*e8d8bef9SDimitry Andric traits[count].value = omp_atv_interleaved; 3624*e8d8bef9SDimitry Andric } else { 3625*e8d8bef9SDimitry Andric SET_KEY(); 3626*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3627*e8d8bef9SDimitry Andric continue; 3628*e8d8bef9SDimitry Andric } 3629*e8d8bef9SDimitry Andric } else { 3630*e8d8bef9SDimitry Andric SET_KEY(); 3631*e8d8bef9SDimitry Andric SKIP_PAIR(key); 3632*e8d8bef9SDimitry Andric continue; 3633*e8d8bef9SDimitry Andric } 3634*e8d8bef9SDimitry Andric SKIP_WS(next); 3635*e8d8bef9SDimitry Andric ++count; 3636*e8d8bef9SDimitry Andric if (count == ntraits) 3637*e8d8bef9SDimitry Andric break; 3638*e8d8bef9SDimitry Andric GET_NEXT(','); 3639*e8d8bef9SDimitry Andric } // traits 3640*e8d8bef9SDimitry Andric } // memspace 3641*e8d8bef9SDimitry Andric } // while 3642*e8d8bef9SDimitry Andric al = __kmpc_init_allocator(__kmp_get_gtid(), ms, ntraits, traits); 3643*e8d8bef9SDimitry Andric __kmp_def_allocator = (al == omp_null_allocator) ? omp_default_mem_alloc : al; 36440b57cec5SDimitry Andric } 36450b57cec5SDimitry Andric 36460b57cec5SDimitry Andric static void __kmp_stg_print_allocator(kmp_str_buf_t *buffer, char const *name, 36470b57cec5SDimitry Andric void *data) { 36480b57cec5SDimitry Andric if (__kmp_def_allocator == omp_default_mem_alloc) { 36490b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_default_mem_alloc"); 36500b57cec5SDimitry Andric } else if (__kmp_def_allocator == omp_high_bw_mem_alloc) { 36510b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_high_bw_mem_alloc"); 36520b57cec5SDimitry Andric } else if (__kmp_def_allocator == omp_large_cap_mem_alloc) { 36530b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_large_cap_mem_alloc"); 36540b57cec5SDimitry Andric } else if (__kmp_def_allocator == omp_const_mem_alloc) { 36550b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_const_mem_alloc"); 36560b57cec5SDimitry Andric } else if (__kmp_def_allocator == omp_low_lat_mem_alloc) { 36570b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_low_lat_mem_alloc"); 36580b57cec5SDimitry Andric } else if (__kmp_def_allocator == omp_cgroup_mem_alloc) { 36590b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_cgroup_mem_alloc"); 36600b57cec5SDimitry Andric } else if (__kmp_def_allocator == omp_pteam_mem_alloc) { 36610b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_pteam_mem_alloc"); 36620b57cec5SDimitry Andric } else if (__kmp_def_allocator == omp_thread_mem_alloc) { 36630b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "omp_thread_mem_alloc"); 36640b57cec5SDimitry Andric } 36650b57cec5SDimitry Andric } 36660b57cec5SDimitry Andric 36670b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 36680b57cec5SDimitry Andric // OMP_DYNAMIC 36690b57cec5SDimitry Andric 36700b57cec5SDimitry Andric static void __kmp_stg_parse_omp_dynamic(char const *name, char const *value, 36710b57cec5SDimitry Andric void *data) { 36720b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &(__kmp_global.g.g_dynamic)); 36730b57cec5SDimitry Andric } // __kmp_stg_parse_omp_dynamic 36740b57cec5SDimitry Andric 36750b57cec5SDimitry Andric static void __kmp_stg_print_omp_dynamic(kmp_str_buf_t *buffer, char const *name, 36760b57cec5SDimitry Andric void *data) { 36770b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_global.g.g_dynamic); 36780b57cec5SDimitry Andric } // __kmp_stg_print_omp_dynamic 36790b57cec5SDimitry Andric 36800b57cec5SDimitry Andric static void __kmp_stg_parse_kmp_dynamic_mode(char const *name, 36810b57cec5SDimitry Andric char const *value, void *data) { 36820b57cec5SDimitry Andric if (TCR_4(__kmp_init_parallel)) { 36830b57cec5SDimitry Andric KMP_WARNING(EnvParallelWarn, name); 36840b57cec5SDimitry Andric __kmp_env_toPrint(name, 0); 36850b57cec5SDimitry Andric return; 36860b57cec5SDimitry Andric } 36870b57cec5SDimitry Andric #ifdef USE_LOAD_BALANCE 36880b57cec5SDimitry Andric else if (__kmp_str_match("load balance", 2, value) || 36890b57cec5SDimitry Andric __kmp_str_match("load_balance", 2, value) || 36900b57cec5SDimitry Andric __kmp_str_match("load-balance", 2, value) || 36910b57cec5SDimitry Andric __kmp_str_match("loadbalance", 2, value) || 36920b57cec5SDimitry Andric __kmp_str_match("balance", 1, value)) { 36930b57cec5SDimitry Andric __kmp_global.g.g_dynamic_mode = dynamic_load_balance; 36940b57cec5SDimitry Andric } 36950b57cec5SDimitry Andric #endif /* USE_LOAD_BALANCE */ 36960b57cec5SDimitry Andric else if (__kmp_str_match("thread limit", 1, value) || 36970b57cec5SDimitry Andric __kmp_str_match("thread_limit", 1, value) || 36980b57cec5SDimitry Andric __kmp_str_match("thread-limit", 1, value) || 36990b57cec5SDimitry Andric __kmp_str_match("threadlimit", 1, value) || 37000b57cec5SDimitry Andric __kmp_str_match("limit", 2, value)) { 37010b57cec5SDimitry Andric __kmp_global.g.g_dynamic_mode = dynamic_thread_limit; 37020b57cec5SDimitry Andric } else if (__kmp_str_match("random", 1, value)) { 37030b57cec5SDimitry Andric __kmp_global.g.g_dynamic_mode = dynamic_random; 37040b57cec5SDimitry Andric } else { 37050b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 37060b57cec5SDimitry Andric } 37070b57cec5SDimitry Andric } //__kmp_stg_parse_kmp_dynamic_mode 37080b57cec5SDimitry Andric 37090b57cec5SDimitry Andric static void __kmp_stg_print_kmp_dynamic_mode(kmp_str_buf_t *buffer, 37100b57cec5SDimitry Andric char const *name, void *data) { 37110b57cec5SDimitry Andric #if KMP_DEBUG 37120b57cec5SDimitry Andric if (__kmp_global.g.g_dynamic_mode == dynamic_default) { 37130b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s: %s \n", name, KMP_I18N_STR(NotDefined)); 37140b57cec5SDimitry Andric } 37150b57cec5SDimitry Andric #ifdef USE_LOAD_BALANCE 37160b57cec5SDimitry Andric else if (__kmp_global.g.g_dynamic_mode == dynamic_load_balance) { 37170b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "load balance"); 37180b57cec5SDimitry Andric } 37190b57cec5SDimitry Andric #endif /* USE_LOAD_BALANCE */ 37200b57cec5SDimitry Andric else if (__kmp_global.g.g_dynamic_mode == dynamic_thread_limit) { 37210b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "thread limit"); 37220b57cec5SDimitry Andric } else if (__kmp_global.g.g_dynamic_mode == dynamic_random) { 37230b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "random"); 37240b57cec5SDimitry Andric } else { 37250b57cec5SDimitry Andric KMP_ASSERT(0); 37260b57cec5SDimitry Andric } 37270b57cec5SDimitry Andric #endif /* KMP_DEBUG */ 37280b57cec5SDimitry Andric } // __kmp_stg_print_kmp_dynamic_mode 37290b57cec5SDimitry Andric 37300b57cec5SDimitry Andric #ifdef USE_LOAD_BALANCE 37310b57cec5SDimitry Andric 37320b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 37330b57cec5SDimitry Andric // KMP_LOAD_BALANCE_INTERVAL 37340b57cec5SDimitry Andric 37350b57cec5SDimitry Andric static void __kmp_stg_parse_ld_balance_interval(char const *name, 37360b57cec5SDimitry Andric char const *value, void *data) { 37370b57cec5SDimitry Andric double interval = __kmp_convert_to_double(value); 37380b57cec5SDimitry Andric if (interval >= 0) { 37390b57cec5SDimitry Andric __kmp_load_balance_interval = interval; 37400b57cec5SDimitry Andric } else { 37410b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 37420b57cec5SDimitry Andric } 37430b57cec5SDimitry Andric } // __kmp_stg_parse_load_balance_interval 37440b57cec5SDimitry Andric 37450b57cec5SDimitry Andric static void __kmp_stg_print_ld_balance_interval(kmp_str_buf_t *buffer, 37460b57cec5SDimitry Andric char const *name, void *data) { 37470b57cec5SDimitry Andric #if KMP_DEBUG 37480b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=%8.6f\n", name, 37490b57cec5SDimitry Andric __kmp_load_balance_interval); 37500b57cec5SDimitry Andric #endif /* KMP_DEBUG */ 37510b57cec5SDimitry Andric } // __kmp_stg_print_load_balance_interval 37520b57cec5SDimitry Andric 37530b57cec5SDimitry Andric #endif /* USE_LOAD_BALANCE */ 37540b57cec5SDimitry Andric 37550b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 37560b57cec5SDimitry Andric // KMP_INIT_AT_FORK 37570b57cec5SDimitry Andric 37580b57cec5SDimitry Andric static void __kmp_stg_parse_init_at_fork(char const *name, char const *value, 37590b57cec5SDimitry Andric void *data) { 37600b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_need_register_atfork); 37610b57cec5SDimitry Andric if (__kmp_need_register_atfork) { 37620b57cec5SDimitry Andric __kmp_need_register_atfork_specified = TRUE; 37630b57cec5SDimitry Andric } 37640b57cec5SDimitry Andric } // __kmp_stg_parse_init_at_fork 37650b57cec5SDimitry Andric 37660b57cec5SDimitry Andric static void __kmp_stg_print_init_at_fork(kmp_str_buf_t *buffer, 37670b57cec5SDimitry Andric char const *name, void *data) { 37680b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_need_register_atfork_specified); 37690b57cec5SDimitry Andric } // __kmp_stg_print_init_at_fork 37700b57cec5SDimitry Andric 37710b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 37720b57cec5SDimitry Andric // KMP_SCHEDULE 37730b57cec5SDimitry Andric 37740b57cec5SDimitry Andric static void __kmp_stg_parse_schedule(char const *name, char const *value, 37750b57cec5SDimitry Andric void *data) { 37760b57cec5SDimitry Andric 37770b57cec5SDimitry Andric if (value != NULL) { 37780b57cec5SDimitry Andric size_t length = KMP_STRLEN(value); 37790b57cec5SDimitry Andric if (length > INT_MAX) { 37800b57cec5SDimitry Andric KMP_WARNING(LongValue, name); 37810b57cec5SDimitry Andric } else { 37820b57cec5SDimitry Andric const char *semicolon; 37830b57cec5SDimitry Andric if (value[length - 1] == '"' || value[length - 1] == '\'') 37840b57cec5SDimitry Andric KMP_WARNING(UnbalancedQuotes, name); 37850b57cec5SDimitry Andric do { 37860b57cec5SDimitry Andric char sentinel; 37870b57cec5SDimitry Andric 37880b57cec5SDimitry Andric semicolon = strchr(value, ';'); 37890b57cec5SDimitry Andric if (*value && semicolon != value) { 37900b57cec5SDimitry Andric const char *comma = strchr(value, ','); 37910b57cec5SDimitry Andric 37920b57cec5SDimitry Andric if (comma) { 37930b57cec5SDimitry Andric ++comma; 37940b57cec5SDimitry Andric sentinel = ','; 37950b57cec5SDimitry Andric } else 37960b57cec5SDimitry Andric sentinel = ';'; 37970b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("static", value, sentinel)) { 37980b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("greedy", comma, ';')) { 37990b57cec5SDimitry Andric __kmp_static = kmp_sch_static_greedy; 38000b57cec5SDimitry Andric continue; 38010b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("balanced", comma, 38020b57cec5SDimitry Andric ';')) { 38030b57cec5SDimitry Andric __kmp_static = kmp_sch_static_balanced; 38040b57cec5SDimitry Andric continue; 38050b57cec5SDimitry Andric } 38060b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("guided", value, 38070b57cec5SDimitry Andric sentinel)) { 38080b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("iterative", comma, ';')) { 38090b57cec5SDimitry Andric __kmp_guided = kmp_sch_guided_iterative_chunked; 38100b57cec5SDimitry Andric continue; 38110b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("analytical", comma, 38120b57cec5SDimitry Andric ';')) { 38130b57cec5SDimitry Andric /* analytical not allowed for too many threads */ 38140b57cec5SDimitry Andric __kmp_guided = kmp_sch_guided_analytical_chunked; 38150b57cec5SDimitry Andric continue; 38160b57cec5SDimitry Andric } 38170b57cec5SDimitry Andric } 38180b57cec5SDimitry Andric KMP_WARNING(InvalidClause, name, value); 38190b57cec5SDimitry Andric } else 38200b57cec5SDimitry Andric KMP_WARNING(EmptyClause, name); 38210b57cec5SDimitry Andric } while ((value = semicolon ? semicolon + 1 : NULL)); 38220b57cec5SDimitry Andric } 38230b57cec5SDimitry Andric } 38240b57cec5SDimitry Andric 38250b57cec5SDimitry Andric } // __kmp_stg_parse__schedule 38260b57cec5SDimitry Andric 38270b57cec5SDimitry Andric static void __kmp_stg_print_schedule(kmp_str_buf_t *buffer, char const *name, 38280b57cec5SDimitry Andric void *data) { 38290b57cec5SDimitry Andric if (__kmp_env_format) { 38300b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 38310b57cec5SDimitry Andric } else { 38320b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", name); 38330b57cec5SDimitry Andric } 38340b57cec5SDimitry Andric if (__kmp_static == kmp_sch_static_greedy) { 38350b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "static,greedy"); 38360b57cec5SDimitry Andric } else if (__kmp_static == kmp_sch_static_balanced) { 38370b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s", "static,balanced"); 38380b57cec5SDimitry Andric } 38390b57cec5SDimitry Andric if (__kmp_guided == kmp_sch_guided_iterative_chunked) { 38400b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ";%s'\n", "guided,iterative"); 38410b57cec5SDimitry Andric } else if (__kmp_guided == kmp_sch_guided_analytical_chunked) { 38420b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ";%s'\n", "guided,analytical"); 38430b57cec5SDimitry Andric } 38440b57cec5SDimitry Andric } // __kmp_stg_print_schedule 38450b57cec5SDimitry Andric 38460b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 38470b57cec5SDimitry Andric // OMP_SCHEDULE 38480b57cec5SDimitry Andric 38490b57cec5SDimitry Andric static inline void __kmp_omp_schedule_restore() { 38500b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 38510b57cec5SDimitry Andric __kmp_hier_scheds.deallocate(); 38520b57cec5SDimitry Andric #endif 38530b57cec5SDimitry Andric __kmp_chunk = 0; 38540b57cec5SDimitry Andric __kmp_sched = kmp_sch_default; 38550b57cec5SDimitry Andric } 38560b57cec5SDimitry Andric 38570b57cec5SDimitry Andric // if parse_hier = true: 38580b57cec5SDimitry Andric // Parse [HW,][modifier:]kind[,chunk] 38590b57cec5SDimitry Andric // else: 38600b57cec5SDimitry Andric // Parse [modifier:]kind[,chunk] 38610b57cec5SDimitry Andric static const char *__kmp_parse_single_omp_schedule(const char *name, 38620b57cec5SDimitry Andric const char *value, 38630b57cec5SDimitry Andric bool parse_hier = false) { 38640b57cec5SDimitry Andric /* get the specified scheduling style */ 38650b57cec5SDimitry Andric const char *ptr = value; 38660b57cec5SDimitry Andric const char *delim; 38670b57cec5SDimitry Andric int chunk = 0; 38680b57cec5SDimitry Andric enum sched_type sched = kmp_sch_default; 38690b57cec5SDimitry Andric if (*ptr == '\0') 38700b57cec5SDimitry Andric return NULL; 38710b57cec5SDimitry Andric delim = ptr; 38720b57cec5SDimitry Andric while (*delim != ',' && *delim != ':' && *delim != '\0') 38730b57cec5SDimitry Andric delim++; 38740b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 38750b57cec5SDimitry Andric kmp_hier_layer_e layer = kmp_hier_layer_e::LAYER_THREAD; 38760b57cec5SDimitry Andric if (parse_hier) { 38770b57cec5SDimitry Andric if (*delim == ',') { 38780b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("L1", ptr, ',')) { 38790b57cec5SDimitry Andric layer = kmp_hier_layer_e::LAYER_L1; 38800b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("L2", ptr, ',')) { 38810b57cec5SDimitry Andric layer = kmp_hier_layer_e::LAYER_L2; 38820b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("L3", ptr, ',')) { 38830b57cec5SDimitry Andric layer = kmp_hier_layer_e::LAYER_L3; 38840b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("NUMA", ptr, ',')) { 38850b57cec5SDimitry Andric layer = kmp_hier_layer_e::LAYER_NUMA; 38860b57cec5SDimitry Andric } 38870b57cec5SDimitry Andric } 38880b57cec5SDimitry Andric if (layer != kmp_hier_layer_e::LAYER_THREAD && *delim != ',') { 38890b57cec5SDimitry Andric // If there is no comma after the layer, then this schedule is invalid 38900b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 38910b57cec5SDimitry Andric __kmp_omp_schedule_restore(); 38920b57cec5SDimitry Andric return NULL; 38930b57cec5SDimitry Andric } else if (layer != kmp_hier_layer_e::LAYER_THREAD) { 38940b57cec5SDimitry Andric ptr = ++delim; 38950b57cec5SDimitry Andric while (*delim != ',' && *delim != ':' && *delim != '\0') 38960b57cec5SDimitry Andric delim++; 38970b57cec5SDimitry Andric } 38980b57cec5SDimitry Andric } 38990b57cec5SDimitry Andric #endif // KMP_USE_HIER_SCHED 39000b57cec5SDimitry Andric // Read in schedule modifier if specified 39010b57cec5SDimitry Andric enum sched_type sched_modifier = (enum sched_type)0; 39020b57cec5SDimitry Andric if (*delim == ':') { 39030b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("monotonic", ptr, *delim)) { 39040b57cec5SDimitry Andric sched_modifier = sched_type::kmp_sch_modifier_monotonic; 39050b57cec5SDimitry Andric ptr = ++delim; 39060b57cec5SDimitry Andric while (*delim != ',' && *delim != ':' && *delim != '\0') 39070b57cec5SDimitry Andric delim++; 39080b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("nonmonotonic", ptr, *delim)) { 39090b57cec5SDimitry Andric sched_modifier = sched_type::kmp_sch_modifier_nonmonotonic; 39100b57cec5SDimitry Andric ptr = ++delim; 39110b57cec5SDimitry Andric while (*delim != ',' && *delim != ':' && *delim != '\0') 39120b57cec5SDimitry Andric delim++; 39130b57cec5SDimitry Andric } else if (!parse_hier) { 39140b57cec5SDimitry Andric // If there is no proper schedule modifier, then this schedule is invalid 39150b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 39160b57cec5SDimitry Andric __kmp_omp_schedule_restore(); 39170b57cec5SDimitry Andric return NULL; 39180b57cec5SDimitry Andric } 39190b57cec5SDimitry Andric } 39200b57cec5SDimitry Andric // Read in schedule kind (required) 39210b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("dynamic", ptr, *delim)) 39220b57cec5SDimitry Andric sched = kmp_sch_dynamic_chunked; 39230b57cec5SDimitry Andric else if (!__kmp_strcasecmp_with_sentinel("guided", ptr, *delim)) 39240b57cec5SDimitry Andric sched = kmp_sch_guided_chunked; 39250b57cec5SDimitry Andric // AC: TODO: probably remove TRAPEZOIDAL (OMP 3.0 does not allow it) 39260b57cec5SDimitry Andric else if (!__kmp_strcasecmp_with_sentinel("auto", ptr, *delim)) 39270b57cec5SDimitry Andric sched = kmp_sch_auto; 39280b57cec5SDimitry Andric else if (!__kmp_strcasecmp_with_sentinel("trapezoidal", ptr, *delim)) 39290b57cec5SDimitry Andric sched = kmp_sch_trapezoidal; 39300b57cec5SDimitry Andric else if (!__kmp_strcasecmp_with_sentinel("static", ptr, *delim)) 39310b57cec5SDimitry Andric sched = kmp_sch_static; 39320b57cec5SDimitry Andric #if KMP_STATIC_STEAL_ENABLED 39330b57cec5SDimitry Andric else if (!__kmp_strcasecmp_with_sentinel("static_steal", ptr, *delim)) 39340b57cec5SDimitry Andric sched = kmp_sch_static_steal; 39350b57cec5SDimitry Andric #endif 39360b57cec5SDimitry Andric else { 39370b57cec5SDimitry Andric // If there is no proper schedule kind, then this schedule is invalid 39380b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 39390b57cec5SDimitry Andric __kmp_omp_schedule_restore(); 39400b57cec5SDimitry Andric return NULL; 39410b57cec5SDimitry Andric } 39420b57cec5SDimitry Andric 39430b57cec5SDimitry Andric // Read in schedule chunk size if specified 39440b57cec5SDimitry Andric if (*delim == ',') { 39450b57cec5SDimitry Andric ptr = delim + 1; 39460b57cec5SDimitry Andric SKIP_WS(ptr); 39470b57cec5SDimitry Andric if (!isdigit(*ptr)) { 39480b57cec5SDimitry Andric // If there is no chunk after comma, then this schedule is invalid 39490b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 39500b57cec5SDimitry Andric __kmp_omp_schedule_restore(); 39510b57cec5SDimitry Andric return NULL; 39520b57cec5SDimitry Andric } 39530b57cec5SDimitry Andric SKIP_DIGITS(ptr); 39540b57cec5SDimitry Andric // auto schedule should not specify chunk size 39550b57cec5SDimitry Andric if (sched == kmp_sch_auto) { 39560b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(IgnoreChunk, name, delim), 39570b57cec5SDimitry Andric __kmp_msg_null); 39580b57cec5SDimitry Andric } else { 39590b57cec5SDimitry Andric if (sched == kmp_sch_static) 39600b57cec5SDimitry Andric sched = kmp_sch_static_chunked; 39610b57cec5SDimitry Andric chunk = __kmp_str_to_int(delim + 1, *ptr); 39620b57cec5SDimitry Andric if (chunk < 1) { 39630b57cec5SDimitry Andric chunk = KMP_DEFAULT_CHUNK; 39640b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(InvalidChunk, name, delim), 39650b57cec5SDimitry Andric __kmp_msg_null); 39660b57cec5SDimitry Andric KMP_INFORM(Using_int_Value, name, __kmp_chunk); 39670b57cec5SDimitry Andric // AC: next block commented out until KMP_DEFAULT_CHUNK != KMP_MIN_CHUNK 39680b57cec5SDimitry Andric // (to improve code coverage :) 39690b57cec5SDimitry Andric // The default chunk size is 1 according to standard, thus making 39700b57cec5SDimitry Andric // KMP_MIN_CHUNK not 1 we would introduce mess: 39710b57cec5SDimitry Andric // wrong chunk becomes 1, but it will be impossible to explicitly set 39720b57cec5SDimitry Andric // to 1 because it becomes KMP_MIN_CHUNK... 39730b57cec5SDimitry Andric // } else if ( chunk < KMP_MIN_CHUNK ) { 39740b57cec5SDimitry Andric // chunk = KMP_MIN_CHUNK; 39750b57cec5SDimitry Andric } else if (chunk > KMP_MAX_CHUNK) { 39760b57cec5SDimitry Andric chunk = KMP_MAX_CHUNK; 39770b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(LargeChunk, name, delim), 39780b57cec5SDimitry Andric __kmp_msg_null); 39790b57cec5SDimitry Andric KMP_INFORM(Using_int_Value, name, chunk); 39800b57cec5SDimitry Andric } 39810b57cec5SDimitry Andric } 39820b57cec5SDimitry Andric } else { 39830b57cec5SDimitry Andric ptr = delim; 39840b57cec5SDimitry Andric } 39850b57cec5SDimitry Andric 39860b57cec5SDimitry Andric SCHEDULE_SET_MODIFIERS(sched, sched_modifier); 39870b57cec5SDimitry Andric 39880b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 39890b57cec5SDimitry Andric if (layer != kmp_hier_layer_e::LAYER_THREAD) { 39900b57cec5SDimitry Andric __kmp_hier_scheds.append(sched, chunk, layer); 39910b57cec5SDimitry Andric } else 39920b57cec5SDimitry Andric #endif 39930b57cec5SDimitry Andric { 39940b57cec5SDimitry Andric __kmp_chunk = chunk; 39950b57cec5SDimitry Andric __kmp_sched = sched; 39960b57cec5SDimitry Andric } 39970b57cec5SDimitry Andric return ptr; 39980b57cec5SDimitry Andric } 39990b57cec5SDimitry Andric 40000b57cec5SDimitry Andric static void __kmp_stg_parse_omp_schedule(char const *name, char const *value, 40010b57cec5SDimitry Andric void *data) { 40020b57cec5SDimitry Andric size_t length; 40030b57cec5SDimitry Andric const char *ptr = value; 40040b57cec5SDimitry Andric SKIP_WS(ptr); 40050b57cec5SDimitry Andric if (value) { 40060b57cec5SDimitry Andric length = KMP_STRLEN(value); 40070b57cec5SDimitry Andric if (length) { 40080b57cec5SDimitry Andric if (value[length - 1] == '"' || value[length - 1] == '\'') 40090b57cec5SDimitry Andric KMP_WARNING(UnbalancedQuotes, name); 40100b57cec5SDimitry Andric /* get the specified scheduling style */ 40110b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 40120b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("EXPERIMENTAL", ptr, ' ')) { 40130b57cec5SDimitry Andric SKIP_TOKEN(ptr); 40140b57cec5SDimitry Andric SKIP_WS(ptr); 40150b57cec5SDimitry Andric while ((ptr = __kmp_parse_single_omp_schedule(name, ptr, true))) { 40160b57cec5SDimitry Andric while (*ptr == ' ' || *ptr == '\t' || *ptr == ':') 40170b57cec5SDimitry Andric ptr++; 40180b57cec5SDimitry Andric if (*ptr == '\0') 40190b57cec5SDimitry Andric break; 40200b57cec5SDimitry Andric } 40210b57cec5SDimitry Andric } else 40220b57cec5SDimitry Andric #endif 40230b57cec5SDimitry Andric __kmp_parse_single_omp_schedule(name, ptr); 40240b57cec5SDimitry Andric } else 40250b57cec5SDimitry Andric KMP_WARNING(EmptyString, name); 40260b57cec5SDimitry Andric } 40270b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 40280b57cec5SDimitry Andric __kmp_hier_scheds.sort(); 40290b57cec5SDimitry Andric #endif 40300b57cec5SDimitry Andric K_DIAG(1, ("__kmp_static == %d\n", __kmp_static)) 40310b57cec5SDimitry Andric K_DIAG(1, ("__kmp_guided == %d\n", __kmp_guided)) 40320b57cec5SDimitry Andric K_DIAG(1, ("__kmp_sched == %d\n", __kmp_sched)) 40330b57cec5SDimitry Andric K_DIAG(1, ("__kmp_chunk == %d\n", __kmp_chunk)) 40340b57cec5SDimitry Andric } // __kmp_stg_parse_omp_schedule 40350b57cec5SDimitry Andric 40360b57cec5SDimitry Andric static void __kmp_stg_print_omp_schedule(kmp_str_buf_t *buffer, 40370b57cec5SDimitry Andric char const *name, void *data) { 40380b57cec5SDimitry Andric if (__kmp_env_format) { 40390b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 40400b57cec5SDimitry Andric } else { 40410b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", name); 40420b57cec5SDimitry Andric } 40430b57cec5SDimitry Andric enum sched_type sched = SCHEDULE_WITHOUT_MODIFIERS(__kmp_sched); 40440b57cec5SDimitry Andric if (SCHEDULE_HAS_MONOTONIC(__kmp_sched)) { 40450b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "monotonic:"); 40460b57cec5SDimitry Andric } else if (SCHEDULE_HAS_NONMONOTONIC(__kmp_sched)) { 40470b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "nonmonotonic:"); 40480b57cec5SDimitry Andric } 40490b57cec5SDimitry Andric if (__kmp_chunk) { 40500b57cec5SDimitry Andric switch (sched) { 40510b57cec5SDimitry Andric case kmp_sch_dynamic_chunked: 40520b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d'\n", "dynamic", __kmp_chunk); 40530b57cec5SDimitry Andric break; 40540b57cec5SDimitry Andric case kmp_sch_guided_iterative_chunked: 40550b57cec5SDimitry Andric case kmp_sch_guided_analytical_chunked: 40560b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d'\n", "guided", __kmp_chunk); 40570b57cec5SDimitry Andric break; 40580b57cec5SDimitry Andric case kmp_sch_trapezoidal: 40590b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d'\n", "trapezoidal", __kmp_chunk); 40600b57cec5SDimitry Andric break; 40610b57cec5SDimitry Andric case kmp_sch_static: 40620b57cec5SDimitry Andric case kmp_sch_static_chunked: 40630b57cec5SDimitry Andric case kmp_sch_static_balanced: 40640b57cec5SDimitry Andric case kmp_sch_static_greedy: 40650b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d'\n", "static", __kmp_chunk); 40660b57cec5SDimitry Andric break; 40670b57cec5SDimitry Andric case kmp_sch_static_steal: 40680b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d'\n", "static_steal", __kmp_chunk); 40690b57cec5SDimitry Andric break; 40700b57cec5SDimitry Andric case kmp_sch_auto: 40710b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s,%d'\n", "auto", __kmp_chunk); 40720b57cec5SDimitry Andric break; 40730b57cec5SDimitry Andric } 40740b57cec5SDimitry Andric } else { 40750b57cec5SDimitry Andric switch (sched) { 40760b57cec5SDimitry Andric case kmp_sch_dynamic_chunked: 40770b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", "dynamic"); 40780b57cec5SDimitry Andric break; 40790b57cec5SDimitry Andric case kmp_sch_guided_iterative_chunked: 40800b57cec5SDimitry Andric case kmp_sch_guided_analytical_chunked: 40810b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", "guided"); 40820b57cec5SDimitry Andric break; 40830b57cec5SDimitry Andric case kmp_sch_trapezoidal: 40840b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", "trapezoidal"); 40850b57cec5SDimitry Andric break; 40860b57cec5SDimitry Andric case kmp_sch_static: 40870b57cec5SDimitry Andric case kmp_sch_static_chunked: 40880b57cec5SDimitry Andric case kmp_sch_static_balanced: 40890b57cec5SDimitry Andric case kmp_sch_static_greedy: 40900b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", "static"); 40910b57cec5SDimitry Andric break; 40920b57cec5SDimitry Andric case kmp_sch_static_steal: 40930b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", "static_steal"); 40940b57cec5SDimitry Andric break; 40950b57cec5SDimitry Andric case kmp_sch_auto: 40960b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", "auto"); 40970b57cec5SDimitry Andric break; 40980b57cec5SDimitry Andric } 40990b57cec5SDimitry Andric } 41000b57cec5SDimitry Andric } // __kmp_stg_print_omp_schedule 41010b57cec5SDimitry Andric 41020b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 41030b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 41040b57cec5SDimitry Andric // KMP_DISP_HAND_THREAD 41050b57cec5SDimitry Andric static void __kmp_stg_parse_kmp_hand_thread(char const *name, char const *value, 41060b57cec5SDimitry Andric void *data) { 41070b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &(__kmp_dispatch_hand_threading)); 41080b57cec5SDimitry Andric } // __kmp_stg_parse_kmp_hand_thread 41090b57cec5SDimitry Andric 41100b57cec5SDimitry Andric static void __kmp_stg_print_kmp_hand_thread(kmp_str_buf_t *buffer, 41110b57cec5SDimitry Andric char const *name, void *data) { 41120b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_dispatch_hand_threading); 41130b57cec5SDimitry Andric } // __kmp_stg_print_kmp_hand_thread 41140b57cec5SDimitry Andric #endif 41150b57cec5SDimitry Andric 41160b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 41170b57cec5SDimitry Andric // KMP_ATOMIC_MODE 41180b57cec5SDimitry Andric 41190b57cec5SDimitry Andric static void __kmp_stg_parse_atomic_mode(char const *name, char const *value, 41200b57cec5SDimitry Andric void *data) { 41210b57cec5SDimitry Andric // Modes: 0 -- do not change default; 1 -- Intel perf mode, 2 -- GOMP 41220b57cec5SDimitry Andric // compatibility mode. 41230b57cec5SDimitry Andric int mode = 0; 41240b57cec5SDimitry Andric int max = 1; 41250b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 41260b57cec5SDimitry Andric max = 2; 41270b57cec5SDimitry Andric #endif /* KMP_GOMP_COMPAT */ 41280b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, max, &mode); 41290b57cec5SDimitry Andric // TODO; parse_int is not very suitable for this case. In case of overflow it 41300b57cec5SDimitry Andric // is better to use 41310b57cec5SDimitry Andric // 0 rather that max value. 41320b57cec5SDimitry Andric if (mode > 0) { 41330b57cec5SDimitry Andric __kmp_atomic_mode = mode; 41340b57cec5SDimitry Andric } 41350b57cec5SDimitry Andric } // __kmp_stg_parse_atomic_mode 41360b57cec5SDimitry Andric 41370b57cec5SDimitry Andric static void __kmp_stg_print_atomic_mode(kmp_str_buf_t *buffer, char const *name, 41380b57cec5SDimitry Andric void *data) { 41390b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_atomic_mode); 41400b57cec5SDimitry Andric } // __kmp_stg_print_atomic_mode 41410b57cec5SDimitry Andric 41420b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 41430b57cec5SDimitry Andric // KMP_CONSISTENCY_CHECK 41440b57cec5SDimitry Andric 41450b57cec5SDimitry Andric static void __kmp_stg_parse_consistency_check(char const *name, 41460b57cec5SDimitry Andric char const *value, void *data) { 41470b57cec5SDimitry Andric if (!__kmp_strcasecmp_with_sentinel("all", value, 0)) { 41480b57cec5SDimitry Andric // Note, this will not work from kmp_set_defaults because th_cons stack was 41490b57cec5SDimitry Andric // not allocated 41500b57cec5SDimitry Andric // for existed thread(s) thus the first __kmp_push_<construct> will break 41510b57cec5SDimitry Andric // with assertion. 41520b57cec5SDimitry Andric // TODO: allocate th_cons if called from kmp_set_defaults. 41530b57cec5SDimitry Andric __kmp_env_consistency_check = TRUE; 41540b57cec5SDimitry Andric } else if (!__kmp_strcasecmp_with_sentinel("none", value, 0)) { 41550b57cec5SDimitry Andric __kmp_env_consistency_check = FALSE; 41560b57cec5SDimitry Andric } else { 41570b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 41580b57cec5SDimitry Andric } 41590b57cec5SDimitry Andric } // __kmp_stg_parse_consistency_check 41600b57cec5SDimitry Andric 41610b57cec5SDimitry Andric static void __kmp_stg_print_consistency_check(kmp_str_buf_t *buffer, 41620b57cec5SDimitry Andric char const *name, void *data) { 41630b57cec5SDimitry Andric #if KMP_DEBUG 41640b57cec5SDimitry Andric const char *value = NULL; 41650b57cec5SDimitry Andric 41660b57cec5SDimitry Andric if (__kmp_env_consistency_check) { 41670b57cec5SDimitry Andric value = "all"; 41680b57cec5SDimitry Andric } else { 41690b57cec5SDimitry Andric value = "none"; 41700b57cec5SDimitry Andric } 41710b57cec5SDimitry Andric 41720b57cec5SDimitry Andric if (value != NULL) { 41730b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, value); 41740b57cec5SDimitry Andric } 41750b57cec5SDimitry Andric #endif /* KMP_DEBUG */ 41760b57cec5SDimitry Andric } // __kmp_stg_print_consistency_check 41770b57cec5SDimitry Andric 41780b57cec5SDimitry Andric #if USE_ITT_BUILD 41790b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 41800b57cec5SDimitry Andric // KMP_ITT_PREPARE_DELAY 41810b57cec5SDimitry Andric 41820b57cec5SDimitry Andric #if USE_ITT_NOTIFY 41830b57cec5SDimitry Andric 41840b57cec5SDimitry Andric static void __kmp_stg_parse_itt_prepare_delay(char const *name, 41850b57cec5SDimitry Andric char const *value, void *data) { 41860b57cec5SDimitry Andric // Experimental code: KMP_ITT_PREPARE_DELAY specifies numbert of loop 41870b57cec5SDimitry Andric // iterations. 41880b57cec5SDimitry Andric int delay = 0; 41890b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, INT_MAX, &delay); 41900b57cec5SDimitry Andric __kmp_itt_prepare_delay = delay; 41910b57cec5SDimitry Andric } // __kmp_str_parse_itt_prepare_delay 41920b57cec5SDimitry Andric 41930b57cec5SDimitry Andric static void __kmp_stg_print_itt_prepare_delay(kmp_str_buf_t *buffer, 41940b57cec5SDimitry Andric char const *name, void *data) { 41950b57cec5SDimitry Andric __kmp_stg_print_uint64(buffer, name, __kmp_itt_prepare_delay); 41960b57cec5SDimitry Andric 41970b57cec5SDimitry Andric } // __kmp_str_print_itt_prepare_delay 41980b57cec5SDimitry Andric 41990b57cec5SDimitry Andric #endif // USE_ITT_NOTIFY 42000b57cec5SDimitry Andric #endif /* USE_ITT_BUILD */ 42010b57cec5SDimitry Andric 42020b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 42030b57cec5SDimitry Andric // KMP_MALLOC_POOL_INCR 42040b57cec5SDimitry Andric 42050b57cec5SDimitry Andric static void __kmp_stg_parse_malloc_pool_incr(char const *name, 42060b57cec5SDimitry Andric char const *value, void *data) { 42070b57cec5SDimitry Andric __kmp_stg_parse_size(name, value, KMP_MIN_MALLOC_POOL_INCR, 42080b57cec5SDimitry Andric KMP_MAX_MALLOC_POOL_INCR, NULL, &__kmp_malloc_pool_incr, 42090b57cec5SDimitry Andric 1); 42100b57cec5SDimitry Andric } // __kmp_stg_parse_malloc_pool_incr 42110b57cec5SDimitry Andric 42120b57cec5SDimitry Andric static void __kmp_stg_print_malloc_pool_incr(kmp_str_buf_t *buffer, 42130b57cec5SDimitry Andric char const *name, void *data) { 42140b57cec5SDimitry Andric __kmp_stg_print_size(buffer, name, __kmp_malloc_pool_incr); 42150b57cec5SDimitry Andric 42160b57cec5SDimitry Andric } // _kmp_stg_print_malloc_pool_incr 42170b57cec5SDimitry Andric 42180b57cec5SDimitry Andric #ifdef KMP_DEBUG 42190b57cec5SDimitry Andric 42200b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 42210b57cec5SDimitry Andric // KMP_PAR_RANGE 42220b57cec5SDimitry Andric 42230b57cec5SDimitry Andric static void __kmp_stg_parse_par_range_env(char const *name, char const *value, 42240b57cec5SDimitry Andric void *data) { 42250b57cec5SDimitry Andric __kmp_stg_parse_par_range(name, value, &__kmp_par_range, 42260b57cec5SDimitry Andric __kmp_par_range_routine, __kmp_par_range_filename, 42270b57cec5SDimitry Andric &__kmp_par_range_lb, &__kmp_par_range_ub); 42280b57cec5SDimitry Andric } // __kmp_stg_parse_par_range_env 42290b57cec5SDimitry Andric 42300b57cec5SDimitry Andric static void __kmp_stg_print_par_range_env(kmp_str_buf_t *buffer, 42310b57cec5SDimitry Andric char const *name, void *data) { 42320b57cec5SDimitry Andric if (__kmp_par_range != 0) { 42330b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, par_range_to_print); 42340b57cec5SDimitry Andric } 42350b57cec5SDimitry Andric } // __kmp_stg_print_par_range_env 42360b57cec5SDimitry Andric 42370b57cec5SDimitry Andric #endif 42380b57cec5SDimitry Andric 42390b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 42400b57cec5SDimitry Andric // KMP_GTID_MODE 42410b57cec5SDimitry Andric 42420b57cec5SDimitry Andric static void __kmp_stg_parse_gtid_mode(char const *name, char const *value, 42430b57cec5SDimitry Andric void *data) { 42440b57cec5SDimitry Andric // Modes: 42450b57cec5SDimitry Andric // 0 -- do not change default 42460b57cec5SDimitry Andric // 1 -- sp search 42470b57cec5SDimitry Andric // 2 -- use "keyed" TLS var, i.e. 42480b57cec5SDimitry Andric // pthread_getspecific(Linux* OS/OS X*) or TlsGetValue(Windows* OS) 42490b57cec5SDimitry Andric // 3 -- __declspec(thread) TLS var in tdata section 42500b57cec5SDimitry Andric int mode = 0; 42510b57cec5SDimitry Andric int max = 2; 42520b57cec5SDimitry Andric #ifdef KMP_TDATA_GTID 42530b57cec5SDimitry Andric max = 3; 42540b57cec5SDimitry Andric #endif /* KMP_TDATA_GTID */ 42550b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, max, &mode); 42560b57cec5SDimitry Andric // TODO; parse_int is not very suitable for this case. In case of overflow it 42570b57cec5SDimitry Andric // is better to use 0 rather that max value. 42580b57cec5SDimitry Andric if (mode == 0) { 42590b57cec5SDimitry Andric __kmp_adjust_gtid_mode = TRUE; 42600b57cec5SDimitry Andric } else { 42610b57cec5SDimitry Andric __kmp_gtid_mode = mode; 42620b57cec5SDimitry Andric __kmp_adjust_gtid_mode = FALSE; 42630b57cec5SDimitry Andric } 42640b57cec5SDimitry Andric } // __kmp_str_parse_gtid_mode 42650b57cec5SDimitry Andric 42660b57cec5SDimitry Andric static void __kmp_stg_print_gtid_mode(kmp_str_buf_t *buffer, char const *name, 42670b57cec5SDimitry Andric void *data) { 42680b57cec5SDimitry Andric if (__kmp_adjust_gtid_mode) { 42690b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, 0); 42700b57cec5SDimitry Andric } else { 42710b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_gtid_mode); 42720b57cec5SDimitry Andric } 42730b57cec5SDimitry Andric } // __kmp_stg_print_gtid_mode 42740b57cec5SDimitry Andric 42750b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 42760b57cec5SDimitry Andric // KMP_NUM_LOCKS_IN_BLOCK 42770b57cec5SDimitry Andric 42780b57cec5SDimitry Andric static void __kmp_stg_parse_lock_block(char const *name, char const *value, 42790b57cec5SDimitry Andric void *data) { 42800b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, KMP_INT_MAX, &__kmp_num_locks_in_block); 42810b57cec5SDimitry Andric } // __kmp_str_parse_lock_block 42820b57cec5SDimitry Andric 42830b57cec5SDimitry Andric static void __kmp_stg_print_lock_block(kmp_str_buf_t *buffer, char const *name, 42840b57cec5SDimitry Andric void *data) { 42850b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_num_locks_in_block); 42860b57cec5SDimitry Andric } // __kmp_stg_print_lock_block 42870b57cec5SDimitry Andric 42880b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 42890b57cec5SDimitry Andric // KMP_LOCK_KIND 42900b57cec5SDimitry Andric 42910b57cec5SDimitry Andric #if KMP_USE_DYNAMIC_LOCK 42920b57cec5SDimitry Andric #define KMP_STORE_LOCK_SEQ(a) (__kmp_user_lock_seq = lockseq_##a) 42930b57cec5SDimitry Andric #else 42940b57cec5SDimitry Andric #define KMP_STORE_LOCK_SEQ(a) 42950b57cec5SDimitry Andric #endif 42960b57cec5SDimitry Andric 42970b57cec5SDimitry Andric static void __kmp_stg_parse_lock_kind(char const *name, char const *value, 42980b57cec5SDimitry Andric void *data) { 42990b57cec5SDimitry Andric if (__kmp_init_user_locks) { 43000b57cec5SDimitry Andric KMP_WARNING(EnvLockWarn, name); 43010b57cec5SDimitry Andric return; 43020b57cec5SDimitry Andric } 43030b57cec5SDimitry Andric 43040b57cec5SDimitry Andric if (__kmp_str_match("tas", 2, value) || 43050b57cec5SDimitry Andric __kmp_str_match("test and set", 2, value) || 43060b57cec5SDimitry Andric __kmp_str_match("test_and_set", 2, value) || 43070b57cec5SDimitry Andric __kmp_str_match("test-and-set", 2, value) || 43080b57cec5SDimitry Andric __kmp_str_match("test andset", 2, value) || 43090b57cec5SDimitry Andric __kmp_str_match("test_andset", 2, value) || 43100b57cec5SDimitry Andric __kmp_str_match("test-andset", 2, value) || 43110b57cec5SDimitry Andric __kmp_str_match("testand set", 2, value) || 43120b57cec5SDimitry Andric __kmp_str_match("testand_set", 2, value) || 43130b57cec5SDimitry Andric __kmp_str_match("testand-set", 2, value) || 43140b57cec5SDimitry Andric __kmp_str_match("testandset", 2, value)) { 43150b57cec5SDimitry Andric __kmp_user_lock_kind = lk_tas; 43160b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(tas); 43170b57cec5SDimitry Andric } 43180b57cec5SDimitry Andric #if KMP_USE_FUTEX 43190b57cec5SDimitry Andric else if (__kmp_str_match("futex", 1, value)) { 43200b57cec5SDimitry Andric if (__kmp_futex_determine_capable()) { 43210b57cec5SDimitry Andric __kmp_user_lock_kind = lk_futex; 43220b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(futex); 43230b57cec5SDimitry Andric } else { 43240b57cec5SDimitry Andric KMP_WARNING(FutexNotSupported, name, value); 43250b57cec5SDimitry Andric } 43260b57cec5SDimitry Andric } 43270b57cec5SDimitry Andric #endif 43280b57cec5SDimitry Andric else if (__kmp_str_match("ticket", 2, value)) { 43290b57cec5SDimitry Andric __kmp_user_lock_kind = lk_ticket; 43300b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(ticket); 43310b57cec5SDimitry Andric } else if (__kmp_str_match("queuing", 1, value) || 43320b57cec5SDimitry Andric __kmp_str_match("queue", 1, value)) { 43330b57cec5SDimitry Andric __kmp_user_lock_kind = lk_queuing; 43340b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(queuing); 43350b57cec5SDimitry Andric } else if (__kmp_str_match("drdpa ticket", 1, value) || 43360b57cec5SDimitry Andric __kmp_str_match("drdpa_ticket", 1, value) || 43370b57cec5SDimitry Andric __kmp_str_match("drdpa-ticket", 1, value) || 43380b57cec5SDimitry Andric __kmp_str_match("drdpaticket", 1, value) || 43390b57cec5SDimitry Andric __kmp_str_match("drdpa", 1, value)) { 43400b57cec5SDimitry Andric __kmp_user_lock_kind = lk_drdpa; 43410b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(drdpa); 43420b57cec5SDimitry Andric } 43430b57cec5SDimitry Andric #if KMP_USE_ADAPTIVE_LOCKS 43440b57cec5SDimitry Andric else if (__kmp_str_match("adaptive", 1, value)) { 43450b57cec5SDimitry Andric if (__kmp_cpuinfo.rtm) { // ??? Is cpuinfo available here? 43460b57cec5SDimitry Andric __kmp_user_lock_kind = lk_adaptive; 43470b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(adaptive); 43480b57cec5SDimitry Andric } else { 43490b57cec5SDimitry Andric KMP_WARNING(AdaptiveNotSupported, name, value); 43500b57cec5SDimitry Andric __kmp_user_lock_kind = lk_queuing; 43510b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(queuing); 43520b57cec5SDimitry Andric } 43530b57cec5SDimitry Andric } 43540b57cec5SDimitry Andric #endif // KMP_USE_ADAPTIVE_LOCKS 43550b57cec5SDimitry Andric #if KMP_USE_DYNAMIC_LOCK && KMP_USE_TSX 4356*e8d8bef9SDimitry Andric else if (__kmp_str_match("rtm_queuing", 1, value)) { 43570b57cec5SDimitry Andric if (__kmp_cpuinfo.rtm) { 4358*e8d8bef9SDimitry Andric __kmp_user_lock_kind = lk_rtm_queuing; 4359*e8d8bef9SDimitry Andric KMP_STORE_LOCK_SEQ(rtm_queuing); 43600b57cec5SDimitry Andric } else { 43610b57cec5SDimitry Andric KMP_WARNING(AdaptiveNotSupported, name, value); 43620b57cec5SDimitry Andric __kmp_user_lock_kind = lk_queuing; 43630b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(queuing); 43640b57cec5SDimitry Andric } 4365*e8d8bef9SDimitry Andric } else if (__kmp_str_match("rtm_spin", 1, value)) { 4366*e8d8bef9SDimitry Andric if (__kmp_cpuinfo.rtm) { 4367*e8d8bef9SDimitry Andric __kmp_user_lock_kind = lk_rtm_spin; 4368*e8d8bef9SDimitry Andric KMP_STORE_LOCK_SEQ(rtm_spin); 4369*e8d8bef9SDimitry Andric } else { 4370*e8d8bef9SDimitry Andric KMP_WARNING(AdaptiveNotSupported, name, value); 4371*e8d8bef9SDimitry Andric __kmp_user_lock_kind = lk_tas; 4372*e8d8bef9SDimitry Andric KMP_STORE_LOCK_SEQ(queuing); 4373*e8d8bef9SDimitry Andric } 43740b57cec5SDimitry Andric } else if (__kmp_str_match("hle", 1, value)) { 43750b57cec5SDimitry Andric __kmp_user_lock_kind = lk_hle; 43760b57cec5SDimitry Andric KMP_STORE_LOCK_SEQ(hle); 43770b57cec5SDimitry Andric } 43780b57cec5SDimitry Andric #endif 43790b57cec5SDimitry Andric else { 43800b57cec5SDimitry Andric KMP_WARNING(StgInvalidValue, name, value); 43810b57cec5SDimitry Andric } 43820b57cec5SDimitry Andric } 43830b57cec5SDimitry Andric 43840b57cec5SDimitry Andric static void __kmp_stg_print_lock_kind(kmp_str_buf_t *buffer, char const *name, 43850b57cec5SDimitry Andric void *data) { 43860b57cec5SDimitry Andric const char *value = NULL; 43870b57cec5SDimitry Andric 43880b57cec5SDimitry Andric switch (__kmp_user_lock_kind) { 43890b57cec5SDimitry Andric case lk_default: 43900b57cec5SDimitry Andric value = "default"; 43910b57cec5SDimitry Andric break; 43920b57cec5SDimitry Andric 43930b57cec5SDimitry Andric case lk_tas: 43940b57cec5SDimitry Andric value = "tas"; 43950b57cec5SDimitry Andric break; 43960b57cec5SDimitry Andric 43970b57cec5SDimitry Andric #if KMP_USE_FUTEX 43980b57cec5SDimitry Andric case lk_futex: 43990b57cec5SDimitry Andric value = "futex"; 44000b57cec5SDimitry Andric break; 44010b57cec5SDimitry Andric #endif 44020b57cec5SDimitry Andric 44030b57cec5SDimitry Andric #if KMP_USE_DYNAMIC_LOCK && KMP_USE_TSX 4404*e8d8bef9SDimitry Andric case lk_rtm_queuing: 4405*e8d8bef9SDimitry Andric value = "rtm_queuing"; 4406*e8d8bef9SDimitry Andric break; 4407*e8d8bef9SDimitry Andric 4408*e8d8bef9SDimitry Andric case lk_rtm_spin: 4409*e8d8bef9SDimitry Andric value = "rtm_spin"; 44100b57cec5SDimitry Andric break; 44110b57cec5SDimitry Andric 44120b57cec5SDimitry Andric case lk_hle: 44130b57cec5SDimitry Andric value = "hle"; 44140b57cec5SDimitry Andric break; 44150b57cec5SDimitry Andric #endif 44160b57cec5SDimitry Andric 44170b57cec5SDimitry Andric case lk_ticket: 44180b57cec5SDimitry Andric value = "ticket"; 44190b57cec5SDimitry Andric break; 44200b57cec5SDimitry Andric 44210b57cec5SDimitry Andric case lk_queuing: 44220b57cec5SDimitry Andric value = "queuing"; 44230b57cec5SDimitry Andric break; 44240b57cec5SDimitry Andric 44250b57cec5SDimitry Andric case lk_drdpa: 44260b57cec5SDimitry Andric value = "drdpa"; 44270b57cec5SDimitry Andric break; 44280b57cec5SDimitry Andric #if KMP_USE_ADAPTIVE_LOCKS 44290b57cec5SDimitry Andric case lk_adaptive: 44300b57cec5SDimitry Andric value = "adaptive"; 44310b57cec5SDimitry Andric break; 44320b57cec5SDimitry Andric #endif 44330b57cec5SDimitry Andric } 44340b57cec5SDimitry Andric 44350b57cec5SDimitry Andric if (value != NULL) { 44360b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, value); 44370b57cec5SDimitry Andric } 44380b57cec5SDimitry Andric } 44390b57cec5SDimitry Andric 44400b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 44410b57cec5SDimitry Andric // KMP_SPIN_BACKOFF_PARAMS 44420b57cec5SDimitry Andric 44430b57cec5SDimitry Andric // KMP_SPIN_BACKOFF_PARAMS=max_backoff[,min_tick] (max backoff size, min tick 44440b57cec5SDimitry Andric // for machine pause) 44450b57cec5SDimitry Andric static void __kmp_stg_parse_spin_backoff_params(const char *name, 44460b57cec5SDimitry Andric const char *value, void *data) { 44470b57cec5SDimitry Andric const char *next = value; 44480b57cec5SDimitry Andric 44490b57cec5SDimitry Andric int total = 0; // Count elements that were set. It'll be used as an array size 44500b57cec5SDimitry Andric int prev_comma = FALSE; // For correct processing sequential commas 44510b57cec5SDimitry Andric int i; 44520b57cec5SDimitry Andric 44530b57cec5SDimitry Andric kmp_uint32 max_backoff = __kmp_spin_backoff_params.max_backoff; 44540b57cec5SDimitry Andric kmp_uint32 min_tick = __kmp_spin_backoff_params.min_tick; 44550b57cec5SDimitry Andric 44560b57cec5SDimitry Andric // Run only 3 iterations because it is enough to read two values or find a 44570b57cec5SDimitry Andric // syntax error 44580b57cec5SDimitry Andric for (i = 0; i < 3; i++) { 44590b57cec5SDimitry Andric SKIP_WS(next); 44600b57cec5SDimitry Andric 44610b57cec5SDimitry Andric if (*next == '\0') { 44620b57cec5SDimitry Andric break; 44630b57cec5SDimitry Andric } 44640b57cec5SDimitry Andric // Next character is not an integer or not a comma OR number of values > 2 44650b57cec5SDimitry Andric // => end of list 44660b57cec5SDimitry Andric if (((*next < '0' || *next > '9') && *next != ',') || total > 2) { 44670b57cec5SDimitry Andric KMP_WARNING(EnvSyntaxError, name, value); 44680b57cec5SDimitry Andric return; 44690b57cec5SDimitry Andric } 44700b57cec5SDimitry Andric // The next character is ',' 44710b57cec5SDimitry Andric if (*next == ',') { 4472480093f4SDimitry Andric // ',' is the first character 44730b57cec5SDimitry Andric if (total == 0 || prev_comma) { 44740b57cec5SDimitry Andric total++; 44750b57cec5SDimitry Andric } 44760b57cec5SDimitry Andric prev_comma = TRUE; 44770b57cec5SDimitry Andric next++; // skip ',' 44780b57cec5SDimitry Andric SKIP_WS(next); 44790b57cec5SDimitry Andric } 44800b57cec5SDimitry Andric // Next character is a digit 44810b57cec5SDimitry Andric if (*next >= '0' && *next <= '9') { 44820b57cec5SDimitry Andric int num; 44830b57cec5SDimitry Andric const char *buf = next; 44840b57cec5SDimitry Andric char const *msg = NULL; 44850b57cec5SDimitry Andric prev_comma = FALSE; 44860b57cec5SDimitry Andric SKIP_DIGITS(next); 44870b57cec5SDimitry Andric total++; 44880b57cec5SDimitry Andric 44890b57cec5SDimitry Andric const char *tmp = next; 44900b57cec5SDimitry Andric SKIP_WS(tmp); 44910b57cec5SDimitry Andric if ((*next == ' ' || *next == '\t') && (*tmp >= '0' && *tmp <= '9')) { 44920b57cec5SDimitry Andric KMP_WARNING(EnvSpacesNotAllowed, name, value); 44930b57cec5SDimitry Andric return; 44940b57cec5SDimitry Andric } 44950b57cec5SDimitry Andric 44960b57cec5SDimitry Andric num = __kmp_str_to_int(buf, *next); 44970b57cec5SDimitry Andric if (num <= 0) { // The number of retries should be > 0 44980b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooSmall); 44990b57cec5SDimitry Andric num = 1; 45000b57cec5SDimitry Andric } else if (num > KMP_INT_MAX) { 45010b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooLarge); 45020b57cec5SDimitry Andric num = KMP_INT_MAX; 45030b57cec5SDimitry Andric } 45040b57cec5SDimitry Andric if (msg != NULL) { 45050b57cec5SDimitry Andric // Message is not empty. Print warning. 45060b57cec5SDimitry Andric KMP_WARNING(ParseSizeIntWarn, name, value, msg); 45070b57cec5SDimitry Andric KMP_INFORM(Using_int_Value, name, num); 45080b57cec5SDimitry Andric } 45090b57cec5SDimitry Andric if (total == 1) { 45100b57cec5SDimitry Andric max_backoff = num; 45110b57cec5SDimitry Andric } else if (total == 2) { 45120b57cec5SDimitry Andric min_tick = num; 45130b57cec5SDimitry Andric } 45140b57cec5SDimitry Andric } 45150b57cec5SDimitry Andric } 45160b57cec5SDimitry Andric KMP_DEBUG_ASSERT(total > 0); 45170b57cec5SDimitry Andric if (total <= 0) { 45180b57cec5SDimitry Andric KMP_WARNING(EnvSyntaxError, name, value); 45190b57cec5SDimitry Andric return; 45200b57cec5SDimitry Andric } 45210b57cec5SDimitry Andric __kmp_spin_backoff_params.max_backoff = max_backoff; 45220b57cec5SDimitry Andric __kmp_spin_backoff_params.min_tick = min_tick; 45230b57cec5SDimitry Andric } 45240b57cec5SDimitry Andric 45250b57cec5SDimitry Andric static void __kmp_stg_print_spin_backoff_params(kmp_str_buf_t *buffer, 45260b57cec5SDimitry Andric char const *name, void *data) { 45270b57cec5SDimitry Andric if (__kmp_env_format) { 45280b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 45290b57cec5SDimitry Andric } else { 45300b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", name); 45310b57cec5SDimitry Andric } 45320b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%d,%d'\n", __kmp_spin_backoff_params.max_backoff, 45330b57cec5SDimitry Andric __kmp_spin_backoff_params.min_tick); 45340b57cec5SDimitry Andric } 45350b57cec5SDimitry Andric 45360b57cec5SDimitry Andric #if KMP_USE_ADAPTIVE_LOCKS 45370b57cec5SDimitry Andric 45380b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 45390b57cec5SDimitry Andric // KMP_ADAPTIVE_LOCK_PROPS, KMP_SPECULATIVE_STATSFILE 45400b57cec5SDimitry Andric 45410b57cec5SDimitry Andric // Parse out values for the tunable parameters from a string of the form 45420b57cec5SDimitry Andric // KMP_ADAPTIVE_LOCK_PROPS=max_soft_retries[,max_badness] 45430b57cec5SDimitry Andric static void __kmp_stg_parse_adaptive_lock_props(const char *name, 45440b57cec5SDimitry Andric const char *value, void *data) { 45450b57cec5SDimitry Andric int max_retries = 0; 45460b57cec5SDimitry Andric int max_badness = 0; 45470b57cec5SDimitry Andric 45480b57cec5SDimitry Andric const char *next = value; 45490b57cec5SDimitry Andric 45500b57cec5SDimitry Andric int total = 0; // Count elements that were set. It'll be used as an array size 45510b57cec5SDimitry Andric int prev_comma = FALSE; // For correct processing sequential commas 45520b57cec5SDimitry Andric int i; 45530b57cec5SDimitry Andric 45540b57cec5SDimitry Andric // Save values in the structure __kmp_speculative_backoff_params 45550b57cec5SDimitry Andric // Run only 3 iterations because it is enough to read two values or find a 45560b57cec5SDimitry Andric // syntax error 45570b57cec5SDimitry Andric for (i = 0; i < 3; i++) { 45580b57cec5SDimitry Andric SKIP_WS(next); 45590b57cec5SDimitry Andric 45600b57cec5SDimitry Andric if (*next == '\0') { 45610b57cec5SDimitry Andric break; 45620b57cec5SDimitry Andric } 45630b57cec5SDimitry Andric // Next character is not an integer or not a comma OR number of values > 2 45640b57cec5SDimitry Andric // => end of list 45650b57cec5SDimitry Andric if (((*next < '0' || *next > '9') && *next != ',') || total > 2) { 45660b57cec5SDimitry Andric KMP_WARNING(EnvSyntaxError, name, value); 45670b57cec5SDimitry Andric return; 45680b57cec5SDimitry Andric } 45690b57cec5SDimitry Andric // The next character is ',' 45700b57cec5SDimitry Andric if (*next == ',') { 4571480093f4SDimitry Andric // ',' is the first character 45720b57cec5SDimitry Andric if (total == 0 || prev_comma) { 45730b57cec5SDimitry Andric total++; 45740b57cec5SDimitry Andric } 45750b57cec5SDimitry Andric prev_comma = TRUE; 45760b57cec5SDimitry Andric next++; // skip ',' 45770b57cec5SDimitry Andric SKIP_WS(next); 45780b57cec5SDimitry Andric } 45790b57cec5SDimitry Andric // Next character is a digit 45800b57cec5SDimitry Andric if (*next >= '0' && *next <= '9') { 45810b57cec5SDimitry Andric int num; 45820b57cec5SDimitry Andric const char *buf = next; 45830b57cec5SDimitry Andric char const *msg = NULL; 45840b57cec5SDimitry Andric prev_comma = FALSE; 45850b57cec5SDimitry Andric SKIP_DIGITS(next); 45860b57cec5SDimitry Andric total++; 45870b57cec5SDimitry Andric 45880b57cec5SDimitry Andric const char *tmp = next; 45890b57cec5SDimitry Andric SKIP_WS(tmp); 45900b57cec5SDimitry Andric if ((*next == ' ' || *next == '\t') && (*tmp >= '0' && *tmp <= '9')) { 45910b57cec5SDimitry Andric KMP_WARNING(EnvSpacesNotAllowed, name, value); 45920b57cec5SDimitry Andric return; 45930b57cec5SDimitry Andric } 45940b57cec5SDimitry Andric 45950b57cec5SDimitry Andric num = __kmp_str_to_int(buf, *next); 45960b57cec5SDimitry Andric if (num < 0) { // The number of retries should be >= 0 45970b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooSmall); 45980b57cec5SDimitry Andric num = 1; 45990b57cec5SDimitry Andric } else if (num > KMP_INT_MAX) { 46000b57cec5SDimitry Andric msg = KMP_I18N_STR(ValueTooLarge); 46010b57cec5SDimitry Andric num = KMP_INT_MAX; 46020b57cec5SDimitry Andric } 46030b57cec5SDimitry Andric if (msg != NULL) { 46040b57cec5SDimitry Andric // Message is not empty. Print warning. 46050b57cec5SDimitry Andric KMP_WARNING(ParseSizeIntWarn, name, value, msg); 46060b57cec5SDimitry Andric KMP_INFORM(Using_int_Value, name, num); 46070b57cec5SDimitry Andric } 46080b57cec5SDimitry Andric if (total == 1) { 46090b57cec5SDimitry Andric max_retries = num; 46100b57cec5SDimitry Andric } else if (total == 2) { 46110b57cec5SDimitry Andric max_badness = num; 46120b57cec5SDimitry Andric } 46130b57cec5SDimitry Andric } 46140b57cec5SDimitry Andric } 46150b57cec5SDimitry Andric KMP_DEBUG_ASSERT(total > 0); 46160b57cec5SDimitry Andric if (total <= 0) { 46170b57cec5SDimitry Andric KMP_WARNING(EnvSyntaxError, name, value); 46180b57cec5SDimitry Andric return; 46190b57cec5SDimitry Andric } 46200b57cec5SDimitry Andric __kmp_adaptive_backoff_params.max_soft_retries = max_retries; 46210b57cec5SDimitry Andric __kmp_adaptive_backoff_params.max_badness = max_badness; 46220b57cec5SDimitry Andric } 46230b57cec5SDimitry Andric 46240b57cec5SDimitry Andric static void __kmp_stg_print_adaptive_lock_props(kmp_str_buf_t *buffer, 46250b57cec5SDimitry Andric char const *name, void *data) { 46260b57cec5SDimitry Andric if (__kmp_env_format) { 46270b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 46280b57cec5SDimitry Andric } else { 46290b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", name); 46300b57cec5SDimitry Andric } 46310b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%d,%d'\n", 46320b57cec5SDimitry Andric __kmp_adaptive_backoff_params.max_soft_retries, 46330b57cec5SDimitry Andric __kmp_adaptive_backoff_params.max_badness); 46340b57cec5SDimitry Andric } // __kmp_stg_print_adaptive_lock_props 46350b57cec5SDimitry Andric 46360b57cec5SDimitry Andric #if KMP_DEBUG_ADAPTIVE_LOCKS 46370b57cec5SDimitry Andric 46380b57cec5SDimitry Andric static void __kmp_stg_parse_speculative_statsfile(char const *name, 46390b57cec5SDimitry Andric char const *value, 46400b57cec5SDimitry Andric void *data) { 46410b57cec5SDimitry Andric __kmp_stg_parse_file(name, value, "", CCAST(char**, &__kmp_speculative_statsfile)); 46420b57cec5SDimitry Andric } // __kmp_stg_parse_speculative_statsfile 46430b57cec5SDimitry Andric 46440b57cec5SDimitry Andric static void __kmp_stg_print_speculative_statsfile(kmp_str_buf_t *buffer, 46450b57cec5SDimitry Andric char const *name, 46460b57cec5SDimitry Andric void *data) { 46470b57cec5SDimitry Andric if (__kmp_str_match("-", 0, __kmp_speculative_statsfile)) { 46480b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "stdout"); 46490b57cec5SDimitry Andric } else { 46500b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, __kmp_speculative_statsfile); 46510b57cec5SDimitry Andric } 46520b57cec5SDimitry Andric 46530b57cec5SDimitry Andric } // __kmp_stg_print_speculative_statsfile 46540b57cec5SDimitry Andric 46550b57cec5SDimitry Andric #endif // KMP_DEBUG_ADAPTIVE_LOCKS 46560b57cec5SDimitry Andric 46570b57cec5SDimitry Andric #endif // KMP_USE_ADAPTIVE_LOCKS 46580b57cec5SDimitry Andric 46590b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 46600b57cec5SDimitry Andric // KMP_HW_SUBSET (was KMP_PLACE_THREADS) 46610b57cec5SDimitry Andric 46625ffd83dbSDimitry Andric // The longest observable sequence of items is 46630b57cec5SDimitry Andric // Socket-Node-Tile-Core-Thread 46640b57cec5SDimitry Andric // So, let's limit to 5 levels for now 46650b57cec5SDimitry Andric // The input string is usually short enough, let's use 512 limit for now 46660b57cec5SDimitry Andric #define MAX_T_LEVEL 5 46670b57cec5SDimitry Andric #define MAX_STR_LEN 512 46680b57cec5SDimitry Andric static void __kmp_stg_parse_hw_subset(char const *name, char const *value, 46690b57cec5SDimitry Andric void *data) { 46700b57cec5SDimitry Andric // Value example: 1s,5c@3,2T 46710b57cec5SDimitry Andric // Which means "use 1 socket, 5 cores with offset 3, 2 threads per core" 46720b57cec5SDimitry Andric kmp_setting_t **rivals = (kmp_setting_t **)data; 46730b57cec5SDimitry Andric if (strcmp(name, "KMP_PLACE_THREADS") == 0) { 46740b57cec5SDimitry Andric KMP_INFORM(EnvVarDeprecated, name, "KMP_HW_SUBSET"); 46750b57cec5SDimitry Andric } 46760b57cec5SDimitry Andric if (__kmp_stg_check_rivals(name, value, rivals)) { 46770b57cec5SDimitry Andric return; 46780b57cec5SDimitry Andric } 46790b57cec5SDimitry Andric 46800b57cec5SDimitry Andric char *components[MAX_T_LEVEL]; 46810b57cec5SDimitry Andric char const *digits = "0123456789"; 46820b57cec5SDimitry Andric char input[MAX_STR_LEN]; 46830b57cec5SDimitry Andric size_t len = 0, mlen = MAX_STR_LEN; 46840b57cec5SDimitry Andric int level = 0; 46850b57cec5SDimitry Andric // Canonize the string (remove spaces, unify delimiters, etc.) 46860b57cec5SDimitry Andric char *pos = CCAST(char *, value); 46870b57cec5SDimitry Andric while (*pos && mlen) { 46880b57cec5SDimitry Andric if (*pos != ' ') { // skip spaces 46890b57cec5SDimitry Andric if (len == 0 && *pos == ':') { 46900b57cec5SDimitry Andric __kmp_hws_abs_flag = 1; // if the first symbol is ":", skip it 46910b57cec5SDimitry Andric } else { 4692*e8d8bef9SDimitry Andric input[len] = (char)(toupper(*pos)); 46930b57cec5SDimitry Andric if (input[len] == 'X') 46940b57cec5SDimitry Andric input[len] = ','; // unify delimiters of levels 46950b57cec5SDimitry Andric if (input[len] == 'O' && strchr(digits, *(pos + 1))) 46960b57cec5SDimitry Andric input[len] = '@'; // unify delimiters of offset 46970b57cec5SDimitry Andric len++; 46980b57cec5SDimitry Andric } 46990b57cec5SDimitry Andric } 47000b57cec5SDimitry Andric mlen--; 47010b57cec5SDimitry Andric pos++; 47020b57cec5SDimitry Andric } 47030b57cec5SDimitry Andric if (len == 0 || mlen == 0) 47040b57cec5SDimitry Andric goto err; // contents is either empty or too long 47050b57cec5SDimitry Andric input[len] = '\0'; 47060b57cec5SDimitry Andric __kmp_hws_requested = 1; // mark that subset requested 47070b57cec5SDimitry Andric // Split by delimiter 47080b57cec5SDimitry Andric pos = input; 47090b57cec5SDimitry Andric components[level++] = pos; 47100b57cec5SDimitry Andric while ((pos = strchr(pos, ','))) { 47110b57cec5SDimitry Andric if (level >= MAX_T_LEVEL) 47120b57cec5SDimitry Andric goto err; // too many components provided 47130b57cec5SDimitry Andric *pos = '\0'; // modify input and avoid more copying 47140b57cec5SDimitry Andric components[level++] = ++pos; // expect something after "," 47150b57cec5SDimitry Andric } 47160b57cec5SDimitry Andric // Check each component 47170b57cec5SDimitry Andric for (int i = 0; i < level; ++i) { 47180b57cec5SDimitry Andric int offset = 0; 47190b57cec5SDimitry Andric int num = atoi(components[i]); // each component should start with a number 47200b57cec5SDimitry Andric if ((pos = strchr(components[i], '@'))) { 47210b57cec5SDimitry Andric offset = atoi(pos + 1); // save offset 47220b57cec5SDimitry Andric *pos = '\0'; // cut the offset from the component 47230b57cec5SDimitry Andric } 47240b57cec5SDimitry Andric pos = components[i] + strspn(components[i], digits); 47250b57cec5SDimitry Andric if (pos == components[i]) 47260b57cec5SDimitry Andric goto err; 47270b57cec5SDimitry Andric // detect the component type 47280b57cec5SDimitry Andric switch (*pos) { 47290b57cec5SDimitry Andric case 'S': // Socket 47300b57cec5SDimitry Andric if (__kmp_hws_socket.num > 0) 47310b57cec5SDimitry Andric goto err; // duplicate is not allowed 47320b57cec5SDimitry Andric __kmp_hws_socket.num = num; 47330b57cec5SDimitry Andric __kmp_hws_socket.offset = offset; 47340b57cec5SDimitry Andric break; 47350b57cec5SDimitry Andric case 'N': // NUMA Node 47360b57cec5SDimitry Andric if (__kmp_hws_node.num > 0) 47370b57cec5SDimitry Andric goto err; // duplicate is not allowed 47380b57cec5SDimitry Andric __kmp_hws_node.num = num; 47390b57cec5SDimitry Andric __kmp_hws_node.offset = offset; 47400b57cec5SDimitry Andric break; 47410b57cec5SDimitry Andric case 'L': // Cache 47420b57cec5SDimitry Andric if (*(pos + 1) == '2') { // L2 - Tile 47430b57cec5SDimitry Andric if (__kmp_hws_tile.num > 0) 47440b57cec5SDimitry Andric goto err; // duplicate is not allowed 47450b57cec5SDimitry Andric __kmp_hws_tile.num = num; 47460b57cec5SDimitry Andric __kmp_hws_tile.offset = offset; 47470b57cec5SDimitry Andric } else if (*(pos + 1) == '3') { // L3 - Socket 47480b57cec5SDimitry Andric if (__kmp_hws_socket.num > 0) 47490b57cec5SDimitry Andric goto err; // duplicate is not allowed 47500b57cec5SDimitry Andric __kmp_hws_socket.num = num; 47510b57cec5SDimitry Andric __kmp_hws_socket.offset = offset; 47520b57cec5SDimitry Andric } else if (*(pos + 1) == '1') { // L1 - Core 47530b57cec5SDimitry Andric if (__kmp_hws_core.num > 0) 47540b57cec5SDimitry Andric goto err; // duplicate is not allowed 47550b57cec5SDimitry Andric __kmp_hws_core.num = num; 47560b57cec5SDimitry Andric __kmp_hws_core.offset = offset; 47570b57cec5SDimitry Andric } 47580b57cec5SDimitry Andric break; 47590b57cec5SDimitry Andric case 'C': // Core (or Cache?) 47600b57cec5SDimitry Andric if (*(pos + 1) != 'A') { 47610b57cec5SDimitry Andric if (__kmp_hws_core.num > 0) 47620b57cec5SDimitry Andric goto err; // duplicate is not allowed 47630b57cec5SDimitry Andric __kmp_hws_core.num = num; 47640b57cec5SDimitry Andric __kmp_hws_core.offset = offset; 47650b57cec5SDimitry Andric } else { // Cache 47660b57cec5SDimitry Andric char *d = pos + strcspn(pos, digits); // find digit 47670b57cec5SDimitry Andric if (*d == '2') { // L2 - Tile 47680b57cec5SDimitry Andric if (__kmp_hws_tile.num > 0) 47690b57cec5SDimitry Andric goto err; // duplicate is not allowed 47700b57cec5SDimitry Andric __kmp_hws_tile.num = num; 47710b57cec5SDimitry Andric __kmp_hws_tile.offset = offset; 47720b57cec5SDimitry Andric } else if (*d == '3') { // L3 - Socket 47730b57cec5SDimitry Andric if (__kmp_hws_socket.num > 0) 47740b57cec5SDimitry Andric goto err; // duplicate is not allowed 47750b57cec5SDimitry Andric __kmp_hws_socket.num = num; 47760b57cec5SDimitry Andric __kmp_hws_socket.offset = offset; 47770b57cec5SDimitry Andric } else if (*d == '1') { // L1 - Core 47780b57cec5SDimitry Andric if (__kmp_hws_core.num > 0) 47790b57cec5SDimitry Andric goto err; // duplicate is not allowed 47800b57cec5SDimitry Andric __kmp_hws_core.num = num; 47810b57cec5SDimitry Andric __kmp_hws_core.offset = offset; 47820b57cec5SDimitry Andric } else { 47830b57cec5SDimitry Andric goto err; 47840b57cec5SDimitry Andric } 47850b57cec5SDimitry Andric } 47860b57cec5SDimitry Andric break; 47870b57cec5SDimitry Andric case 'T': // Thread 47880b57cec5SDimitry Andric if (__kmp_hws_proc.num > 0) 47890b57cec5SDimitry Andric goto err; // duplicate is not allowed 47900b57cec5SDimitry Andric __kmp_hws_proc.num = num; 47910b57cec5SDimitry Andric __kmp_hws_proc.offset = offset; 47920b57cec5SDimitry Andric break; 47930b57cec5SDimitry Andric default: 47940b57cec5SDimitry Andric goto err; 47950b57cec5SDimitry Andric } 47960b57cec5SDimitry Andric } 47970b57cec5SDimitry Andric return; 47980b57cec5SDimitry Andric err: 47990b57cec5SDimitry Andric KMP_WARNING(AffHWSubsetInvalid, name, value); 48000b57cec5SDimitry Andric __kmp_hws_requested = 0; // mark that subset not requested 48010b57cec5SDimitry Andric return; 48020b57cec5SDimitry Andric } 48030b57cec5SDimitry Andric 48040b57cec5SDimitry Andric static void __kmp_stg_print_hw_subset(kmp_str_buf_t *buffer, char const *name, 48050b57cec5SDimitry Andric void *data) { 48060b57cec5SDimitry Andric if (__kmp_hws_requested) { 48070b57cec5SDimitry Andric int comma = 0; 48080b57cec5SDimitry Andric kmp_str_buf_t buf; 48090b57cec5SDimitry Andric __kmp_str_buf_init(&buf); 48100b57cec5SDimitry Andric if (__kmp_env_format) 48110b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME_EX(name); 48120b57cec5SDimitry Andric else 48130b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s='", name); 48140b57cec5SDimitry Andric if (__kmp_hws_socket.num) { 48150b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "%ds", __kmp_hws_socket.num); 48160b57cec5SDimitry Andric if (__kmp_hws_socket.offset) 48170b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "@%d", __kmp_hws_socket.offset); 48180b57cec5SDimitry Andric comma = 1; 48190b57cec5SDimitry Andric } 48200b57cec5SDimitry Andric if (__kmp_hws_node.num) { 48210b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "%s%dn", comma ? "," : "", __kmp_hws_node.num); 48220b57cec5SDimitry Andric if (__kmp_hws_node.offset) 48230b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "@%d", __kmp_hws_node.offset); 48240b57cec5SDimitry Andric comma = 1; 48250b57cec5SDimitry Andric } 48260b57cec5SDimitry Andric if (__kmp_hws_tile.num) { 48270b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "%s%dL2", comma ? "," : "", __kmp_hws_tile.num); 48280b57cec5SDimitry Andric if (__kmp_hws_tile.offset) 48290b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "@%d", __kmp_hws_tile.offset); 48300b57cec5SDimitry Andric comma = 1; 48310b57cec5SDimitry Andric } 48320b57cec5SDimitry Andric if (__kmp_hws_core.num) { 48330b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "%s%dc", comma ? "," : "", __kmp_hws_core.num); 48340b57cec5SDimitry Andric if (__kmp_hws_core.offset) 48350b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "@%d", __kmp_hws_core.offset); 48360b57cec5SDimitry Andric comma = 1; 48370b57cec5SDimitry Andric } 48380b57cec5SDimitry Andric if (__kmp_hws_proc.num) 48390b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "%s%dt", comma ? "," : "", __kmp_hws_proc.num); 48400b57cec5SDimitry Andric __kmp_str_buf_print(buffer, "%s'\n", buf.str); 48410b57cec5SDimitry Andric __kmp_str_buf_free(&buf); 48420b57cec5SDimitry Andric } 48430b57cec5SDimitry Andric } 48440b57cec5SDimitry Andric 48450b57cec5SDimitry Andric #if USE_ITT_BUILD 48460b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 48470b57cec5SDimitry Andric // KMP_FORKJOIN_FRAMES 48480b57cec5SDimitry Andric 48490b57cec5SDimitry Andric static void __kmp_stg_parse_forkjoin_frames(char const *name, char const *value, 48500b57cec5SDimitry Andric void *data) { 48510b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_forkjoin_frames); 48520b57cec5SDimitry Andric } // __kmp_stg_parse_forkjoin_frames 48530b57cec5SDimitry Andric 48540b57cec5SDimitry Andric static void __kmp_stg_print_forkjoin_frames(kmp_str_buf_t *buffer, 48550b57cec5SDimitry Andric char const *name, void *data) { 48560b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_forkjoin_frames); 48570b57cec5SDimitry Andric } // __kmp_stg_print_forkjoin_frames 48580b57cec5SDimitry Andric 48590b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 48600b57cec5SDimitry Andric // KMP_FORKJOIN_FRAMES_MODE 48610b57cec5SDimitry Andric 48620b57cec5SDimitry Andric static void __kmp_stg_parse_forkjoin_frames_mode(char const *name, 48630b57cec5SDimitry Andric char const *value, 48640b57cec5SDimitry Andric void *data) { 48650b57cec5SDimitry Andric __kmp_stg_parse_int(name, value, 0, 3, &__kmp_forkjoin_frames_mode); 48660b57cec5SDimitry Andric } // __kmp_stg_parse_forkjoin_frames 48670b57cec5SDimitry Andric 48680b57cec5SDimitry Andric static void __kmp_stg_print_forkjoin_frames_mode(kmp_str_buf_t *buffer, 48690b57cec5SDimitry Andric char const *name, void *data) { 48700b57cec5SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_forkjoin_frames_mode); 48710b57cec5SDimitry Andric } // __kmp_stg_print_forkjoin_frames 48720b57cec5SDimitry Andric #endif /* USE_ITT_BUILD */ 48730b57cec5SDimitry Andric 48740b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 48750b57cec5SDimitry Andric // KMP_ENABLE_TASK_THROTTLING 48760b57cec5SDimitry Andric 48770b57cec5SDimitry Andric static void __kmp_stg_parse_task_throttling(char const *name, 48780b57cec5SDimitry Andric char const *value, void *data) { 48790b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_enable_task_throttling); 48800b57cec5SDimitry Andric } // __kmp_stg_parse_task_throttling 48810b57cec5SDimitry Andric 48820b57cec5SDimitry Andric 48830b57cec5SDimitry Andric static void __kmp_stg_print_task_throttling(kmp_str_buf_t *buffer, 48840b57cec5SDimitry Andric char const *name, void *data) { 48850b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_enable_task_throttling); 48860b57cec5SDimitry Andric } // __kmp_stg_print_task_throttling 48870b57cec5SDimitry Andric 4888*e8d8bef9SDimitry Andric #if KMP_HAVE_MWAIT || KMP_HAVE_UMWAIT 4889*e8d8bef9SDimitry Andric // ----------------------------------------------------------------------------- 4890*e8d8bef9SDimitry Andric // KMP_USER_LEVEL_MWAIT 4891*e8d8bef9SDimitry Andric 4892*e8d8bef9SDimitry Andric static void __kmp_stg_parse_user_level_mwait(char const *name, 4893*e8d8bef9SDimitry Andric char const *value, void *data) { 4894*e8d8bef9SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_user_level_mwait); 4895*e8d8bef9SDimitry Andric } // __kmp_stg_parse_user_level_mwait 4896*e8d8bef9SDimitry Andric 4897*e8d8bef9SDimitry Andric static void __kmp_stg_print_user_level_mwait(kmp_str_buf_t *buffer, 4898*e8d8bef9SDimitry Andric char const *name, void *data) { 4899*e8d8bef9SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_user_level_mwait); 4900*e8d8bef9SDimitry Andric } // __kmp_stg_print_user_level_mwait 4901*e8d8bef9SDimitry Andric 4902*e8d8bef9SDimitry Andric // ----------------------------------------------------------------------------- 4903*e8d8bef9SDimitry Andric // KMP_MWAIT_HINTS 4904*e8d8bef9SDimitry Andric 4905*e8d8bef9SDimitry Andric static void __kmp_stg_parse_mwait_hints(char const *name, char const *value, 4906*e8d8bef9SDimitry Andric void *data) { 4907*e8d8bef9SDimitry Andric __kmp_stg_parse_int(name, value, 0, INT_MAX, &__kmp_mwait_hints); 4908*e8d8bef9SDimitry Andric } // __kmp_stg_parse_mwait_hints 4909*e8d8bef9SDimitry Andric 4910*e8d8bef9SDimitry Andric static void __kmp_stg_print_mwait_hints(kmp_str_buf_t *buffer, char const *name, 4911*e8d8bef9SDimitry Andric void *data) { 4912*e8d8bef9SDimitry Andric __kmp_stg_print_int(buffer, name, __kmp_mwait_hints); 4913*e8d8bef9SDimitry Andric } // __kmp_stg_print_mwait_hints 4914*e8d8bef9SDimitry Andric 4915*e8d8bef9SDimitry Andric #endif // KMP_HAVE_MWAIT || KMP_HAVE_UMWAIT 4916*e8d8bef9SDimitry Andric 49170b57cec5SDimitry Andric // ----------------------------------------------------------------------------- 49180b57cec5SDimitry Andric // OMP_DISPLAY_ENV 49190b57cec5SDimitry Andric 49200b57cec5SDimitry Andric static void __kmp_stg_parse_omp_display_env(char const *name, char const *value, 49210b57cec5SDimitry Andric void *data) { 49220b57cec5SDimitry Andric if (__kmp_str_match("VERBOSE", 1, value)) { 49230b57cec5SDimitry Andric __kmp_display_env_verbose = TRUE; 49240b57cec5SDimitry Andric } else { 49250b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_display_env); 49260b57cec5SDimitry Andric } 49270b57cec5SDimitry Andric } // __kmp_stg_parse_omp_display_env 49280b57cec5SDimitry Andric 49290b57cec5SDimitry Andric static void __kmp_stg_print_omp_display_env(kmp_str_buf_t *buffer, 49300b57cec5SDimitry Andric char const *name, void *data) { 49310b57cec5SDimitry Andric if (__kmp_display_env_verbose) { 49320b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, "VERBOSE"); 49330b57cec5SDimitry Andric } else { 49340b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_display_env); 49350b57cec5SDimitry Andric } 49360b57cec5SDimitry Andric } // __kmp_stg_print_omp_display_env 49370b57cec5SDimitry Andric 49380b57cec5SDimitry Andric static void __kmp_stg_parse_omp_cancellation(char const *name, 49390b57cec5SDimitry Andric char const *value, void *data) { 49400b57cec5SDimitry Andric if (TCR_4(__kmp_init_parallel)) { 49410b57cec5SDimitry Andric KMP_WARNING(EnvParallelWarn, name); 49420b57cec5SDimitry Andric return; 49430b57cec5SDimitry Andric } // read value before first parallel only 49440b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_omp_cancellation); 49450b57cec5SDimitry Andric } // __kmp_stg_parse_omp_cancellation 49460b57cec5SDimitry Andric 49470b57cec5SDimitry Andric static void __kmp_stg_print_omp_cancellation(kmp_str_buf_t *buffer, 49480b57cec5SDimitry Andric char const *name, void *data) { 49490b57cec5SDimitry Andric __kmp_stg_print_bool(buffer, name, __kmp_omp_cancellation); 49500b57cec5SDimitry Andric } // __kmp_stg_print_omp_cancellation 49510b57cec5SDimitry Andric 49520b57cec5SDimitry Andric #if OMPT_SUPPORT 49530b57cec5SDimitry Andric static int __kmp_tool = 1; 49540b57cec5SDimitry Andric 49550b57cec5SDimitry Andric static void __kmp_stg_parse_omp_tool(char const *name, char const *value, 49560b57cec5SDimitry Andric void *data) { 49570b57cec5SDimitry Andric __kmp_stg_parse_bool(name, value, &__kmp_tool); 49580b57cec5SDimitry Andric } // __kmp_stg_parse_omp_tool 49590b57cec5SDimitry Andric 49600b57cec5SDimitry Andric static void __kmp_stg_print_omp_tool(kmp_str_buf_t *buffer, char const *name, 49610b57cec5SDimitry Andric void *data) { 49620b57cec5SDimitry Andric if (__kmp_env_format) { 49630b57cec5SDimitry Andric KMP_STR_BUF_PRINT_BOOL_EX(name, __kmp_tool, "enabled", "disabled"); 49640b57cec5SDimitry Andric } else { 49650b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s=%s\n", name, 49660b57cec5SDimitry Andric __kmp_tool ? "enabled" : "disabled"); 49670b57cec5SDimitry Andric } 49680b57cec5SDimitry Andric } // __kmp_stg_print_omp_tool 49690b57cec5SDimitry Andric 49700b57cec5SDimitry Andric static char *__kmp_tool_libraries = NULL; 49710b57cec5SDimitry Andric 49720b57cec5SDimitry Andric static void __kmp_stg_parse_omp_tool_libraries(char const *name, 49730b57cec5SDimitry Andric char const *value, void *data) { 49740b57cec5SDimitry Andric __kmp_stg_parse_str(name, value, &__kmp_tool_libraries); 49750b57cec5SDimitry Andric } // __kmp_stg_parse_omp_tool_libraries 49760b57cec5SDimitry Andric 49770b57cec5SDimitry Andric static void __kmp_stg_print_omp_tool_libraries(kmp_str_buf_t *buffer, 49780b57cec5SDimitry Andric char const *name, void *data) { 49790b57cec5SDimitry Andric if (__kmp_tool_libraries) 49800b57cec5SDimitry Andric __kmp_stg_print_str(buffer, name, __kmp_tool_libraries); 49810b57cec5SDimitry Andric else { 49820b57cec5SDimitry Andric if (__kmp_env_format) { 49830b57cec5SDimitry Andric KMP_STR_BUF_PRINT_NAME; 49840b57cec5SDimitry Andric } else { 49850b57cec5SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 49860b57cec5SDimitry Andric } 49870b57cec5SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 49880b57cec5SDimitry Andric } 49890b57cec5SDimitry Andric } // __kmp_stg_print_omp_tool_libraries 49900b57cec5SDimitry Andric 4991*e8d8bef9SDimitry Andric static char *__kmp_tool_verbose_init = NULL; 4992*e8d8bef9SDimitry Andric 4993*e8d8bef9SDimitry Andric static void __kmp_stg_parse_omp_tool_verbose_init(char const *name, 4994*e8d8bef9SDimitry Andric char const *value, void *data) { 4995*e8d8bef9SDimitry Andric __kmp_stg_parse_str(name, value, &__kmp_tool_verbose_init); 4996*e8d8bef9SDimitry Andric } // __kmp_stg_parse_omp_tool_libraries 4997*e8d8bef9SDimitry Andric 4998*e8d8bef9SDimitry Andric static void __kmp_stg_print_omp_tool_verbose_init(kmp_str_buf_t *buffer, 4999*e8d8bef9SDimitry Andric char const *name, void *data) { 5000*e8d8bef9SDimitry Andric if (__kmp_tool_verbose_init) 5001*e8d8bef9SDimitry Andric __kmp_stg_print_str(buffer, name, __kmp_tool_libraries); 5002*e8d8bef9SDimitry Andric else { 5003*e8d8bef9SDimitry Andric if (__kmp_env_format) { 5004*e8d8bef9SDimitry Andric KMP_STR_BUF_PRINT_NAME; 5005*e8d8bef9SDimitry Andric } else { 5006*e8d8bef9SDimitry Andric __kmp_str_buf_print(buffer, " %s", name); 5007*e8d8bef9SDimitry Andric } 5008*e8d8bef9SDimitry Andric __kmp_str_buf_print(buffer, ": %s\n", KMP_I18N_STR(NotDefined)); 5009*e8d8bef9SDimitry Andric } 5010*e8d8bef9SDimitry Andric } // __kmp_stg_print_omp_tool_verbose_init 5011*e8d8bef9SDimitry Andric 50120b57cec5SDimitry Andric #endif 50130b57cec5SDimitry Andric 50140b57cec5SDimitry Andric // Table. 50150b57cec5SDimitry Andric 50160b57cec5SDimitry Andric static kmp_setting_t __kmp_stg_table[] = { 50170b57cec5SDimitry Andric 50180b57cec5SDimitry Andric {"KMP_ALL_THREADS", __kmp_stg_parse_device_thread_limit, NULL, NULL, 0, 0}, 50190b57cec5SDimitry Andric {"KMP_BLOCKTIME", __kmp_stg_parse_blocktime, __kmp_stg_print_blocktime, 50200b57cec5SDimitry Andric NULL, 0, 0}, 50210b57cec5SDimitry Andric {"KMP_USE_YIELD", __kmp_stg_parse_use_yield, __kmp_stg_print_use_yield, 50220b57cec5SDimitry Andric NULL, 0, 0}, 50230b57cec5SDimitry Andric {"KMP_DUPLICATE_LIB_OK", __kmp_stg_parse_duplicate_lib_ok, 50240b57cec5SDimitry Andric __kmp_stg_print_duplicate_lib_ok, NULL, 0, 0}, 50250b57cec5SDimitry Andric {"KMP_LIBRARY", __kmp_stg_parse_wait_policy, __kmp_stg_print_wait_policy, 50260b57cec5SDimitry Andric NULL, 0, 0}, 50270b57cec5SDimitry Andric {"KMP_DEVICE_THREAD_LIMIT", __kmp_stg_parse_device_thread_limit, 50280b57cec5SDimitry Andric __kmp_stg_print_device_thread_limit, NULL, 0, 0}, 50290b57cec5SDimitry Andric #if KMP_USE_MONITOR 50300b57cec5SDimitry Andric {"KMP_MONITOR_STACKSIZE", __kmp_stg_parse_monitor_stacksize, 50310b57cec5SDimitry Andric __kmp_stg_print_monitor_stacksize, NULL, 0, 0}, 50320b57cec5SDimitry Andric #endif 50330b57cec5SDimitry Andric {"KMP_SETTINGS", __kmp_stg_parse_settings, __kmp_stg_print_settings, NULL, 50340b57cec5SDimitry Andric 0, 0}, 50350b57cec5SDimitry Andric {"KMP_STACKOFFSET", __kmp_stg_parse_stackoffset, 50360b57cec5SDimitry Andric __kmp_stg_print_stackoffset, NULL, 0, 0}, 50370b57cec5SDimitry Andric {"KMP_STACKSIZE", __kmp_stg_parse_stacksize, __kmp_stg_print_stacksize, 50380b57cec5SDimitry Andric NULL, 0, 0}, 50390b57cec5SDimitry Andric {"KMP_STACKPAD", __kmp_stg_parse_stackpad, __kmp_stg_print_stackpad, NULL, 50400b57cec5SDimitry Andric 0, 0}, 50410b57cec5SDimitry Andric {"KMP_VERSION", __kmp_stg_parse_version, __kmp_stg_print_version, NULL, 0, 50420b57cec5SDimitry Andric 0}, 50430b57cec5SDimitry Andric {"KMP_WARNINGS", __kmp_stg_parse_warnings, __kmp_stg_print_warnings, NULL, 50440b57cec5SDimitry Andric 0, 0}, 50450b57cec5SDimitry Andric 50460b57cec5SDimitry Andric {"OMP_NESTED", __kmp_stg_parse_nested, __kmp_stg_print_nested, NULL, 0, 0}, 50470b57cec5SDimitry Andric {"OMP_NUM_THREADS", __kmp_stg_parse_num_threads, 50480b57cec5SDimitry Andric __kmp_stg_print_num_threads, NULL, 0, 0}, 50490b57cec5SDimitry Andric {"OMP_STACKSIZE", __kmp_stg_parse_stacksize, __kmp_stg_print_stacksize, 50500b57cec5SDimitry Andric NULL, 0, 0}, 50510b57cec5SDimitry Andric 50520b57cec5SDimitry Andric {"KMP_TASKING", __kmp_stg_parse_tasking, __kmp_stg_print_tasking, NULL, 0, 50530b57cec5SDimitry Andric 0}, 50540b57cec5SDimitry Andric {"KMP_TASK_STEALING_CONSTRAINT", __kmp_stg_parse_task_stealing, 50550b57cec5SDimitry Andric __kmp_stg_print_task_stealing, NULL, 0, 0}, 50560b57cec5SDimitry Andric {"OMP_MAX_ACTIVE_LEVELS", __kmp_stg_parse_max_active_levels, 50570b57cec5SDimitry Andric __kmp_stg_print_max_active_levels, NULL, 0, 0}, 50580b57cec5SDimitry Andric {"OMP_DEFAULT_DEVICE", __kmp_stg_parse_default_device, 50590b57cec5SDimitry Andric __kmp_stg_print_default_device, NULL, 0, 0}, 50600b57cec5SDimitry Andric {"OMP_TARGET_OFFLOAD", __kmp_stg_parse_target_offload, 50610b57cec5SDimitry Andric __kmp_stg_print_target_offload, NULL, 0, 0}, 50620b57cec5SDimitry Andric {"OMP_MAX_TASK_PRIORITY", __kmp_stg_parse_max_task_priority, 50630b57cec5SDimitry Andric __kmp_stg_print_max_task_priority, NULL, 0, 0}, 50640b57cec5SDimitry Andric {"KMP_TASKLOOP_MIN_TASKS", __kmp_stg_parse_taskloop_min_tasks, 50650b57cec5SDimitry Andric __kmp_stg_print_taskloop_min_tasks, NULL, 0, 0}, 50660b57cec5SDimitry Andric {"OMP_THREAD_LIMIT", __kmp_stg_parse_thread_limit, 50670b57cec5SDimitry Andric __kmp_stg_print_thread_limit, NULL, 0, 0}, 50680b57cec5SDimitry Andric {"KMP_TEAMS_THREAD_LIMIT", __kmp_stg_parse_teams_thread_limit, 50690b57cec5SDimitry Andric __kmp_stg_print_teams_thread_limit, NULL, 0, 0}, 50700b57cec5SDimitry Andric {"OMP_WAIT_POLICY", __kmp_stg_parse_wait_policy, 50710b57cec5SDimitry Andric __kmp_stg_print_wait_policy, NULL, 0, 0}, 50720b57cec5SDimitry Andric {"KMP_DISP_NUM_BUFFERS", __kmp_stg_parse_disp_buffers, 50730b57cec5SDimitry Andric __kmp_stg_print_disp_buffers, NULL, 0, 0}, 50740b57cec5SDimitry Andric #if KMP_NESTED_HOT_TEAMS 50750b57cec5SDimitry Andric {"KMP_HOT_TEAMS_MAX_LEVEL", __kmp_stg_parse_hot_teams_level, 50760b57cec5SDimitry Andric __kmp_stg_print_hot_teams_level, NULL, 0, 0}, 50770b57cec5SDimitry Andric {"KMP_HOT_TEAMS_MODE", __kmp_stg_parse_hot_teams_mode, 50780b57cec5SDimitry Andric __kmp_stg_print_hot_teams_mode, NULL, 0, 0}, 50790b57cec5SDimitry Andric #endif // KMP_NESTED_HOT_TEAMS 50800b57cec5SDimitry Andric 50810b57cec5SDimitry Andric #if KMP_HANDLE_SIGNALS 50820b57cec5SDimitry Andric {"KMP_HANDLE_SIGNALS", __kmp_stg_parse_handle_signals, 50830b57cec5SDimitry Andric __kmp_stg_print_handle_signals, NULL, 0, 0}, 50840b57cec5SDimitry Andric #endif 50850b57cec5SDimitry Andric 50860b57cec5SDimitry Andric #if KMP_ARCH_X86 || KMP_ARCH_X86_64 50870b57cec5SDimitry Andric {"KMP_INHERIT_FP_CONTROL", __kmp_stg_parse_inherit_fp_control, 50880b57cec5SDimitry Andric __kmp_stg_print_inherit_fp_control, NULL, 0, 0}, 50890b57cec5SDimitry Andric #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */ 50900b57cec5SDimitry Andric 50910b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 50920b57cec5SDimitry Andric {"GOMP_STACKSIZE", __kmp_stg_parse_stacksize, NULL, NULL, 0, 0}, 50930b57cec5SDimitry Andric #endif 50940b57cec5SDimitry Andric 50950b57cec5SDimitry Andric #ifdef KMP_DEBUG 50960b57cec5SDimitry Andric {"KMP_A_DEBUG", __kmp_stg_parse_a_debug, __kmp_stg_print_a_debug, NULL, 0, 50970b57cec5SDimitry Andric 0}, 50980b57cec5SDimitry Andric {"KMP_B_DEBUG", __kmp_stg_parse_b_debug, __kmp_stg_print_b_debug, NULL, 0, 50990b57cec5SDimitry Andric 0}, 51000b57cec5SDimitry Andric {"KMP_C_DEBUG", __kmp_stg_parse_c_debug, __kmp_stg_print_c_debug, NULL, 0, 51010b57cec5SDimitry Andric 0}, 51020b57cec5SDimitry Andric {"KMP_D_DEBUG", __kmp_stg_parse_d_debug, __kmp_stg_print_d_debug, NULL, 0, 51030b57cec5SDimitry Andric 0}, 51040b57cec5SDimitry Andric {"KMP_E_DEBUG", __kmp_stg_parse_e_debug, __kmp_stg_print_e_debug, NULL, 0, 51050b57cec5SDimitry Andric 0}, 51060b57cec5SDimitry Andric {"KMP_F_DEBUG", __kmp_stg_parse_f_debug, __kmp_stg_print_f_debug, NULL, 0, 51070b57cec5SDimitry Andric 0}, 51080b57cec5SDimitry Andric {"KMP_DEBUG", __kmp_stg_parse_debug, NULL, /* no print */ NULL, 0, 0}, 51090b57cec5SDimitry Andric {"KMP_DEBUG_BUF", __kmp_stg_parse_debug_buf, __kmp_stg_print_debug_buf, 51100b57cec5SDimitry Andric NULL, 0, 0}, 51110b57cec5SDimitry Andric {"KMP_DEBUG_BUF_ATOMIC", __kmp_stg_parse_debug_buf_atomic, 51120b57cec5SDimitry Andric __kmp_stg_print_debug_buf_atomic, NULL, 0, 0}, 51130b57cec5SDimitry Andric {"KMP_DEBUG_BUF_CHARS", __kmp_stg_parse_debug_buf_chars, 51140b57cec5SDimitry Andric __kmp_stg_print_debug_buf_chars, NULL, 0, 0}, 51150b57cec5SDimitry Andric {"KMP_DEBUG_BUF_LINES", __kmp_stg_parse_debug_buf_lines, 51160b57cec5SDimitry Andric __kmp_stg_print_debug_buf_lines, NULL, 0, 0}, 51170b57cec5SDimitry Andric {"KMP_DIAG", __kmp_stg_parse_diag, __kmp_stg_print_diag, NULL, 0, 0}, 51180b57cec5SDimitry Andric 51190b57cec5SDimitry Andric {"KMP_PAR_RANGE", __kmp_stg_parse_par_range_env, 51200b57cec5SDimitry Andric __kmp_stg_print_par_range_env, NULL, 0, 0}, 51210b57cec5SDimitry Andric #endif // KMP_DEBUG 51220b57cec5SDimitry Andric 51230b57cec5SDimitry Andric {"KMP_ALIGN_ALLOC", __kmp_stg_parse_align_alloc, 51240b57cec5SDimitry Andric __kmp_stg_print_align_alloc, NULL, 0, 0}, 51250b57cec5SDimitry Andric 51260b57cec5SDimitry Andric {"KMP_PLAIN_BARRIER", __kmp_stg_parse_barrier_branch_bit, 51270b57cec5SDimitry Andric __kmp_stg_print_barrier_branch_bit, NULL, 0, 0}, 51280b57cec5SDimitry Andric {"KMP_PLAIN_BARRIER_PATTERN", __kmp_stg_parse_barrier_pattern, 51290b57cec5SDimitry Andric __kmp_stg_print_barrier_pattern, NULL, 0, 0}, 51300b57cec5SDimitry Andric {"KMP_FORKJOIN_BARRIER", __kmp_stg_parse_barrier_branch_bit, 51310b57cec5SDimitry Andric __kmp_stg_print_barrier_branch_bit, NULL, 0, 0}, 51320b57cec5SDimitry Andric {"KMP_FORKJOIN_BARRIER_PATTERN", __kmp_stg_parse_barrier_pattern, 51330b57cec5SDimitry Andric __kmp_stg_print_barrier_pattern, NULL, 0, 0}, 51340b57cec5SDimitry Andric #if KMP_FAST_REDUCTION_BARRIER 51350b57cec5SDimitry Andric {"KMP_REDUCTION_BARRIER", __kmp_stg_parse_barrier_branch_bit, 51360b57cec5SDimitry Andric __kmp_stg_print_barrier_branch_bit, NULL, 0, 0}, 51370b57cec5SDimitry Andric {"KMP_REDUCTION_BARRIER_PATTERN", __kmp_stg_parse_barrier_pattern, 51380b57cec5SDimitry Andric __kmp_stg_print_barrier_pattern, NULL, 0, 0}, 51390b57cec5SDimitry Andric #endif 51400b57cec5SDimitry Andric 51410b57cec5SDimitry Andric {"KMP_ABORT_DELAY", __kmp_stg_parse_abort_delay, 51420b57cec5SDimitry Andric __kmp_stg_print_abort_delay, NULL, 0, 0}, 51430b57cec5SDimitry Andric {"KMP_CPUINFO_FILE", __kmp_stg_parse_cpuinfo_file, 51440b57cec5SDimitry Andric __kmp_stg_print_cpuinfo_file, NULL, 0, 0}, 51450b57cec5SDimitry Andric {"KMP_FORCE_REDUCTION", __kmp_stg_parse_force_reduction, 51460b57cec5SDimitry Andric __kmp_stg_print_force_reduction, NULL, 0, 0}, 51470b57cec5SDimitry Andric {"KMP_DETERMINISTIC_REDUCTION", __kmp_stg_parse_force_reduction, 51480b57cec5SDimitry Andric __kmp_stg_print_force_reduction, NULL, 0, 0}, 51490b57cec5SDimitry Andric {"KMP_STORAGE_MAP", __kmp_stg_parse_storage_map, 51500b57cec5SDimitry Andric __kmp_stg_print_storage_map, NULL, 0, 0}, 51510b57cec5SDimitry Andric {"KMP_ALL_THREADPRIVATE", __kmp_stg_parse_all_threadprivate, 51520b57cec5SDimitry Andric __kmp_stg_print_all_threadprivate, NULL, 0, 0}, 51530b57cec5SDimitry Andric {"KMP_FOREIGN_THREADS_THREADPRIVATE", 51540b57cec5SDimitry Andric __kmp_stg_parse_foreign_threads_threadprivate, 51550b57cec5SDimitry Andric __kmp_stg_print_foreign_threads_threadprivate, NULL, 0, 0}, 51560b57cec5SDimitry Andric 51570b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 51580b57cec5SDimitry Andric {"KMP_AFFINITY", __kmp_stg_parse_affinity, __kmp_stg_print_affinity, NULL, 51590b57cec5SDimitry Andric 0, 0}, 51600b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 51610b57cec5SDimitry Andric {"GOMP_CPU_AFFINITY", __kmp_stg_parse_gomp_cpu_affinity, NULL, 51620b57cec5SDimitry Andric /* no print */ NULL, 0, 0}, 51630b57cec5SDimitry Andric #endif /* KMP_GOMP_COMPAT */ 51640b57cec5SDimitry Andric {"OMP_PROC_BIND", __kmp_stg_parse_proc_bind, __kmp_stg_print_proc_bind, 51650b57cec5SDimitry Andric NULL, 0, 0}, 51660b57cec5SDimitry Andric {"OMP_PLACES", __kmp_stg_parse_places, __kmp_stg_print_places, NULL, 0, 0}, 51670b57cec5SDimitry Andric {"KMP_TOPOLOGY_METHOD", __kmp_stg_parse_topology_method, 51680b57cec5SDimitry Andric __kmp_stg_print_topology_method, NULL, 0, 0}, 51690b57cec5SDimitry Andric 51700b57cec5SDimitry Andric #else 51710b57cec5SDimitry Andric 51720b57cec5SDimitry Andric // KMP_AFFINITY is not supported on OS X*, nor is OMP_PLACES. 51730b57cec5SDimitry Andric // OMP_PROC_BIND and proc-bind-var are supported, however. 51740b57cec5SDimitry Andric {"OMP_PROC_BIND", __kmp_stg_parse_proc_bind, __kmp_stg_print_proc_bind, 51750b57cec5SDimitry Andric NULL, 0, 0}, 51760b57cec5SDimitry Andric 51770b57cec5SDimitry Andric #endif // KMP_AFFINITY_SUPPORTED 51780b57cec5SDimitry Andric {"OMP_DISPLAY_AFFINITY", __kmp_stg_parse_display_affinity, 51790b57cec5SDimitry Andric __kmp_stg_print_display_affinity, NULL, 0, 0}, 51800b57cec5SDimitry Andric {"OMP_AFFINITY_FORMAT", __kmp_stg_parse_affinity_format, 51810b57cec5SDimitry Andric __kmp_stg_print_affinity_format, NULL, 0, 0}, 51820b57cec5SDimitry Andric {"KMP_INIT_AT_FORK", __kmp_stg_parse_init_at_fork, 51830b57cec5SDimitry Andric __kmp_stg_print_init_at_fork, NULL, 0, 0}, 51840b57cec5SDimitry Andric {"KMP_SCHEDULE", __kmp_stg_parse_schedule, __kmp_stg_print_schedule, NULL, 51850b57cec5SDimitry Andric 0, 0}, 51860b57cec5SDimitry Andric {"OMP_SCHEDULE", __kmp_stg_parse_omp_schedule, __kmp_stg_print_omp_schedule, 51870b57cec5SDimitry Andric NULL, 0, 0}, 51880b57cec5SDimitry Andric #if KMP_USE_HIER_SCHED 51890b57cec5SDimitry Andric {"KMP_DISP_HAND_THREAD", __kmp_stg_parse_kmp_hand_thread, 51900b57cec5SDimitry Andric __kmp_stg_print_kmp_hand_thread, NULL, 0, 0}, 51910b57cec5SDimitry Andric #endif 51920b57cec5SDimitry Andric {"KMP_ATOMIC_MODE", __kmp_stg_parse_atomic_mode, 51930b57cec5SDimitry Andric __kmp_stg_print_atomic_mode, NULL, 0, 0}, 51940b57cec5SDimitry Andric {"KMP_CONSISTENCY_CHECK", __kmp_stg_parse_consistency_check, 51950b57cec5SDimitry Andric __kmp_stg_print_consistency_check, NULL, 0, 0}, 51960b57cec5SDimitry Andric 51970b57cec5SDimitry Andric #if USE_ITT_BUILD && USE_ITT_NOTIFY 51980b57cec5SDimitry Andric {"KMP_ITT_PREPARE_DELAY", __kmp_stg_parse_itt_prepare_delay, 51990b57cec5SDimitry Andric __kmp_stg_print_itt_prepare_delay, NULL, 0, 0}, 52000b57cec5SDimitry Andric #endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */ 52010b57cec5SDimitry Andric {"KMP_MALLOC_POOL_INCR", __kmp_stg_parse_malloc_pool_incr, 52020b57cec5SDimitry Andric __kmp_stg_print_malloc_pool_incr, NULL, 0, 0}, 52030b57cec5SDimitry Andric {"KMP_GTID_MODE", __kmp_stg_parse_gtid_mode, __kmp_stg_print_gtid_mode, 52040b57cec5SDimitry Andric NULL, 0, 0}, 52050b57cec5SDimitry Andric {"OMP_DYNAMIC", __kmp_stg_parse_omp_dynamic, __kmp_stg_print_omp_dynamic, 52060b57cec5SDimitry Andric NULL, 0, 0}, 52070b57cec5SDimitry Andric {"KMP_DYNAMIC_MODE", __kmp_stg_parse_kmp_dynamic_mode, 52080b57cec5SDimitry Andric __kmp_stg_print_kmp_dynamic_mode, NULL, 0, 0}, 52090b57cec5SDimitry Andric 52100b57cec5SDimitry Andric #ifdef USE_LOAD_BALANCE 52110b57cec5SDimitry Andric {"KMP_LOAD_BALANCE_INTERVAL", __kmp_stg_parse_ld_balance_interval, 52120b57cec5SDimitry Andric __kmp_stg_print_ld_balance_interval, NULL, 0, 0}, 52130b57cec5SDimitry Andric #endif 52140b57cec5SDimitry Andric 52150b57cec5SDimitry Andric {"KMP_NUM_LOCKS_IN_BLOCK", __kmp_stg_parse_lock_block, 52160b57cec5SDimitry Andric __kmp_stg_print_lock_block, NULL, 0, 0}, 52170b57cec5SDimitry Andric {"KMP_LOCK_KIND", __kmp_stg_parse_lock_kind, __kmp_stg_print_lock_kind, 52180b57cec5SDimitry Andric NULL, 0, 0}, 52190b57cec5SDimitry Andric {"KMP_SPIN_BACKOFF_PARAMS", __kmp_stg_parse_spin_backoff_params, 52200b57cec5SDimitry Andric __kmp_stg_print_spin_backoff_params, NULL, 0, 0}, 52210b57cec5SDimitry Andric #if KMP_USE_ADAPTIVE_LOCKS 52220b57cec5SDimitry Andric {"KMP_ADAPTIVE_LOCK_PROPS", __kmp_stg_parse_adaptive_lock_props, 52230b57cec5SDimitry Andric __kmp_stg_print_adaptive_lock_props, NULL, 0, 0}, 52240b57cec5SDimitry Andric #if KMP_DEBUG_ADAPTIVE_LOCKS 52250b57cec5SDimitry Andric {"KMP_SPECULATIVE_STATSFILE", __kmp_stg_parse_speculative_statsfile, 52260b57cec5SDimitry Andric __kmp_stg_print_speculative_statsfile, NULL, 0, 0}, 52270b57cec5SDimitry Andric #endif 52280b57cec5SDimitry Andric #endif // KMP_USE_ADAPTIVE_LOCKS 52290b57cec5SDimitry Andric {"KMP_PLACE_THREADS", __kmp_stg_parse_hw_subset, __kmp_stg_print_hw_subset, 52300b57cec5SDimitry Andric NULL, 0, 0}, 52310b57cec5SDimitry Andric {"KMP_HW_SUBSET", __kmp_stg_parse_hw_subset, __kmp_stg_print_hw_subset, 52320b57cec5SDimitry Andric NULL, 0, 0}, 52330b57cec5SDimitry Andric #if USE_ITT_BUILD 52340b57cec5SDimitry Andric {"KMP_FORKJOIN_FRAMES", __kmp_stg_parse_forkjoin_frames, 52350b57cec5SDimitry Andric __kmp_stg_print_forkjoin_frames, NULL, 0, 0}, 52360b57cec5SDimitry Andric {"KMP_FORKJOIN_FRAMES_MODE", __kmp_stg_parse_forkjoin_frames_mode, 52370b57cec5SDimitry Andric __kmp_stg_print_forkjoin_frames_mode, NULL, 0, 0}, 52380b57cec5SDimitry Andric #endif 52390b57cec5SDimitry Andric {"KMP_ENABLE_TASK_THROTTLING", __kmp_stg_parse_task_throttling, 52400b57cec5SDimitry Andric __kmp_stg_print_task_throttling, NULL, 0, 0}, 52410b57cec5SDimitry Andric 52420b57cec5SDimitry Andric {"OMP_DISPLAY_ENV", __kmp_stg_parse_omp_display_env, 52430b57cec5SDimitry Andric __kmp_stg_print_omp_display_env, NULL, 0, 0}, 52440b57cec5SDimitry Andric {"OMP_CANCELLATION", __kmp_stg_parse_omp_cancellation, 52450b57cec5SDimitry Andric __kmp_stg_print_omp_cancellation, NULL, 0, 0}, 52460b57cec5SDimitry Andric {"OMP_ALLOCATOR", __kmp_stg_parse_allocator, __kmp_stg_print_allocator, 52470b57cec5SDimitry Andric NULL, 0, 0}, 5248*e8d8bef9SDimitry Andric {"LIBOMP_USE_HIDDEN_HELPER_TASK", __kmp_stg_parse_use_hidden_helper, 5249*e8d8bef9SDimitry Andric __kmp_stg_print_use_hidden_helper, NULL, 0, 0}, 5250*e8d8bef9SDimitry Andric {"LIBOMP_NUM_HIDDEN_HELPER_THREADS", 5251*e8d8bef9SDimitry Andric __kmp_stg_parse_num_hidden_helper_threads, 5252*e8d8bef9SDimitry Andric __kmp_stg_print_num_hidden_helper_threads, NULL, 0, 0}, 52530b57cec5SDimitry Andric 52540b57cec5SDimitry Andric #if OMPT_SUPPORT 52550b57cec5SDimitry Andric {"OMP_TOOL", __kmp_stg_parse_omp_tool, __kmp_stg_print_omp_tool, NULL, 0, 52560b57cec5SDimitry Andric 0}, 52570b57cec5SDimitry Andric {"OMP_TOOL_LIBRARIES", __kmp_stg_parse_omp_tool_libraries, 52580b57cec5SDimitry Andric __kmp_stg_print_omp_tool_libraries, NULL, 0, 0}, 5259*e8d8bef9SDimitry Andric {"OMP_TOOL_VERBOSE_INIT", __kmp_stg_parse_omp_tool_verbose_init, 5260*e8d8bef9SDimitry Andric __kmp_stg_print_omp_tool_verbose_init, NULL, 0, 0}, 52610b57cec5SDimitry Andric #endif 52620b57cec5SDimitry Andric 5263*e8d8bef9SDimitry Andric #if KMP_HAVE_MWAIT || KMP_HAVE_UMWAIT 5264*e8d8bef9SDimitry Andric {"KMP_USER_LEVEL_MWAIT", __kmp_stg_parse_user_level_mwait, 5265*e8d8bef9SDimitry Andric __kmp_stg_print_user_level_mwait, NULL, 0, 0}, 5266*e8d8bef9SDimitry Andric {"KMP_MWAIT_HINTS", __kmp_stg_parse_mwait_hints, 5267*e8d8bef9SDimitry Andric __kmp_stg_print_mwait_hints, NULL, 0, 0}, 5268*e8d8bef9SDimitry Andric #endif 52690b57cec5SDimitry Andric {"", NULL, NULL, NULL, 0, 0}}; // settings 52700b57cec5SDimitry Andric 52710b57cec5SDimitry Andric static int const __kmp_stg_count = 52720b57cec5SDimitry Andric sizeof(__kmp_stg_table) / sizeof(kmp_setting_t); 52730b57cec5SDimitry Andric 52740b57cec5SDimitry Andric static inline kmp_setting_t *__kmp_stg_find(char const *name) { 52750b57cec5SDimitry Andric 52760b57cec5SDimitry Andric int i; 52770b57cec5SDimitry Andric if (name != NULL) { 52780b57cec5SDimitry Andric for (i = 0; i < __kmp_stg_count; ++i) { 52790b57cec5SDimitry Andric if (strcmp(__kmp_stg_table[i].name, name) == 0) { 52800b57cec5SDimitry Andric return &__kmp_stg_table[i]; 52810b57cec5SDimitry Andric } 52820b57cec5SDimitry Andric } 52830b57cec5SDimitry Andric } 52840b57cec5SDimitry Andric return NULL; 52850b57cec5SDimitry Andric 52860b57cec5SDimitry Andric } // __kmp_stg_find 52870b57cec5SDimitry Andric 52880b57cec5SDimitry Andric static int __kmp_stg_cmp(void const *_a, void const *_b) { 52890b57cec5SDimitry Andric const kmp_setting_t *a = RCAST(const kmp_setting_t *, _a); 52900b57cec5SDimitry Andric const kmp_setting_t *b = RCAST(const kmp_setting_t *, _b); 52910b57cec5SDimitry Andric 52920b57cec5SDimitry Andric // Process KMP_AFFINITY last. 52930b57cec5SDimitry Andric // It needs to come after OMP_PLACES and GOMP_CPU_AFFINITY. 52940b57cec5SDimitry Andric if (strcmp(a->name, "KMP_AFFINITY") == 0) { 52950b57cec5SDimitry Andric if (strcmp(b->name, "KMP_AFFINITY") == 0) { 52960b57cec5SDimitry Andric return 0; 52970b57cec5SDimitry Andric } 52980b57cec5SDimitry Andric return 1; 52990b57cec5SDimitry Andric } else if (strcmp(b->name, "KMP_AFFINITY") == 0) { 53000b57cec5SDimitry Andric return -1; 53010b57cec5SDimitry Andric } 53020b57cec5SDimitry Andric return strcmp(a->name, b->name); 53030b57cec5SDimitry Andric } // __kmp_stg_cmp 53040b57cec5SDimitry Andric 53050b57cec5SDimitry Andric static void __kmp_stg_init(void) { 53060b57cec5SDimitry Andric 53070b57cec5SDimitry Andric static int initialized = 0; 53080b57cec5SDimitry Andric 53090b57cec5SDimitry Andric if (!initialized) { 53100b57cec5SDimitry Andric 53110b57cec5SDimitry Andric // Sort table. 53120b57cec5SDimitry Andric qsort(__kmp_stg_table, __kmp_stg_count - 1, sizeof(kmp_setting_t), 53130b57cec5SDimitry Andric __kmp_stg_cmp); 53140b57cec5SDimitry Andric 53150b57cec5SDimitry Andric { // Initialize *_STACKSIZE data. 53160b57cec5SDimitry Andric kmp_setting_t *kmp_stacksize = 53170b57cec5SDimitry Andric __kmp_stg_find("KMP_STACKSIZE"); // 1st priority. 53180b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 53190b57cec5SDimitry Andric kmp_setting_t *gomp_stacksize = 53200b57cec5SDimitry Andric __kmp_stg_find("GOMP_STACKSIZE"); // 2nd priority. 53210b57cec5SDimitry Andric #endif 53220b57cec5SDimitry Andric kmp_setting_t *omp_stacksize = 53230b57cec5SDimitry Andric __kmp_stg_find("OMP_STACKSIZE"); // 3rd priority. 53240b57cec5SDimitry Andric 53250b57cec5SDimitry Andric // !!! volatile keyword is Intel(R) C Compiler bug CQ49908 workaround. 53260b57cec5SDimitry Andric // !!! Compiler does not understand rivals is used and optimizes out 53270b57cec5SDimitry Andric // assignments 53280b57cec5SDimitry Andric // !!! rivals[ i ++ ] = ...; 53290b57cec5SDimitry Andric static kmp_setting_t *volatile rivals[4]; 53300b57cec5SDimitry Andric static kmp_stg_ss_data_t kmp_data = {1, CCAST(kmp_setting_t **, rivals)}; 53310b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 53320b57cec5SDimitry Andric static kmp_stg_ss_data_t gomp_data = {1024, 53330b57cec5SDimitry Andric CCAST(kmp_setting_t **, rivals)}; 53340b57cec5SDimitry Andric #endif 53350b57cec5SDimitry Andric static kmp_stg_ss_data_t omp_data = {1024, 53360b57cec5SDimitry Andric CCAST(kmp_setting_t **, rivals)}; 53370b57cec5SDimitry Andric int i = 0; 53380b57cec5SDimitry Andric 53390b57cec5SDimitry Andric rivals[i++] = kmp_stacksize; 53400b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 53410b57cec5SDimitry Andric if (gomp_stacksize != NULL) { 53420b57cec5SDimitry Andric rivals[i++] = gomp_stacksize; 53430b57cec5SDimitry Andric } 53440b57cec5SDimitry Andric #endif 53450b57cec5SDimitry Andric rivals[i++] = omp_stacksize; 53460b57cec5SDimitry Andric rivals[i++] = NULL; 53470b57cec5SDimitry Andric 53480b57cec5SDimitry Andric kmp_stacksize->data = &kmp_data; 53490b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 53500b57cec5SDimitry Andric if (gomp_stacksize != NULL) { 53510b57cec5SDimitry Andric gomp_stacksize->data = &gomp_data; 53520b57cec5SDimitry Andric } 53530b57cec5SDimitry Andric #endif 53540b57cec5SDimitry Andric omp_stacksize->data = &omp_data; 53550b57cec5SDimitry Andric } 53560b57cec5SDimitry Andric 53570b57cec5SDimitry Andric { // Initialize KMP_LIBRARY and OMP_WAIT_POLICY data. 53580b57cec5SDimitry Andric kmp_setting_t *kmp_library = 53590b57cec5SDimitry Andric __kmp_stg_find("KMP_LIBRARY"); // 1st priority. 53600b57cec5SDimitry Andric kmp_setting_t *omp_wait_policy = 53610b57cec5SDimitry Andric __kmp_stg_find("OMP_WAIT_POLICY"); // 2nd priority. 53620b57cec5SDimitry Andric 53630b57cec5SDimitry Andric // !!! volatile keyword is Intel(R) C Compiler bug CQ49908 workaround. 53640b57cec5SDimitry Andric static kmp_setting_t *volatile rivals[3]; 53650b57cec5SDimitry Andric static kmp_stg_wp_data_t kmp_data = {0, CCAST(kmp_setting_t **, rivals)}; 53660b57cec5SDimitry Andric static kmp_stg_wp_data_t omp_data = {1, CCAST(kmp_setting_t **, rivals)}; 53670b57cec5SDimitry Andric int i = 0; 53680b57cec5SDimitry Andric 53690b57cec5SDimitry Andric rivals[i++] = kmp_library; 53700b57cec5SDimitry Andric if (omp_wait_policy != NULL) { 53710b57cec5SDimitry Andric rivals[i++] = omp_wait_policy; 53720b57cec5SDimitry Andric } 53730b57cec5SDimitry Andric rivals[i++] = NULL; 53740b57cec5SDimitry Andric 53750b57cec5SDimitry Andric kmp_library->data = &kmp_data; 53760b57cec5SDimitry Andric if (omp_wait_policy != NULL) { 53770b57cec5SDimitry Andric omp_wait_policy->data = &omp_data; 53780b57cec5SDimitry Andric } 53790b57cec5SDimitry Andric } 53800b57cec5SDimitry Andric 53810b57cec5SDimitry Andric { // Initialize KMP_DEVICE_THREAD_LIMIT and KMP_ALL_THREADS 53820b57cec5SDimitry Andric kmp_setting_t *kmp_device_thread_limit = 53830b57cec5SDimitry Andric __kmp_stg_find("KMP_DEVICE_THREAD_LIMIT"); // 1st priority. 53840b57cec5SDimitry Andric kmp_setting_t *kmp_all_threads = 53850b57cec5SDimitry Andric __kmp_stg_find("KMP_ALL_THREADS"); // 2nd priority. 53860b57cec5SDimitry Andric 53870b57cec5SDimitry Andric // !!! volatile keyword is Intel(R) C Compiler bug CQ49908 workaround. 53880b57cec5SDimitry Andric static kmp_setting_t *volatile rivals[3]; 53890b57cec5SDimitry Andric int i = 0; 53900b57cec5SDimitry Andric 53910b57cec5SDimitry Andric rivals[i++] = kmp_device_thread_limit; 53920b57cec5SDimitry Andric rivals[i++] = kmp_all_threads; 53930b57cec5SDimitry Andric rivals[i++] = NULL; 53940b57cec5SDimitry Andric 53950b57cec5SDimitry Andric kmp_device_thread_limit->data = CCAST(kmp_setting_t **, rivals); 53960b57cec5SDimitry Andric kmp_all_threads->data = CCAST(kmp_setting_t **, rivals); 53970b57cec5SDimitry Andric } 53980b57cec5SDimitry Andric 53990b57cec5SDimitry Andric { // Initialize KMP_HW_SUBSET and KMP_PLACE_THREADS 54000b57cec5SDimitry Andric // 1st priority 54010b57cec5SDimitry Andric kmp_setting_t *kmp_hw_subset = __kmp_stg_find("KMP_HW_SUBSET"); 54020b57cec5SDimitry Andric // 2nd priority 54030b57cec5SDimitry Andric kmp_setting_t *kmp_place_threads = __kmp_stg_find("KMP_PLACE_THREADS"); 54040b57cec5SDimitry Andric 54050b57cec5SDimitry Andric // !!! volatile keyword is Intel(R) C Compiler bug CQ49908 workaround. 54060b57cec5SDimitry Andric static kmp_setting_t *volatile rivals[3]; 54070b57cec5SDimitry Andric int i = 0; 54080b57cec5SDimitry Andric 54090b57cec5SDimitry Andric rivals[i++] = kmp_hw_subset; 54100b57cec5SDimitry Andric rivals[i++] = kmp_place_threads; 54110b57cec5SDimitry Andric rivals[i++] = NULL; 54120b57cec5SDimitry Andric 54130b57cec5SDimitry Andric kmp_hw_subset->data = CCAST(kmp_setting_t **, rivals); 54140b57cec5SDimitry Andric kmp_place_threads->data = CCAST(kmp_setting_t **, rivals); 54150b57cec5SDimitry Andric } 54160b57cec5SDimitry Andric 54170b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 54180b57cec5SDimitry Andric { // Initialize KMP_AFFINITY, GOMP_CPU_AFFINITY, and OMP_PROC_BIND data. 54190b57cec5SDimitry Andric kmp_setting_t *kmp_affinity = 54200b57cec5SDimitry Andric __kmp_stg_find("KMP_AFFINITY"); // 1st priority. 54210b57cec5SDimitry Andric KMP_DEBUG_ASSERT(kmp_affinity != NULL); 54220b57cec5SDimitry Andric 54230b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 54240b57cec5SDimitry Andric kmp_setting_t *gomp_cpu_affinity = 54250b57cec5SDimitry Andric __kmp_stg_find("GOMP_CPU_AFFINITY"); // 2nd priority. 54260b57cec5SDimitry Andric KMP_DEBUG_ASSERT(gomp_cpu_affinity != NULL); 54270b57cec5SDimitry Andric #endif 54280b57cec5SDimitry Andric 54290b57cec5SDimitry Andric kmp_setting_t *omp_proc_bind = 54300b57cec5SDimitry Andric __kmp_stg_find("OMP_PROC_BIND"); // 3rd priority. 54310b57cec5SDimitry Andric KMP_DEBUG_ASSERT(omp_proc_bind != NULL); 54320b57cec5SDimitry Andric 54330b57cec5SDimitry Andric // !!! volatile keyword is Intel(R) C Compiler bug CQ49908 workaround. 54340b57cec5SDimitry Andric static kmp_setting_t *volatile rivals[4]; 54350b57cec5SDimitry Andric int i = 0; 54360b57cec5SDimitry Andric 54370b57cec5SDimitry Andric rivals[i++] = kmp_affinity; 54380b57cec5SDimitry Andric 54390b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 54400b57cec5SDimitry Andric rivals[i++] = gomp_cpu_affinity; 54410b57cec5SDimitry Andric gomp_cpu_affinity->data = CCAST(kmp_setting_t **, rivals); 54420b57cec5SDimitry Andric #endif 54430b57cec5SDimitry Andric 54440b57cec5SDimitry Andric rivals[i++] = omp_proc_bind; 54450b57cec5SDimitry Andric omp_proc_bind->data = CCAST(kmp_setting_t **, rivals); 54460b57cec5SDimitry Andric rivals[i++] = NULL; 54470b57cec5SDimitry Andric 54480b57cec5SDimitry Andric static kmp_setting_t *volatile places_rivals[4]; 54490b57cec5SDimitry Andric i = 0; 54500b57cec5SDimitry Andric 54510b57cec5SDimitry Andric kmp_setting_t *omp_places = __kmp_stg_find("OMP_PLACES"); // 3rd priority. 54520b57cec5SDimitry Andric KMP_DEBUG_ASSERT(omp_places != NULL); 54530b57cec5SDimitry Andric 54540b57cec5SDimitry Andric places_rivals[i++] = kmp_affinity; 54550b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 54560b57cec5SDimitry Andric places_rivals[i++] = gomp_cpu_affinity; 54570b57cec5SDimitry Andric #endif 54580b57cec5SDimitry Andric places_rivals[i++] = omp_places; 54590b57cec5SDimitry Andric omp_places->data = CCAST(kmp_setting_t **, places_rivals); 54600b57cec5SDimitry Andric places_rivals[i++] = NULL; 54610b57cec5SDimitry Andric } 54620b57cec5SDimitry Andric #else 54630b57cec5SDimitry Andric // KMP_AFFINITY not supported, so OMP_PROC_BIND has no rivals. 54640b57cec5SDimitry Andric // OMP_PLACES not supported yet. 54650b57cec5SDimitry Andric #endif // KMP_AFFINITY_SUPPORTED 54660b57cec5SDimitry Andric 54670b57cec5SDimitry Andric { // Initialize KMP_DETERMINISTIC_REDUCTION and KMP_FORCE_REDUCTION data. 54680b57cec5SDimitry Andric kmp_setting_t *kmp_force_red = 54690b57cec5SDimitry Andric __kmp_stg_find("KMP_FORCE_REDUCTION"); // 1st priority. 54700b57cec5SDimitry Andric kmp_setting_t *kmp_determ_red = 54710b57cec5SDimitry Andric __kmp_stg_find("KMP_DETERMINISTIC_REDUCTION"); // 2nd priority. 54720b57cec5SDimitry Andric 54730b57cec5SDimitry Andric // !!! volatile keyword is Intel(R) C Compiler bug CQ49908 workaround. 54740b57cec5SDimitry Andric static kmp_setting_t *volatile rivals[3]; 54750b57cec5SDimitry Andric static kmp_stg_fr_data_t force_data = {1, 54760b57cec5SDimitry Andric CCAST(kmp_setting_t **, rivals)}; 54770b57cec5SDimitry Andric static kmp_stg_fr_data_t determ_data = {0, 54780b57cec5SDimitry Andric CCAST(kmp_setting_t **, rivals)}; 54790b57cec5SDimitry Andric int i = 0; 54800b57cec5SDimitry Andric 54810b57cec5SDimitry Andric rivals[i++] = kmp_force_red; 54820b57cec5SDimitry Andric if (kmp_determ_red != NULL) { 54830b57cec5SDimitry Andric rivals[i++] = kmp_determ_red; 54840b57cec5SDimitry Andric } 54850b57cec5SDimitry Andric rivals[i++] = NULL; 54860b57cec5SDimitry Andric 54870b57cec5SDimitry Andric kmp_force_red->data = &force_data; 54880b57cec5SDimitry Andric if (kmp_determ_red != NULL) { 54890b57cec5SDimitry Andric kmp_determ_red->data = &determ_data; 54900b57cec5SDimitry Andric } 54910b57cec5SDimitry Andric } 54920b57cec5SDimitry Andric 54930b57cec5SDimitry Andric initialized = 1; 54940b57cec5SDimitry Andric } 54950b57cec5SDimitry Andric 54960b57cec5SDimitry Andric // Reset flags. 54970b57cec5SDimitry Andric int i; 54980b57cec5SDimitry Andric for (i = 0; i < __kmp_stg_count; ++i) { 54990b57cec5SDimitry Andric __kmp_stg_table[i].set = 0; 55000b57cec5SDimitry Andric } 55010b57cec5SDimitry Andric 55020b57cec5SDimitry Andric } // __kmp_stg_init 55030b57cec5SDimitry Andric 55040b57cec5SDimitry Andric static void __kmp_stg_parse(char const *name, char const *value) { 55050b57cec5SDimitry Andric // On Windows* OS there are some nameless variables like "C:=C:\" (yeah, 55060b57cec5SDimitry Andric // really nameless, they are presented in environment block as 55070b57cec5SDimitry Andric // "=C:=C\\\x00=D:=D:\\\x00...", so let us skip them. 55080b57cec5SDimitry Andric if (name[0] == 0) { 55090b57cec5SDimitry Andric return; 55100b57cec5SDimitry Andric } 55110b57cec5SDimitry Andric 55120b57cec5SDimitry Andric if (value != NULL) { 55130b57cec5SDimitry Andric kmp_setting_t *setting = __kmp_stg_find(name); 55140b57cec5SDimitry Andric if (setting != NULL) { 55150b57cec5SDimitry Andric setting->parse(name, value, setting->data); 55160b57cec5SDimitry Andric setting->defined = 1; 55170b57cec5SDimitry Andric } 55180b57cec5SDimitry Andric } 55190b57cec5SDimitry Andric 55200b57cec5SDimitry Andric } // __kmp_stg_parse 55210b57cec5SDimitry Andric 55220b57cec5SDimitry Andric static int __kmp_stg_check_rivals( // 0 -- Ok, 1 -- errors found. 55230b57cec5SDimitry Andric char const *name, // Name of variable. 55240b57cec5SDimitry Andric char const *value, // Value of the variable. 55250b57cec5SDimitry Andric kmp_setting_t **rivals // List of rival settings (must include current one). 55260b57cec5SDimitry Andric ) { 55270b57cec5SDimitry Andric 55280b57cec5SDimitry Andric if (rivals == NULL) { 55290b57cec5SDimitry Andric return 0; 55300b57cec5SDimitry Andric } 55310b57cec5SDimitry Andric 55320b57cec5SDimitry Andric // Loop thru higher priority settings (listed before current). 55330b57cec5SDimitry Andric int i = 0; 55340b57cec5SDimitry Andric for (; strcmp(rivals[i]->name, name) != 0; i++) { 55350b57cec5SDimitry Andric KMP_DEBUG_ASSERT(rivals[i] != NULL); 55360b57cec5SDimitry Andric 55370b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 55380b57cec5SDimitry Andric if (rivals[i] == __kmp_affinity_notype) { 55390b57cec5SDimitry Andric // If KMP_AFFINITY is specified without a type name, 55400b57cec5SDimitry Andric // it does not rival OMP_PROC_BIND or GOMP_CPU_AFFINITY. 55410b57cec5SDimitry Andric continue; 55420b57cec5SDimitry Andric } 55430b57cec5SDimitry Andric #endif 55440b57cec5SDimitry Andric 55450b57cec5SDimitry Andric if (rivals[i]->set) { 55460b57cec5SDimitry Andric KMP_WARNING(StgIgnored, name, rivals[i]->name); 55470b57cec5SDimitry Andric return 1; 55480b57cec5SDimitry Andric } 55490b57cec5SDimitry Andric } 55500b57cec5SDimitry Andric 55510b57cec5SDimitry Andric ++i; // Skip current setting. 55520b57cec5SDimitry Andric return 0; 55530b57cec5SDimitry Andric 55540b57cec5SDimitry Andric } // __kmp_stg_check_rivals 55550b57cec5SDimitry Andric 55560b57cec5SDimitry Andric static int __kmp_env_toPrint(char const *name, int flag) { 55570b57cec5SDimitry Andric int rc = 0; 55580b57cec5SDimitry Andric kmp_setting_t *setting = __kmp_stg_find(name); 55590b57cec5SDimitry Andric if (setting != NULL) { 55600b57cec5SDimitry Andric rc = setting->defined; 55610b57cec5SDimitry Andric if (flag >= 0) { 55620b57cec5SDimitry Andric setting->defined = flag; 55630b57cec5SDimitry Andric } 55640b57cec5SDimitry Andric } 55650b57cec5SDimitry Andric return rc; 55660b57cec5SDimitry Andric } 55670b57cec5SDimitry Andric 55680b57cec5SDimitry Andric static void __kmp_aux_env_initialize(kmp_env_blk_t *block) { 55690b57cec5SDimitry Andric 55700b57cec5SDimitry Andric char const *value; 55710b57cec5SDimitry Andric 55720b57cec5SDimitry Andric /* OMP_NUM_THREADS */ 55730b57cec5SDimitry Andric value = __kmp_env_blk_var(block, "OMP_NUM_THREADS"); 55740b57cec5SDimitry Andric if (value) { 55750b57cec5SDimitry Andric ompc_set_num_threads(__kmp_dflt_team_nth); 55760b57cec5SDimitry Andric } 55770b57cec5SDimitry Andric 55780b57cec5SDimitry Andric /* KMP_BLOCKTIME */ 55790b57cec5SDimitry Andric value = __kmp_env_blk_var(block, "KMP_BLOCKTIME"); 55800b57cec5SDimitry Andric if (value) { 55810b57cec5SDimitry Andric kmpc_set_blocktime(__kmp_dflt_blocktime); 55820b57cec5SDimitry Andric } 55830b57cec5SDimitry Andric 55840b57cec5SDimitry Andric /* OMP_NESTED */ 55850b57cec5SDimitry Andric value = __kmp_env_blk_var(block, "OMP_NESTED"); 55860b57cec5SDimitry Andric if (value) { 55870b57cec5SDimitry Andric ompc_set_nested(__kmp_dflt_max_active_levels > 1); 55880b57cec5SDimitry Andric } 55890b57cec5SDimitry Andric 55900b57cec5SDimitry Andric /* OMP_DYNAMIC */ 55910b57cec5SDimitry Andric value = __kmp_env_blk_var(block, "OMP_DYNAMIC"); 55920b57cec5SDimitry Andric if (value) { 55930b57cec5SDimitry Andric ompc_set_dynamic(__kmp_global.g.g_dynamic); 55940b57cec5SDimitry Andric } 55950b57cec5SDimitry Andric } 55960b57cec5SDimitry Andric 55970b57cec5SDimitry Andric void __kmp_env_initialize(char const *string) { 55980b57cec5SDimitry Andric 55990b57cec5SDimitry Andric kmp_env_blk_t block; 56000b57cec5SDimitry Andric int i; 56010b57cec5SDimitry Andric 56020b57cec5SDimitry Andric __kmp_stg_init(); 56030b57cec5SDimitry Andric 56040b57cec5SDimitry Andric // Hack!!! 56050b57cec5SDimitry Andric if (string == NULL) { 56060b57cec5SDimitry Andric // __kmp_max_nth = __kmp_sys_max_nth; 56070b57cec5SDimitry Andric __kmp_threads_capacity = 56080b57cec5SDimitry Andric __kmp_initial_threads_capacity(__kmp_dflt_team_nth_ub); 56090b57cec5SDimitry Andric } 56100b57cec5SDimitry Andric __kmp_env_blk_init(&block, string); 56110b57cec5SDimitry Andric 56120b57cec5SDimitry Andric // update the set flag on all entries that have an env var 56130b57cec5SDimitry Andric for (i = 0; i < block.count; ++i) { 56140b57cec5SDimitry Andric if ((block.vars[i].name == NULL) || (*block.vars[i].name == '\0')) { 56150b57cec5SDimitry Andric continue; 56160b57cec5SDimitry Andric } 56170b57cec5SDimitry Andric if (block.vars[i].value == NULL) { 56180b57cec5SDimitry Andric continue; 56190b57cec5SDimitry Andric } 56200b57cec5SDimitry Andric kmp_setting_t *setting = __kmp_stg_find(block.vars[i].name); 56210b57cec5SDimitry Andric if (setting != NULL) { 56220b57cec5SDimitry Andric setting->set = 1; 56230b57cec5SDimitry Andric } 56240b57cec5SDimitry Andric } 56250b57cec5SDimitry Andric 56260b57cec5SDimitry Andric // We need to know if blocktime was set when processing OMP_WAIT_POLICY 56270b57cec5SDimitry Andric blocktime_str = __kmp_env_blk_var(&block, "KMP_BLOCKTIME"); 56280b57cec5SDimitry Andric 56290b57cec5SDimitry Andric // Special case. If we parse environment, not a string, process KMP_WARNINGS 56300b57cec5SDimitry Andric // first. 56310b57cec5SDimitry Andric if (string == NULL) { 56320b57cec5SDimitry Andric char const *name = "KMP_WARNINGS"; 56330b57cec5SDimitry Andric char const *value = __kmp_env_blk_var(&block, name); 56340b57cec5SDimitry Andric __kmp_stg_parse(name, value); 56350b57cec5SDimitry Andric } 56360b57cec5SDimitry Andric 56370b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 56380b57cec5SDimitry Andric // Special case. KMP_AFFINITY is not a rival to other affinity env vars 56390b57cec5SDimitry Andric // if no affinity type is specified. We want to allow 56400b57cec5SDimitry Andric // KMP_AFFINITY=[no],verbose/[no]warnings/etc. to be enabled when 56410b57cec5SDimitry Andric // specifying the affinity type via GOMP_CPU_AFFINITY or the OMP 4.0 56420b57cec5SDimitry Andric // affinity mechanism. 56430b57cec5SDimitry Andric __kmp_affinity_notype = NULL; 56440b57cec5SDimitry Andric char const *aff_str = __kmp_env_blk_var(&block, "KMP_AFFINITY"); 56450b57cec5SDimitry Andric if (aff_str != NULL) { 56460b57cec5SDimitry Andric // Check if the KMP_AFFINITY type is specified in the string. 56470b57cec5SDimitry Andric // We just search the string for "compact", "scatter", etc. 56480b57cec5SDimitry Andric // without really parsing the string. The syntax of the 56490b57cec5SDimitry Andric // KMP_AFFINITY env var is such that none of the affinity 56500b57cec5SDimitry Andric // type names can appear anywhere other that the type 56510b57cec5SDimitry Andric // specifier, even as substrings. 56520b57cec5SDimitry Andric // 56530b57cec5SDimitry Andric // I can't find a case-insensitive version of strstr on Windows* OS. 56540b57cec5SDimitry Andric // Use the case-sensitive version for now. 56550b57cec5SDimitry Andric 56560b57cec5SDimitry Andric #if KMP_OS_WINDOWS 56570b57cec5SDimitry Andric #define FIND strstr 56580b57cec5SDimitry Andric #else 56590b57cec5SDimitry Andric #define FIND strcasestr 56600b57cec5SDimitry Andric #endif 56610b57cec5SDimitry Andric 56620b57cec5SDimitry Andric if ((FIND(aff_str, "none") == NULL) && 56630b57cec5SDimitry Andric (FIND(aff_str, "physical") == NULL) && 56640b57cec5SDimitry Andric (FIND(aff_str, "logical") == NULL) && 56650b57cec5SDimitry Andric (FIND(aff_str, "compact") == NULL) && 56660b57cec5SDimitry Andric (FIND(aff_str, "scatter") == NULL) && 56670b57cec5SDimitry Andric (FIND(aff_str, "explicit") == NULL) && 56680b57cec5SDimitry Andric (FIND(aff_str, "balanced") == NULL) && 56690b57cec5SDimitry Andric (FIND(aff_str, "disabled") == NULL)) { 56700b57cec5SDimitry Andric __kmp_affinity_notype = __kmp_stg_find("KMP_AFFINITY"); 56710b57cec5SDimitry Andric } else { 56720b57cec5SDimitry Andric // A new affinity type is specified. 56730b57cec5SDimitry Andric // Reset the affinity flags to their default values, 56740b57cec5SDimitry Andric // in case this is called from kmp_set_defaults(). 56750b57cec5SDimitry Andric __kmp_affinity_type = affinity_default; 56760b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_default; 56770b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_default; 56780b57cec5SDimitry Andric __kmp_affinity_respect_mask = affinity_respect_mask_default; 56790b57cec5SDimitry Andric } 56800b57cec5SDimitry Andric #undef FIND 56810b57cec5SDimitry Andric 56820b57cec5SDimitry Andric // Also reset the affinity flags if OMP_PROC_BIND is specified. 56830b57cec5SDimitry Andric aff_str = __kmp_env_blk_var(&block, "OMP_PROC_BIND"); 56840b57cec5SDimitry Andric if (aff_str != NULL) { 56850b57cec5SDimitry Andric __kmp_affinity_type = affinity_default; 56860b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_default; 56870b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_default; 56880b57cec5SDimitry Andric __kmp_affinity_respect_mask = affinity_respect_mask_default; 56890b57cec5SDimitry Andric } 56900b57cec5SDimitry Andric } 56910b57cec5SDimitry Andric 56920b57cec5SDimitry Andric #endif /* KMP_AFFINITY_SUPPORTED */ 56930b57cec5SDimitry Andric 56940b57cec5SDimitry Andric // Set up the nested proc bind type vector. 56950b57cec5SDimitry Andric if (__kmp_nested_proc_bind.bind_types == NULL) { 56960b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types = 56970b57cec5SDimitry Andric (kmp_proc_bind_t *)KMP_INTERNAL_MALLOC(sizeof(kmp_proc_bind_t)); 56980b57cec5SDimitry Andric if (__kmp_nested_proc_bind.bind_types == NULL) { 56990b57cec5SDimitry Andric KMP_FATAL(MemoryAllocFailed); 57000b57cec5SDimitry Andric } 57010b57cec5SDimitry Andric __kmp_nested_proc_bind.size = 1; 57020b57cec5SDimitry Andric __kmp_nested_proc_bind.used = 1; 57030b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 57040b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_default; 57050b57cec5SDimitry Andric #else 57060b57cec5SDimitry Andric // default proc bind is false if affinity not supported 57070b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 57080b57cec5SDimitry Andric #endif 57090b57cec5SDimitry Andric } 57100b57cec5SDimitry Andric 57110b57cec5SDimitry Andric // Set up the affinity format ICV 57120b57cec5SDimitry Andric // Grab the default affinity format string from the message catalog 57130b57cec5SDimitry Andric kmp_msg_t m = 57140b57cec5SDimitry Andric __kmp_msg_format(kmp_i18n_msg_AffFormatDefault, "%P", "%i", "%n", "%A"); 57150b57cec5SDimitry Andric KMP_DEBUG_ASSERT(KMP_STRLEN(m.str) < KMP_AFFINITY_FORMAT_SIZE); 57160b57cec5SDimitry Andric 57170b57cec5SDimitry Andric if (__kmp_affinity_format == NULL) { 57180b57cec5SDimitry Andric __kmp_affinity_format = 57190b57cec5SDimitry Andric (char *)KMP_INTERNAL_MALLOC(sizeof(char) * KMP_AFFINITY_FORMAT_SIZE); 57200b57cec5SDimitry Andric } 57210b57cec5SDimitry Andric KMP_STRCPY_S(__kmp_affinity_format, KMP_AFFINITY_FORMAT_SIZE, m.str); 57220b57cec5SDimitry Andric __kmp_str_free(&m.str); 57230b57cec5SDimitry Andric 57240b57cec5SDimitry Andric // Now process all of the settings. 57250b57cec5SDimitry Andric for (i = 0; i < block.count; ++i) { 57260b57cec5SDimitry Andric __kmp_stg_parse(block.vars[i].name, block.vars[i].value); 57270b57cec5SDimitry Andric } 57280b57cec5SDimitry Andric 57290b57cec5SDimitry Andric // If user locks have been allocated yet, don't reset the lock vptr table. 57300b57cec5SDimitry Andric if (!__kmp_init_user_locks) { 57310b57cec5SDimitry Andric if (__kmp_user_lock_kind == lk_default) { 57320b57cec5SDimitry Andric __kmp_user_lock_kind = lk_queuing; 57330b57cec5SDimitry Andric } 57340b57cec5SDimitry Andric #if KMP_USE_DYNAMIC_LOCK 57350b57cec5SDimitry Andric __kmp_init_dynamic_user_locks(); 57360b57cec5SDimitry Andric #else 57370b57cec5SDimitry Andric __kmp_set_user_lock_vptrs(__kmp_user_lock_kind); 57380b57cec5SDimitry Andric #endif 57390b57cec5SDimitry Andric } else { 57400b57cec5SDimitry Andric KMP_DEBUG_ASSERT(string != NULL); // kmp_set_defaults() was called 57410b57cec5SDimitry Andric KMP_DEBUG_ASSERT(__kmp_user_lock_kind != lk_default); 57420b57cec5SDimitry Andric // Binds lock functions again to follow the transition between different 57430b57cec5SDimitry Andric // KMP_CONSISTENCY_CHECK values. Calling this again is harmless as long 57440b57cec5SDimitry Andric // as we do not allow lock kind changes after making a call to any 57450b57cec5SDimitry Andric // user lock functions (true). 57460b57cec5SDimitry Andric #if KMP_USE_DYNAMIC_LOCK 57470b57cec5SDimitry Andric __kmp_init_dynamic_user_locks(); 57480b57cec5SDimitry Andric #else 57490b57cec5SDimitry Andric __kmp_set_user_lock_vptrs(__kmp_user_lock_kind); 57500b57cec5SDimitry Andric #endif 57510b57cec5SDimitry Andric } 57520b57cec5SDimitry Andric 57530b57cec5SDimitry Andric #if KMP_AFFINITY_SUPPORTED 57540b57cec5SDimitry Andric 57550b57cec5SDimitry Andric if (!TCR_4(__kmp_init_middle)) { 57560b57cec5SDimitry Andric #if KMP_USE_HWLOC 57570b57cec5SDimitry Andric // Force using hwloc when either tiles or numa nodes requested within 57580b57cec5SDimitry Andric // KMP_HW_SUBSET and no other topology method is requested 57590b57cec5SDimitry Andric if ((__kmp_hws_node.num > 0 || __kmp_hws_tile.num > 0 || 57600b57cec5SDimitry Andric __kmp_affinity_gran == affinity_gran_tile) && 57610b57cec5SDimitry Andric (__kmp_affinity_top_method == affinity_top_method_default)) { 57620b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_hwloc; 57630b57cec5SDimitry Andric } 57640b57cec5SDimitry Andric #endif 57650b57cec5SDimitry Andric // Determine if the machine/OS is actually capable of supporting 57660b57cec5SDimitry Andric // affinity. 57670b57cec5SDimitry Andric const char *var = "KMP_AFFINITY"; 57680b57cec5SDimitry Andric KMPAffinity::pick_api(); 57690b57cec5SDimitry Andric #if KMP_USE_HWLOC 57700b57cec5SDimitry Andric // If Hwloc topology discovery was requested but affinity was also disabled, 57710b57cec5SDimitry Andric // then tell user that Hwloc request is being ignored and use default 57720b57cec5SDimitry Andric // topology discovery method. 57730b57cec5SDimitry Andric if (__kmp_affinity_top_method == affinity_top_method_hwloc && 57740b57cec5SDimitry Andric __kmp_affinity_dispatch->get_api_type() != KMPAffinity::HWLOC) { 57750b57cec5SDimitry Andric KMP_WARNING(AffIgnoringHwloc, var); 57760b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_all; 57770b57cec5SDimitry Andric } 57780b57cec5SDimitry Andric #endif 57790b57cec5SDimitry Andric if (__kmp_affinity_type == affinity_disabled) { 57800b57cec5SDimitry Andric KMP_AFFINITY_DISABLE(); 57810b57cec5SDimitry Andric } else if (!KMP_AFFINITY_CAPABLE()) { 57820b57cec5SDimitry Andric __kmp_affinity_dispatch->determine_capable(var); 57830b57cec5SDimitry Andric if (!KMP_AFFINITY_CAPABLE()) { 57840b57cec5SDimitry Andric if (__kmp_affinity_verbose || 57850b57cec5SDimitry Andric (__kmp_affinity_warnings && 57860b57cec5SDimitry Andric (__kmp_affinity_type != affinity_default) && 57870b57cec5SDimitry Andric (__kmp_affinity_type != affinity_none) && 57880b57cec5SDimitry Andric (__kmp_affinity_type != affinity_disabled))) { 57890b57cec5SDimitry Andric KMP_WARNING(AffNotSupported, var); 57900b57cec5SDimitry Andric } 57910b57cec5SDimitry Andric __kmp_affinity_type = affinity_disabled; 57920b57cec5SDimitry Andric __kmp_affinity_respect_mask = 0; 57930b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_fine; 57940b57cec5SDimitry Andric } 57950b57cec5SDimitry Andric } 57960b57cec5SDimitry Andric 57970b57cec5SDimitry Andric if (__kmp_affinity_type == affinity_disabled) { 57980b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 57990b57cec5SDimitry Andric } else if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_true) { 58000b57cec5SDimitry Andric // OMP_PROC_BIND=true maps to OMP_PROC_BIND=spread. 58010b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_spread; 58020b57cec5SDimitry Andric } 58030b57cec5SDimitry Andric 58040b57cec5SDimitry Andric if (KMP_AFFINITY_CAPABLE()) { 58050b57cec5SDimitry Andric 58060b57cec5SDimitry Andric #if KMP_GROUP_AFFINITY 58070b57cec5SDimitry Andric // This checks to see if the initial affinity mask is equal 58080b57cec5SDimitry Andric // to a single windows processor group. If it is, then we do 58090b57cec5SDimitry Andric // not respect the initial affinity mask and instead, use the 58100b57cec5SDimitry Andric // entire machine. 58110b57cec5SDimitry Andric bool exactly_one_group = false; 58120b57cec5SDimitry Andric if (__kmp_num_proc_groups > 1) { 58130b57cec5SDimitry Andric int group; 58140b57cec5SDimitry Andric bool within_one_group; 58150b57cec5SDimitry Andric // Get the initial affinity mask and determine if it is 58160b57cec5SDimitry Andric // contained within a single group. 58170b57cec5SDimitry Andric kmp_affin_mask_t *init_mask; 58180b57cec5SDimitry Andric KMP_CPU_ALLOC(init_mask); 58190b57cec5SDimitry Andric __kmp_get_system_affinity(init_mask, TRUE); 58200b57cec5SDimitry Andric group = __kmp_get_proc_group(init_mask); 58210b57cec5SDimitry Andric within_one_group = (group >= 0); 58220b57cec5SDimitry Andric // If the initial affinity is within a single group, 58230b57cec5SDimitry Andric // then determine if it is equal to that single group. 58240b57cec5SDimitry Andric if (within_one_group) { 58250b57cec5SDimitry Andric DWORD num_bits_in_group = __kmp_GetActiveProcessorCount(group); 58260b57cec5SDimitry Andric DWORD num_bits_in_mask = 0; 58270b57cec5SDimitry Andric for (int bit = init_mask->begin(); bit != init_mask->end(); 58280b57cec5SDimitry Andric bit = init_mask->next(bit)) 58290b57cec5SDimitry Andric num_bits_in_mask++; 58300b57cec5SDimitry Andric exactly_one_group = (num_bits_in_group == num_bits_in_mask); 58310b57cec5SDimitry Andric } 58320b57cec5SDimitry Andric KMP_CPU_FREE(init_mask); 58330b57cec5SDimitry Andric } 58340b57cec5SDimitry Andric 58350b57cec5SDimitry Andric // Handle the Win 64 group affinity stuff if there are multiple 58360b57cec5SDimitry Andric // processor groups, or if the user requested it, and OMP 4.0 58370b57cec5SDimitry Andric // affinity is not in effect. 58380b57cec5SDimitry Andric if (((__kmp_num_proc_groups > 1) && 58390b57cec5SDimitry Andric (__kmp_affinity_type == affinity_default) && 58400b57cec5SDimitry Andric (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default)) || 58410b57cec5SDimitry Andric (__kmp_affinity_top_method == affinity_top_method_group)) { 58420b57cec5SDimitry Andric if (__kmp_affinity_respect_mask == affinity_respect_mask_default && 58430b57cec5SDimitry Andric exactly_one_group) { 58440b57cec5SDimitry Andric __kmp_affinity_respect_mask = FALSE; 58450b57cec5SDimitry Andric } 58460b57cec5SDimitry Andric if (__kmp_affinity_type == affinity_default) { 58470b57cec5SDimitry Andric __kmp_affinity_type = affinity_compact; 58480b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 58490b57cec5SDimitry Andric } 58500b57cec5SDimitry Andric if (__kmp_affinity_top_method == affinity_top_method_default) { 58510b57cec5SDimitry Andric if (__kmp_affinity_gran == affinity_gran_default) { 58520b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_group; 58530b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_group; 58540b57cec5SDimitry Andric } else if (__kmp_affinity_gran == affinity_gran_group) { 58550b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_group; 58560b57cec5SDimitry Andric } else { 58570b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_all; 58580b57cec5SDimitry Andric } 58590b57cec5SDimitry Andric } else if (__kmp_affinity_top_method == affinity_top_method_group) { 58600b57cec5SDimitry Andric if (__kmp_affinity_gran == affinity_gran_default) { 58610b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_group; 58620b57cec5SDimitry Andric } else if ((__kmp_affinity_gran != affinity_gran_group) && 58630b57cec5SDimitry Andric (__kmp_affinity_gran != affinity_gran_fine) && 58640b57cec5SDimitry Andric (__kmp_affinity_gran != affinity_gran_thread)) { 58650b57cec5SDimitry Andric const char *str = NULL; 58660b57cec5SDimitry Andric switch (__kmp_affinity_gran) { 58670b57cec5SDimitry Andric case affinity_gran_core: 58680b57cec5SDimitry Andric str = "core"; 58690b57cec5SDimitry Andric break; 58700b57cec5SDimitry Andric case affinity_gran_package: 58710b57cec5SDimitry Andric str = "package"; 58720b57cec5SDimitry Andric break; 58730b57cec5SDimitry Andric case affinity_gran_node: 58740b57cec5SDimitry Andric str = "node"; 58750b57cec5SDimitry Andric break; 58760b57cec5SDimitry Andric case affinity_gran_tile: 58770b57cec5SDimitry Andric str = "tile"; 58780b57cec5SDimitry Andric break; 58790b57cec5SDimitry Andric default: 58800b57cec5SDimitry Andric KMP_DEBUG_ASSERT(0); 58810b57cec5SDimitry Andric } 58820b57cec5SDimitry Andric KMP_WARNING(AffGranTopGroup, var, str); 58830b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_fine; 58840b57cec5SDimitry Andric } 58850b57cec5SDimitry Andric } else { 58860b57cec5SDimitry Andric if (__kmp_affinity_gran == affinity_gran_default) { 58870b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_core; 58880b57cec5SDimitry Andric } else if (__kmp_affinity_gran == affinity_gran_group) { 58890b57cec5SDimitry Andric const char *str = NULL; 58900b57cec5SDimitry Andric switch (__kmp_affinity_type) { 58910b57cec5SDimitry Andric case affinity_physical: 58920b57cec5SDimitry Andric str = "physical"; 58930b57cec5SDimitry Andric break; 58940b57cec5SDimitry Andric case affinity_logical: 58950b57cec5SDimitry Andric str = "logical"; 58960b57cec5SDimitry Andric break; 58970b57cec5SDimitry Andric case affinity_compact: 58980b57cec5SDimitry Andric str = "compact"; 58990b57cec5SDimitry Andric break; 59000b57cec5SDimitry Andric case affinity_scatter: 59010b57cec5SDimitry Andric str = "scatter"; 59020b57cec5SDimitry Andric break; 59030b57cec5SDimitry Andric case affinity_explicit: 59040b57cec5SDimitry Andric str = "explicit"; 59050b57cec5SDimitry Andric break; 59060b57cec5SDimitry Andric // No MIC on windows, so no affinity_balanced case 59070b57cec5SDimitry Andric default: 59080b57cec5SDimitry Andric KMP_DEBUG_ASSERT(0); 59090b57cec5SDimitry Andric } 59100b57cec5SDimitry Andric KMP_WARNING(AffGranGroupType, var, str); 59110b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_core; 59120b57cec5SDimitry Andric } 59130b57cec5SDimitry Andric } 59140b57cec5SDimitry Andric } else 59150b57cec5SDimitry Andric 59160b57cec5SDimitry Andric #endif /* KMP_GROUP_AFFINITY */ 59170b57cec5SDimitry Andric 59180b57cec5SDimitry Andric { 59190b57cec5SDimitry Andric if (__kmp_affinity_respect_mask == affinity_respect_mask_default) { 59200b57cec5SDimitry Andric #if KMP_GROUP_AFFINITY 59210b57cec5SDimitry Andric if (__kmp_num_proc_groups > 1 && exactly_one_group) { 59220b57cec5SDimitry Andric __kmp_affinity_respect_mask = FALSE; 59230b57cec5SDimitry Andric } else 59240b57cec5SDimitry Andric #endif /* KMP_GROUP_AFFINITY */ 59250b57cec5SDimitry Andric { 59260b57cec5SDimitry Andric __kmp_affinity_respect_mask = TRUE; 59270b57cec5SDimitry Andric } 59280b57cec5SDimitry Andric } 59290b57cec5SDimitry Andric if ((__kmp_nested_proc_bind.bind_types[0] != proc_bind_intel) && 59300b57cec5SDimitry Andric (__kmp_nested_proc_bind.bind_types[0] != proc_bind_default)) { 59310b57cec5SDimitry Andric if (__kmp_affinity_type == affinity_default) { 59320b57cec5SDimitry Andric __kmp_affinity_type = affinity_compact; 59330b57cec5SDimitry Andric __kmp_affinity_dups = FALSE; 59340b57cec5SDimitry Andric } 59350b57cec5SDimitry Andric } else if (__kmp_affinity_type == affinity_default) { 59360b57cec5SDimitry Andric #if KMP_MIC_SUPPORTED 59370b57cec5SDimitry Andric if (__kmp_mic_type != non_mic) { 59380b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel; 59390b57cec5SDimitry Andric } else 59400b57cec5SDimitry Andric #endif 59410b57cec5SDimitry Andric { 59420b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0] = proc_bind_false; 59430b57cec5SDimitry Andric } 59440b57cec5SDimitry Andric #if KMP_MIC_SUPPORTED 59450b57cec5SDimitry Andric if (__kmp_mic_type != non_mic) { 59460b57cec5SDimitry Andric __kmp_affinity_type = affinity_scatter; 59470b57cec5SDimitry Andric } else 59480b57cec5SDimitry Andric #endif 59490b57cec5SDimitry Andric { 59500b57cec5SDimitry Andric __kmp_affinity_type = affinity_none; 59510b57cec5SDimitry Andric } 59520b57cec5SDimitry Andric } 59530b57cec5SDimitry Andric if ((__kmp_affinity_gran == affinity_gran_default) && 59540b57cec5SDimitry Andric (__kmp_affinity_gran_levels < 0)) { 59550b57cec5SDimitry Andric #if KMP_MIC_SUPPORTED 59560b57cec5SDimitry Andric if (__kmp_mic_type != non_mic) { 59570b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_fine; 59580b57cec5SDimitry Andric } else 59590b57cec5SDimitry Andric #endif 59600b57cec5SDimitry Andric { 59610b57cec5SDimitry Andric __kmp_affinity_gran = affinity_gran_core; 59620b57cec5SDimitry Andric } 59630b57cec5SDimitry Andric } 59640b57cec5SDimitry Andric if (__kmp_affinity_top_method == affinity_top_method_default) { 59650b57cec5SDimitry Andric __kmp_affinity_top_method = affinity_top_method_all; 59660b57cec5SDimitry Andric } 59670b57cec5SDimitry Andric } 59680b57cec5SDimitry Andric } 59690b57cec5SDimitry Andric 59700b57cec5SDimitry Andric K_DIAG(1, ("__kmp_affinity_type == %d\n", __kmp_affinity_type)); 59710b57cec5SDimitry Andric K_DIAG(1, ("__kmp_affinity_compact == %d\n", __kmp_affinity_compact)); 59720b57cec5SDimitry Andric K_DIAG(1, ("__kmp_affinity_offset == %d\n", __kmp_affinity_offset)); 59730b57cec5SDimitry Andric K_DIAG(1, ("__kmp_affinity_verbose == %d\n", __kmp_affinity_verbose)); 59740b57cec5SDimitry Andric K_DIAG(1, ("__kmp_affinity_warnings == %d\n", __kmp_affinity_warnings)); 59750b57cec5SDimitry Andric K_DIAG(1, ("__kmp_affinity_respect_mask == %d\n", 59760b57cec5SDimitry Andric __kmp_affinity_respect_mask)); 59770b57cec5SDimitry Andric K_DIAG(1, ("__kmp_affinity_gran == %d\n", __kmp_affinity_gran)); 59780b57cec5SDimitry Andric 59790b57cec5SDimitry Andric KMP_DEBUG_ASSERT(__kmp_affinity_type != affinity_default); 59800b57cec5SDimitry Andric KMP_DEBUG_ASSERT(__kmp_nested_proc_bind.bind_types[0] != proc_bind_default); 59810b57cec5SDimitry Andric K_DIAG(1, ("__kmp_nested_proc_bind.bind_types[0] == %d\n", 59820b57cec5SDimitry Andric __kmp_nested_proc_bind.bind_types[0])); 59830b57cec5SDimitry Andric } 59840b57cec5SDimitry Andric 59850b57cec5SDimitry Andric #endif /* KMP_AFFINITY_SUPPORTED */ 59860b57cec5SDimitry Andric 59870b57cec5SDimitry Andric if (__kmp_version) { 59880b57cec5SDimitry Andric __kmp_print_version_1(); 59890b57cec5SDimitry Andric } 59900b57cec5SDimitry Andric 59910b57cec5SDimitry Andric // Post-initialization step: some env. vars need their value's further 59920b57cec5SDimitry Andric // processing 59930b57cec5SDimitry Andric if (string != NULL) { // kmp_set_defaults() was called 59940b57cec5SDimitry Andric __kmp_aux_env_initialize(&block); 59950b57cec5SDimitry Andric } 59960b57cec5SDimitry Andric 59970b57cec5SDimitry Andric __kmp_env_blk_free(&block); 59980b57cec5SDimitry Andric 59990b57cec5SDimitry Andric KMP_MB(); 60000b57cec5SDimitry Andric 60010b57cec5SDimitry Andric } // __kmp_env_initialize 60020b57cec5SDimitry Andric 60030b57cec5SDimitry Andric void __kmp_env_print() { 60040b57cec5SDimitry Andric 60050b57cec5SDimitry Andric kmp_env_blk_t block; 60060b57cec5SDimitry Andric int i; 60070b57cec5SDimitry Andric kmp_str_buf_t buffer; 60080b57cec5SDimitry Andric 60090b57cec5SDimitry Andric __kmp_stg_init(); 60100b57cec5SDimitry Andric __kmp_str_buf_init(&buffer); 60110b57cec5SDimitry Andric 60120b57cec5SDimitry Andric __kmp_env_blk_init(&block, NULL); 60130b57cec5SDimitry Andric __kmp_env_blk_sort(&block); 60140b57cec5SDimitry Andric 60150b57cec5SDimitry Andric // Print real environment values. 60160b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, "\n%s\n\n", KMP_I18N_STR(UserSettings)); 60170b57cec5SDimitry Andric for (i = 0; i < block.count; ++i) { 60180b57cec5SDimitry Andric char const *name = block.vars[i].name; 60190b57cec5SDimitry Andric char const *value = block.vars[i].value; 60200b57cec5SDimitry Andric if ((KMP_STRLEN(name) > 4 && strncmp(name, "KMP_", 4) == 0) || 60210b57cec5SDimitry Andric strncmp(name, "OMP_", 4) == 0 60220b57cec5SDimitry Andric #ifdef KMP_GOMP_COMPAT 60230b57cec5SDimitry Andric || strncmp(name, "GOMP_", 5) == 0 60240b57cec5SDimitry Andric #endif // KMP_GOMP_COMPAT 60250b57cec5SDimitry Andric ) { 60260b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, " %s=%s\n", name, value); 60270b57cec5SDimitry Andric } 60280b57cec5SDimitry Andric } 60290b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, "\n"); 60300b57cec5SDimitry Andric 60310b57cec5SDimitry Andric // Print internal (effective) settings. 60320b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, "%s\n\n", KMP_I18N_STR(EffectiveSettings)); 60330b57cec5SDimitry Andric for (int i = 0; i < __kmp_stg_count; ++i) { 60340b57cec5SDimitry Andric if (__kmp_stg_table[i].print != NULL) { 60350b57cec5SDimitry Andric __kmp_stg_table[i].print(&buffer, __kmp_stg_table[i].name, 60360b57cec5SDimitry Andric __kmp_stg_table[i].data); 60370b57cec5SDimitry Andric } 60380b57cec5SDimitry Andric } 60390b57cec5SDimitry Andric 60400b57cec5SDimitry Andric __kmp_printf("%s", buffer.str); 60410b57cec5SDimitry Andric 60420b57cec5SDimitry Andric __kmp_env_blk_free(&block); 60430b57cec5SDimitry Andric __kmp_str_buf_free(&buffer); 60440b57cec5SDimitry Andric 60450b57cec5SDimitry Andric __kmp_printf("\n"); 60460b57cec5SDimitry Andric 60470b57cec5SDimitry Andric } // __kmp_env_print 60480b57cec5SDimitry Andric 60490b57cec5SDimitry Andric void __kmp_env_print_2() { 60505ffd83dbSDimitry Andric __kmp_display_env_impl(__kmp_display_env, __kmp_display_env_verbose); 60515ffd83dbSDimitry Andric } // __kmp_env_print_2 60520b57cec5SDimitry Andric 60535ffd83dbSDimitry Andric 60545ffd83dbSDimitry Andric void __kmp_display_env_impl(int display_env, int display_env_verbose) { 60550b57cec5SDimitry Andric kmp_env_blk_t block; 60560b57cec5SDimitry Andric kmp_str_buf_t buffer; 60570b57cec5SDimitry Andric 60580b57cec5SDimitry Andric __kmp_env_format = 1; 60590b57cec5SDimitry Andric 60600b57cec5SDimitry Andric __kmp_stg_init(); 60610b57cec5SDimitry Andric __kmp_str_buf_init(&buffer); 60620b57cec5SDimitry Andric 60630b57cec5SDimitry Andric __kmp_env_blk_init(&block, NULL); 60640b57cec5SDimitry Andric __kmp_env_blk_sort(&block); 60650b57cec5SDimitry Andric 60660b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, "\n%s\n", KMP_I18N_STR(DisplayEnvBegin)); 60670b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, " _OPENMP='%d'\n", __kmp_openmp_version); 60680b57cec5SDimitry Andric 60690b57cec5SDimitry Andric for (int i = 0; i < __kmp_stg_count; ++i) { 60700b57cec5SDimitry Andric if (__kmp_stg_table[i].print != NULL && 60715ffd83dbSDimitry Andric ((display_env && 60720b57cec5SDimitry Andric strncmp(__kmp_stg_table[i].name, "OMP_", 4) == 0) || 60735ffd83dbSDimitry Andric display_env_verbose)) { 60740b57cec5SDimitry Andric __kmp_stg_table[i].print(&buffer, __kmp_stg_table[i].name, 60750b57cec5SDimitry Andric __kmp_stg_table[i].data); 60760b57cec5SDimitry Andric } 60770b57cec5SDimitry Andric } 60780b57cec5SDimitry Andric 60790b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, "%s\n", KMP_I18N_STR(DisplayEnvEnd)); 60800b57cec5SDimitry Andric __kmp_str_buf_print(&buffer, "\n"); 60810b57cec5SDimitry Andric 60820b57cec5SDimitry Andric __kmp_printf("%s", buffer.str); 60830b57cec5SDimitry Andric 60840b57cec5SDimitry Andric __kmp_env_blk_free(&block); 60850b57cec5SDimitry Andric __kmp_str_buf_free(&buffer); 60860b57cec5SDimitry Andric 60870b57cec5SDimitry Andric __kmp_printf("\n"); 60885ffd83dbSDimitry Andric } 60890b57cec5SDimitry Andric 60900b57cec5SDimitry Andric // end of file 6091