[OpenMP] Fix misleading warning for OMP_PLACES
When OMP_PLACES contains an invalid value, the warning informs the user
that the fallback is OMP_PLACES=threads, but the actual internal setting
is OMP_PLACES=cores and is detected as such with KMP_SETTINGS=1.
This patch informs the user that OMP_PLACES=cores is being used instead
of OMP_PLACES=threads.
Differential Revision: https://reviews.llvm.org/D95170
GitOrigin-RevId: 8e6713436462daa43d84f8450d07a54f7657c31b
diff --git a/runtime/src/kmp_settings.cpp b/runtime/src/kmp_settings.cpp
index 693ee34..9baf705 100644
--- a/runtime/src/kmp_settings.cpp
+++ b/runtime/src/kmp_settings.cpp
@@ -2576,6 +2576,11 @@
signed := - signed
-----------------------------------------------------------------------------*/
+// Warning to issue for syntax error during parsing of OMP_PLACES
+static inline void __kmp_omp_places_syntax_warn(const char *var) {
+ KMP_WARNING(SyntaxErrorUsing, var, "\"cores\"");
+}
+
static int __kmp_parse_subplace_list(const char *var, const char **scan) {
const char *next;
@@ -2587,7 +2592,7 @@
//
SKIP_WS(*scan);
if ((**scan < '0') || (**scan > '9')) {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
next = *scan;
@@ -2606,7 +2611,7 @@
continue;
}
if (**scan != ':') {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
(*scan)++; // skip ':'
@@ -2614,7 +2619,7 @@
// Read count parameter
SKIP_WS(*scan);
if ((**scan < '0') || (**scan > '9')) {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
next = *scan;
@@ -2633,7 +2638,7 @@
continue;
}
if (**scan != ':') {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
(*scan)++; // skip ':'
@@ -2655,7 +2660,7 @@
}
SKIP_WS(*scan);
if ((**scan < '0') || (**scan > '9')) {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
next = *scan;
@@ -2675,7 +2680,7 @@
continue;
}
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
return TRUE;
@@ -2692,7 +2697,7 @@
return FALSE;
}
if (**scan != '}') {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
(*scan)++; // skip '}'
@@ -2706,7 +2711,7 @@
KMP_ASSERT(proc >= 0);
*scan = next;
} else {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
return TRUE;
@@ -2734,7 +2739,7 @@
continue;
}
if (*scan != ':') {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
scan++; // skip ':'
@@ -2742,7 +2747,7 @@
// Read count parameter
SKIP_WS(scan);
if ((*scan < '0') || (*scan > '9')) {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
next = scan;
@@ -2761,7 +2766,7 @@
continue;
}
if (*scan != ':') {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
scan++; // skip ':'
@@ -2783,7 +2788,7 @@
}
SKIP_WS(scan);
if ((*scan < '0') || (*scan > '9')) {
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
next = scan;
@@ -2803,7 +2808,7 @@
continue;
}
- KMP_WARNING(SyntaxErrorUsing, var, "\"threads\"");
+ __kmp_omp_places_syntax_warn(var);
return FALSE;
}
@@ -2831,14 +2836,6 @@
return;
}
- // If OMP_PROC_BIND is not specified but OMP_PLACES is,
- // then let OMP_PROC_BIND default to true.
- if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) {
- __kmp_nested_proc_bind.bind_types[0] = proc_bind_true;
- }
-
- //__kmp_affinity_num_places = 0;
-
if (__kmp_match_str("threads", scan, &next)) {
scan = next;
__kmp_affinity_type = affinity_compact;
@@ -2881,9 +2878,14 @@
__kmp_affinity_type = affinity_explicit;
__kmp_affinity_gran = affinity_gran_fine;
__kmp_affinity_dups = FALSE;
- if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) {
- __kmp_nested_proc_bind.bind_types[0] = proc_bind_true;
- }
+ } else {
+ // Syntax error fallback
+ __kmp_affinity_type = affinity_compact;
+ __kmp_affinity_gran = affinity_gran_core;
+ __kmp_affinity_dups = FALSE;
+ }
+ if (__kmp_nested_proc_bind.bind_types[0] == proc_bind_default) {
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_true;
}
return;
}
diff --git a/runtime/test/affinity/omp-places-invalid-syntax.c b/runtime/test/affinity/omp-places-invalid-syntax.c
new file mode 100644
index 0000000..31a3185
--- /dev/null
+++ b/runtime/test/affinity/omp-places-invalid-syntax.c
@@ -0,0 +1,11 @@
+// RUN: %libomp-compile && env KMP_SETTINGS=1 OMP_PLACES=invalid %libomp-run 2>&1 | FileCheck %s
+// CHECK-DAG: Effective settings
+// CHECK: OMP_PLACES=
+// CHECK-SAME: cores
+// REQUIRES: affinity
+
+int main() {
+ #pragma omp parallel
+ {}
+ return 0;
+}