Deprecate KMP_PLACE_THREADS and rename as KMP_HW_SUBSET

Deprecate KMP_PLACE_THREADS and rename it to KMP_HW_SUBSET due to confusion
about its purpose and function among users.  KMP_HW_SUBSET is an environment
variable which allows users to easily pick a subset of the hardware topology to
use.  e.g., KMP_HW_SUBSET=30c,2t means use 30 cores, 2 threads per core.

Patch by Andrey Churbanov

Differential Revision: http://reviews.llvm.org/D21340

llvm-svn: 272937
This commit is contained in:
Jonathan Peyton 2016-06-16 18:53:48 +00:00
parent ed44cf6ccd
commit b9d28fbeb3
3 changed files with 55 additions and 33 deletions

View File

@ -38,7 +38,7 @@ Language "English"
Country "USA"
LangId "1033"
Version "2"
Revision "20140827"
Revision "20160405"
@ -388,10 +388,10 @@ OBSOLETE "%1$s: granularity=core will be used."
EnvLockWarn "%1$s must be set prior to first OMP lock call or critical section; ignored."
FutexNotSupported "futex system call not supported; %1$s=%2$s ignored."
AffGranUsing "%1$s: granularity=%2$s will be used."
AffThrPlaceInvalid "%1$s: invalid value \"%2$s\", valid format is \"Ns[@N],Nc[@N],Nt "
AffHWSubsetInvalid "%1$s: invalid value \"%2$s\", valid format is \"Ns[@N],Nc[@N],Nt "
"(nSockets@offset, nCores@offset, nTthreads per core)\"."
AffThrPlaceUnsupported "KMP_PLACE_THREADS ignored: unsupported architecture."
AffThrPlaceManyCores "KMP_PLACE_THREADS ignored: too many cores requested."
AffHWSubsetUnsupported "KMP_HW_SUBSET ignored: unsupported architecture."
AffHWSubsetManyCores "KMP_HW_SUBSET ignored: too many cores requested."
SyntaxErrorUsing "%1$s: syntax error, using %2$s."
AdaptiveNotSupported "%1$s: Adaptive locks are not supported; using queuing."
EnvSyntaxError "%1$s: Invalid symbols found. Check the value \"%2$s\"."
@ -399,16 +399,17 @@ EnvSpacesNotAllowed "%1$s: Spaces between digits are not allowed \"%2$s
BoundToOSProcSet "%1$s: pid %2$d thread %3$d bound to OS proc set %4$s"
CnsLoopIncrIllegal "%1$s error: parallel loop increment and condition are inconsistent."
NoGompCancellation "libgomp cancellation is not currently supported."
AffThrPlaceNonUniform "KMP_PLACE_THREADS ignored: non-uniform topology."
AffThrPlaceNonThreeLevel "KMP_PLACE_THREADS ignored: only three-level topology is supported."
AffHWSubsetNonUniform "KMP_HW_SUBSET ignored: non-uniform topology."
AffHWSubsetNonThreeLevel "KMP_HW_SUBSET ignored: only three-level topology is supported."
AffGranTopGroup "%1$s: granularity=%2$s is not supported with KMP_TOPOLOGY_METHOD=group. Using \"granularity=fine\"."
AffGranGroupType "%1$s: granularity=group is not supported with KMP_AFFINITY=%2$s. Using \"granularity=core\"."
AffThrPlaceManySockets "KMP_PLACE_THREADS ignored: too many sockets requested."
AffThrPlaceDeprecated "KMP_PLACE_THREADS \"o\" offset designator deprecated, please use @ prefix for offset value."
AffHWSubsetManySockets "KMP_HW_SUBSET ignored: too many sockets requested."
AffHWSubsetDeprecated "KMP_HW_SUBSET \"o\" offset designator deprecated, please use @ prefix for offset value."
AffUsingHwloc "%1$s: Affinity capable, using hwloc."
AffIgnoringHwloc "%1$s: Ignoring hwloc mechanism."
AffHwlocErrorOccurred "%1$s: Hwloc failed in %2$s. Relying on internal affinity mechanisms."
EnvSerialWarn "%1$s must be set prior to OpenMP runtime library initialization; ignored."
EnvVarDeprecated "%1$s variable deprecated, please use %2$s instead."
# --------------------------------------------------------------------------------------------------

