[OpenMP] libomp: cleanup parsing of OMP_ALLOCATOR env variable.

Differential Revision: https://reviews.llvm.org/D94932
This commit is contained in:
AndreyChurbanov 2021-01-19 16:21:22 +03:00
parent d77a572087
commit a60bc55c69
2 changed files with 68 additions and 90 deletions

View File

@ -3272,6 +3272,7 @@ static void __kmp_stg_print_affinity_format(kmp_str_buf_t *buffer,
}
__kmp_str_buf_print(buffer, "%s'\n", __kmp_affinity_format);
}
// OMP_ALLOCATOR sets default allocator
static void __kmp_stg_parse_allocator(char const *name, char const *value,
void *data) {
@ -3289,104 +3290,65 @@ static void __kmp_stg_parse_allocator(char const *name, char const *value,
*/
const char *buf = value;
const char *next;
int num;
SKIP_WS(buf);
if ((*buf > '0') && (*buf < '9')) {
next = buf;
SKIP_DIGITS(next);
num = __kmp_str_to_int(buf, *next);
KMP_ASSERT(num > 0);
switch (num) {
case 4:
next = buf;
// check HBW first as the only non-default supported
if (__kmp_match_str("omp_high_bw_mem_alloc", buf, &next) ||
__kmp_match_str("4", buf, &next)) {
SKIP_WS(next);
if (*next == '\0') {
if (__kmp_memkind_available) {
__kmp_def_allocator = omp_high_bw_mem_alloc;
return;
} else {
__kmp_msg(kmp_ms_warning,
KMP_MSG(OmpNoAllocator, "omp_high_bw_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
KMP_WARNING(OmpNoAllocator, "omp_high_bw_mem_alloc");
}
break;
case 1:
__kmp_def_allocator = omp_default_mem_alloc;
break;
case 2:
__kmp_msg(kmp_ms_warning,
KMP_MSG(OmpNoAllocator, "omp_large_cap_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
break;
case 3:
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_const_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
break;
case 5:
__kmp_msg(kmp_ms_warning,
KMP_MSG(OmpNoAllocator, "omp_low_lat_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
break;
case 6:
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_cgroup_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
break;
case 7:
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_pteam_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
break;
case 8:
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_thread_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
break;
}
return;
}
next = buf;
if (__kmp_match_str("omp_high_bw_mem_alloc", buf, &next)) {
if (__kmp_memkind_available) {
__kmp_def_allocator = omp_high_bw_mem_alloc;
} else {
__kmp_msg(kmp_ms_warning,
KMP_MSG(OmpNoAllocator, "omp_high_bw_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
} else if (__kmp_match_str("omp_default_mem_alloc", buf, &next) ||
__kmp_match_str("1", buf, &next)) {
// default requested
SKIP_WS(next);
} else if (__kmp_match_str("omp_large_cap_mem_alloc", buf, &next) ||
__kmp_match_str("2", buf, &next)) {
SKIP_WS(next);
if (*next == '\0') {
KMP_WARNING(OmpNoAllocator, "omp_large_cap_mem_alloc");
}
} else if (__kmp_match_str("omp_const_mem_alloc", buf, &next) ||
__kmp_match_str("3", buf, &next)) {
SKIP_WS(next);
if (*next == '\0') {
KMP_WARNING(OmpNoAllocator, "omp_const_mem_alloc");
}
} else if (__kmp_match_str("omp_low_lat_mem_alloc", buf, &next) ||
__kmp_match_str("5", buf, &next)) {
SKIP_WS(next);
if (*next == '\0') {
KMP_WARNING(OmpNoAllocator, "omp_low_lat_mem_alloc");
}
} else if (__kmp_match_str("omp_cgroup_mem_alloc", buf, &next) ||
__kmp_match_str("6", buf, &next)) {
SKIP_WS(next);
if (*next == '\0') {
KMP_WARNING(OmpNoAllocator, "omp_cgroup_mem_alloc");
}
} else if (__kmp_match_str("omp_pteam_mem_alloc", buf, &next) ||
__kmp_match_str("7", buf, &next)) {
SKIP_WS(next);
if (*next == '\0') {
KMP_WARNING(OmpNoAllocator, "omp_pteam_mem_alloc");
}
} else if (__kmp_match_str("omp_thread_mem_alloc", buf, &next) ||
__kmp_match_str("8", buf, &next)) {
SKIP_WS(next);
if (*next == '\0') {
KMP_WARNING(OmpNoAllocator, "omp_thread_mem_alloc");
}
} else if (__kmp_match_str("omp_default_mem_alloc", buf, &next)) {
__kmp_def_allocator = omp_default_mem_alloc;
} else if (__kmp_match_str("omp_large_cap_mem_alloc", buf, &next)) {
__kmp_msg(kmp_ms_warning,
KMP_MSG(OmpNoAllocator, "omp_large_cap_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
} else if (__kmp_match_str("omp_const_mem_alloc", buf, &next)) {
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_const_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
} else if (__kmp_match_str("omp_low_lat_mem_alloc", buf, &next)) {
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_low_lat_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
} else if (__kmp_match_str("omp_cgroup_mem_alloc", buf, &next)) {
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_cgroup_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
} else if (__kmp_match_str("omp_pteam_mem_alloc", buf, &next)) {
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_pteam_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
} else if (__kmp_match_str("omp_thread_mem_alloc", buf, &next)) {
__kmp_msg(kmp_ms_warning, KMP_MSG(OmpNoAllocator, "omp_thread_mem_alloc"),
__kmp_msg_null);
__kmp_def_allocator = omp_default_mem_alloc;
}
buf = next;
SKIP_WS(buf);
if (*buf != '\0') {
KMP_WARNING(ParseExtraCharsWarn, name, buf);
__kmp_def_allocator = omp_default_mem_alloc;
if (next == buf || *next != '\0') {
// either no match or extra symbols present after the matched token
KMP_WARNING(StgInvalidValue, name, value);
}
}

View File

@ -0,0 +1,16 @@
// RUN: %libomp-compile
// RUN: env OMP_ALLOCATOR=111 %libomp-run 2>&1 | FileCheck %s
// RUN: env OMP_ALLOCATOR=omp_default_mem_alloc_xyz %libomp-run 2>&1 | FileCheck %s
// UNSUPPORTED: gcc
// Both invocations of the test should produce (different) warnings:
// OMP: Warning #42: OMP_ALLOCATOR: "111" is an invalid value; ignored.
// OMP: Warning #189: Allocator omp_const_mem_alloc is not available, will use default allocator.
#include <stdio.h>
#include <omp.h>
int main() {
volatile int n = omp_get_max_threads(); // causes library initialization
return 0;
}
// CHECK: {{^OMP: Warning #[0-9]+}}: {{.*$}}