View File

@ -3390,19 +3390,19 @@ __kmp_apply_thread_places(AddrUnsPair **pAddr, int depth)
__kmp_place_num_threads_per_core = __kmp_nThreadsPerCore; // use all HW contexts
if ( !__kmp_affinity_uniform_topology() ) {
KMP_WARNING( AffThrPlaceNonUniform );
KMP_WARNING( AffHWSubsetNonUniform );
return; // don't support non-uniform topology
}
if ( depth != 3 ) {
KMP_WARNING( AffThrPlaceNonThreeLevel );
KMP_WARNING( AffHWSubsetNonThreeLevel );
return; // don't support not-3-level topology
}
if (__kmp_place_socket_offset + __kmp_place_num_sockets > nPackages) {
KMP_WARNING(AffThrPlaceManySockets);
KMP_WARNING(AffHWSubsetManySockets);
return;
}
if ( __kmp_place_core_offset + __kmp_place_num_cores > nCoresPerPkg ) {
KMP_WARNING( AffThrPlaceManyCores );
KMP_WARNING( AffHWSubsetManyCores );
return;
}

View File

@ -4274,11 +4274,11 @@ __kmp_stg_print_speculative_statsfile( kmp_str_buf_t * buffer, char const * name
#endif // KMP_USE_ADAPTIVE_LOCKS
// -------------------------------------------------------------------------------------------------
// KMP_PLACE_THREADS
// KMP_HW_SUBSET (was KMP_PLACE_THREADS)
// -------------------------------------------------------------------------------------------------
static void
__kmp_stg_parse_place_threads( char const * name, char const * value, void * data ) {
__kmp_stg_parse_hw_subset( char const * name, char const * value, void * data ) {
// Value example: 5Cx2Tx15O
// Which means "use 5 cores with offset 15, 2 threads per core"
// AC: extended to sockets level, examples of
@ -4288,12 +4288,32 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
// postfix "o" or prefix @ can be offset designator.
// Note: not all syntax errors are analyzed, some may be skipped.
#define CHECK_DELIM(_x) (*(_x) == ',' || *(_x) == 'x')
static int parsed = 0;
int num;
int single_warning = 0;
int flagS = 0, flagC = 0, flagT = 0, flagSO = 0, flagCO = 0;
const char *next = value;
const char *prev;
if( strcmp(name, "KMP_PLACE_THREADS") == 0 ) {
KMP_INFORM(EnvVarDeprecated,name,"KMP_HW_SUBSET");
if( parsed == 1 ) {
return; // already parsed KMP_HW_SUBSET
}
}
parsed = 1;
SKIP_WS(next); // skip white spaces
if (*next == '\0')
return; // no data provided, retain default values
if( strcmp(name, "KMP_PLACE_THREADS") == 0 ) {
KMP_INFORM(EnvVarDeprecated,name,"KMP_HW_SUBSET");
if( parsed == 1 ) {
return; // already parsed KMP_HW_SUBSET
}
}
parsed = 1;
SKIP_WS(next); // skip white spaces
if (*next == '\0')
return; // no data provided, retain default values
@ -4311,7 +4331,7 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
flagSO = 1;
prev = ++next; // don't allow spaces for simplicity
if (!(*next >= '0' && *next <= '9')) {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
SKIP_DIGITS(next);
@ -4326,7 +4346,7 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
flagCO = 1;
prev = ++next; // don't allow spaces for simplicity
if (!(*next >= '0' && *next <= '9')) {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
SKIP_DIGITS(next);
@ -4345,11 +4365,11 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
__kmp_place_num_cores = num;
return; // the only value provided - set num cores
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
KMP_DEBUG_ASSERT(flagS); // num sockets should already be set here
@ -4376,7 +4396,7 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
flagCO = 1;
prev = ++next; // don't allow spaces for simplicity
if (!(*next >= '0' && *next <= '9')) {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
SKIP_DIGITS(next);
@ -4384,7 +4404,7 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
__kmp_place_core_offset = num;
}
} else if (*next == 'o' || *next == 'O') { // offset specified
KMP_WARNING(AffThrPlaceDeprecated);
KMP_WARNING(AffHWSubsetDeprecated);
single_warning = 1;
if (flagC) { // whether num_cores already specified (sockets skipped)
KMP_DEBUG_ASSERT(!flagCO); // either "o" or @, not both
@ -4405,11 +4425,11 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
__kmp_place_num_threads_per_core = num;
return; // two values provided without letter-designator
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
SKIP_WS(next);
@ -4440,18 +4460,18 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
next++;
//KMP_DEBUG_ASSERT(*next != '@'); // socket offset used "o" designator
} else if (*next == 'o' || *next == 'O') {
KMP_WARNING(AffThrPlaceDeprecated);
KMP_WARNING(AffHWSubsetDeprecated);
single_warning = 1;
KMP_DEBUG_ASSERT(flagC);
//KMP_DEBUG_ASSERT(!flagSO); // socket offset couldn't use @ designator
__kmp_place_core_offset = num;
next++;
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
KMP_DEBUG_ASSERT(flagC);
@ -4471,7 +4491,7 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
SKIP_WS(next);
if (*next == 'o' || *next == 'O') {
if (!single_warning) { // warn once
KMP_WARNING(AffThrPlaceDeprecated);
KMP_WARNING(AffHWSubsetDeprecated);
}
KMP_DEBUG_ASSERT(!flagSO); // socket offset couldn't use @ designator
__kmp_place_core_offset = num;
@ -4482,11 +4502,11 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
flagT = 1;
next++; // can have core-offset specified after num threads
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
return;
}
SKIP_WS(next);
@ -4505,7 +4525,7 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
SKIP_WS(next);
if (*next == 'o' || *next == 'O') {
if (!single_warning) { // warn once
KMP_WARNING(AffThrPlaceDeprecated);
KMP_WARNING(AffHWSubsetDeprecated);
}
KMP_DEBUG_ASSERT(flagT);
KMP_DEBUG_ASSERT(!flagSO); // socket offset couldn't use @ designator
@ -4514,17 +4534,17 @@ __kmp_stg_parse_place_threads( char const * name, char const * value, void * dat
KMP_DEBUG_ASSERT(flagT == 0);
__kmp_place_num_threads_per_core = num;
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
}
} else {
KMP_WARNING(AffThrPlaceInvalid, name, value);
KMP_WARNING(AffHWSubsetInvalid, name, value);
}
return;
#undef CHECK_DELIM
}
static void
__kmp_stg_print_place_threads( kmp_str_buf_t * buffer, char const * name, void * data ) {
__kmp_stg_print_hw_subset( kmp_str_buf_t * buffer, char const * name, void * data ) {
if (__kmp_place_num_sockets + __kmp_place_num_cores + __kmp_place_num_threads_per_core) {
int comma = 0;
kmp_str_buf_t buf;
@ -4775,7 +4795,8 @@ static kmp_setting_t __kmp_stg_table[] = {
{ "KMP_SPECULATIVE_STATSFILE", __kmp_stg_parse_speculative_statsfile,__kmp_stg_print_speculative_statsfile, NULL, 0, 0 },
#endif
#endif // KMP_USE_ADAPTIVE_LOCKS
{ "KMP_PLACE_THREADS", __kmp_stg_parse_place_threads, __kmp_stg_print_place_threads, NULL, 0, 0 },
{ "KMP_PLACE_THREADS", __kmp_stg_parse_hw_subset, __kmp_stg_print_hw_subset, NULL, 0, 0 },
{ "KMP_HW_SUBSET", __kmp_stg_parse_hw_subset, __kmp_stg_print_hw_subset, NULL, 0, 0 },
#if USE_ITT_BUILD
{ "KMP_FORKJOIN_FRAMES", __kmp_stg_parse_forkjoin_frames, __kmp_stg_print_forkjoin_frames, NULL, 0, 0 },
{ "KMP_FORKJOIN_FRAMES_MODE", __kmp_stg_parse_forkjoin_frames_mode,__kmp_stg_print_forkjoin_frames_mode, NULL, 0, 0 },