From 781a0896b0efcb788067a5fa6245d0562aefd1dd Mon Sep 17 00:00:00 2001 From: Roman Lebedev Date: Sat, 15 Dec 2018 09:23:39 +0000 Subject: [PATCH] [OpenMP] Fixes for LIBOMP_OMP_VERSION=45/40 Summary: I have discovered this because i wanted to experiment with building static libomp (with openmp-4.0 support only) for debugging purposes. There are three kinds of problems here: 1. `__kmp_compare_and_store_acq()` simply does not exist. It was added in D47903 by @jlpeyton. I'm guessing `__kmp_atomic_compare_store_acq()` was meant. 2. In `__kmp_is_ticket_lock_initialized()`, `lck->lk.initialized` is `std::atomic`, while `lck` is `kmp_ticket_lock_t *`. Naturally, they can't be equality-compared. Either, it should return the value read from `lck->lk.initialized`, or do what `__kmp_is_queuing_lock_initialized()` does, compare the passed pointer with the field in the struct pointed by the pointer. I think the latter is correct-er choice here. 3. Tests were not versioned. They assume that `LIBOMP_OMP_VERSION` is at the latest version. This does not touch LIBOMP_OMP_VERSION=30. That is still broken. Reviewers: jlpeyton, Hahnfeld, AndreyChurbanov Reviewed By: AndreyChurbanov Subscribers: guansong, jfb, openmp-commits, jlpeyton Tags: #openmp Differential Revision: https://reviews.llvm.org/D55496 llvm-svn: 349260 --- openmp/runtime/src/kmp_lock.cpp | 2 +- openmp/runtime/src/kmp_lock.h | 17 +++++++++-------- openmp/runtime/src/kmp_tasking.cpp | 2 ++ openmp/runtime/test/api/omp_alloc.c | 3 +++ openmp/runtime/test/lit.cfg | 9 +++++++++ openmp/runtime/test/lit.site.cfg.in | 1 + .../ompt/misc/control_tool_no_ompt_support.c | 3 +++ .../test/tasking/bug_nested_proxy_task.c | 1 + .../test/tasking/bug_proxy_task_dep_waiting.c | 1 + .../test/tasking/kmp_task_reduction_nest.cpp | 1 + openmp/runtime/test/tasking/kmp_taskloop.c | 1 + openmp/runtime/test/tasking/omp_task_priority.c | 1 + .../test/tasking/omp_taskloop_grainsize.c | 1 + .../test/tasking/omp_taskloop_num_tasks.c | 1 + .../test/worksharing/for/kmp_doacross_check.c | 1 + .../test/worksharing/for/kmp_sch_simd_guided.c | 1 + .../worksharing/for/kmp_sch_simd_runtime_api.c | 1 + .../for/kmp_sch_simd_runtime_guided.c | 1 + .../for/kmp_sch_simd_runtime_static.c | 1 + .../runtime/test/worksharing/for/omp_doacross.c | 1 + 20 files changed, 41 insertions(+), 9 deletions(-) diff --git a/openmp/runtime/src/kmp_lock.cpp b/openmp/runtime/src/kmp_lock.cpp index e045b48c030f..c51640bfba3a 100644 --- a/openmp/runtime/src/kmp_lock.cpp +++ b/openmp/runtime/src/kmp_lock.cpp @@ -3359,7 +3359,7 @@ static void __kmp_init_nested_futex_lock_with_checks(kmp_futex_lock_t *lck) { #endif static int __kmp_is_ticket_lock_initialized(kmp_ticket_lock_t *lck) { - return lck == lck->lk.initialized; + return lck == lck->lk.self; } static void __kmp_init_ticket_lock_with_checks(kmp_ticket_lock_t *lck) { diff --git a/openmp/runtime/src/kmp_lock.h b/openmp/runtime/src/kmp_lock.h index 220236de2f5f..6a88d7bc52af 100644 --- a/openmp/runtime/src/kmp_lock.h +++ b/openmp/runtime/src/kmp_lock.h @@ -649,7 +649,7 @@ extern int (*__kmp_acquire_user_lock_with_checks_)(kmp_user_lock_p lck, } \ } \ if (lck->tas.lk.poll != 0 || \ - !__kmp_compare_and_store_acq(&lck->tas.lk.poll, 0, gtid + 1)) { \ + !__kmp_atomic_compare_store_acq(&lck->tas.lk.poll, 0, gtid + 1)) { \ kmp_uint32 spins; \ KMP_FSYNC_PREPARE(lck); \ KMP_INIT_YIELD(spins); \ @@ -659,8 +659,8 @@ extern int (*__kmp_acquire_user_lock_with_checks_)(kmp_user_lock_p lck, } else { \ KMP_YIELD_SPIN(spins); \ } \ - while (lck->tas.lk.poll != 0 || \ - !__kmp_compare_and_store_acq(&lck->tas.lk.poll, 0, gtid + 1)) { \ + while (lck->tas.lk.poll != 0 || !__kmp_atomic_compare_store_acq( \ + &lck->tas.lk.poll, 0, gtid + 1)) { \ if (TCR_4(__kmp_nth) > \ (__kmp_avail_proc ? __kmp_avail_proc : __kmp_xproc)) { \ KMP_YIELD(TRUE); \ @@ -702,7 +702,7 @@ static inline int __kmp_test_user_lock_with_checks(kmp_user_lock_p lck, } } return ((lck->tas.lk.poll == 0) && - __kmp_compare_and_store_acq(&lck->tas.lk.poll, 0, gtid + 1)); + __kmp_atomic_compare_store_acq(&lck->tas.lk.poll, 0, gtid + 1)); } else { KMP_DEBUG_ASSERT(__kmp_test_user_lock_with_checks_ != NULL); return (*__kmp_test_user_lock_with_checks_)(lck, gtid); @@ -767,7 +767,7 @@ extern int (*__kmp_acquire_nested_user_lock_with_checks_)(kmp_user_lock_p lck, *depth = KMP_LOCK_ACQUIRED_NEXT; \ } else { \ if ((lck->tas.lk.poll != 0) || \ - !__kmp_compare_and_store_acq(&lck->tas.lk.poll, 0, gtid + 1)) { \ + !__kmp_atomic_compare_store_acq(&lck->tas.lk.poll, 0, gtid + 1)) { \ kmp_uint32 spins; \ KMP_FSYNC_PREPARE(lck); \ KMP_INIT_YIELD(spins); \ @@ -777,8 +777,9 @@ extern int (*__kmp_acquire_nested_user_lock_with_checks_)(kmp_user_lock_p lck, } else { \ KMP_YIELD_SPIN(spins); \ } \ - while ((lck->tas.lk.poll != 0) || \ - !__kmp_compare_and_store_acq(&lck->tas.lk.poll, 0, gtid + 1)) { \ + while ( \ + (lck->tas.lk.poll != 0) || \ + !__kmp_atomic_compare_store_acq(&lck->tas.lk.poll, 0, gtid + 1)) { \ if (TCR_4(__kmp_nth) > \ (__kmp_avail_proc ? __kmp_avail_proc : __kmp_xproc)) { \ KMP_YIELD(TRUE); \ @@ -826,7 +827,7 @@ static inline int __kmp_test_nested_user_lock_with_checks(kmp_user_lock_p lck, return ++lck->tas.lk.depth_locked; /* same owner, depth increased */ } retval = ((lck->tas.lk.poll == 0) && - __kmp_compare_and_store_acq(&lck->tas.lk.poll, 0, gtid + 1)); + __kmp_atomic_compare_store_acq(&lck->tas.lk.poll, 0, gtid + 1)); if (retval) { KMP_MB(); lck->tas.lk.depth_locked = 1; diff --git a/openmp/runtime/src/kmp_tasking.cpp b/openmp/runtime/src/kmp_tasking.cpp index daf5ad2db1c6..4db2113ec69b 100644 --- a/openmp/runtime/src/kmp_tasking.cpp +++ b/openmp/runtime/src/kmp_tasking.cpp @@ -811,8 +811,10 @@ static void __kmp_task_finish(kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t *resumed_task) { kmp_taskdata_t *taskdata = KMP_TASK_TO_TASKDATA(task); kmp_info_t *thread = __kmp_threads[gtid]; +#if OMP_45_ENABLED kmp_task_team_t *task_team = thread->th.th_task_team; // might be NULL for serial teams... +#endif // OMP_45_ENABLED kmp_int32 children = 0; KA_TRACE(10, ("__kmp_task_finish(enter): T#%d finishing task %p and resuming " diff --git a/openmp/runtime/test/api/omp_alloc.c b/openmp/runtime/test/api/omp_alloc.c index afad4a504e3a..2002adbec574 100644 --- a/openmp/runtime/test/api/omp_alloc.c +++ b/openmp/runtime/test/api/omp_alloc.c @@ -1,4 +1,7 @@ // RUN: %libomp-compile-and-run + +// REQUIRES: openmp-5.0 + #include #include #include diff --git a/openmp/runtime/test/lit.cfg b/openmp/runtime/test/lit.cfg index 82c3fd46c1de..48d2f2a2190a 100644 --- a/openmp/runtime/test/lit.cfg +++ b/openmp/runtime/test/lit.cfg @@ -91,6 +91,15 @@ if config.has_ompt: # for callback.h config.test_flags += " -I " + config.test_source_root + "/ompt" +if config.libomp_omp_version >= 50: + config.available_features.add("openmp-5.0") + +if config.libomp_omp_version >= 45: + config.available_features.add("openmp-4.5") + +if config.libomp_omp_version >= 40: + config.available_features.add("openmp-4.0") + if 'Linux' in config.operating_system: config.available_features.add("linux") diff --git a/openmp/runtime/test/lit.site.cfg.in b/openmp/runtime/test/lit.site.cfg.in index c2825ee4eab5..0964cfceabc1 100644 --- a/openmp/runtime/test/lit.site.cfg.in +++ b/openmp/runtime/test/lit.site.cfg.in @@ -6,6 +6,7 @@ config.test_compiler_features = @OPENMP_TEST_COMPILER_FEATURES@ config.test_filecheck = "@OPENMP_FILECHECK_EXECUTABLE@" config.test_openmp_flags = "@OPENMP_TEST_OPENMP_FLAGS@" config.test_extra_flags = "@OPENMP_TEST_FLAGS@" +config.libomp_omp_version = @LIBOMP_OMP_VERSION@ config.libomp_obj_root = "@CMAKE_CURRENT_BINARY_DIR@" config.library_dir = "@LIBOMP_LIBRARY_DIR@" config.omp_header_directory = "@LIBOMP_BINARY_DIR@/src" diff --git a/openmp/runtime/test/ompt/misc/control_tool_no_ompt_support.c b/openmp/runtime/test/ompt/misc/control_tool_no_ompt_support.c index ee64da04f0d2..23daf8b313dc 100644 --- a/openmp/runtime/test/ompt/misc/control_tool_no_ompt_support.c +++ b/openmp/runtime/test/ompt/misc/control_tool_no_ompt_support.c @@ -1,4 +1,7 @@ // RUN: %libomp-compile-and-run + +// REQUIRES: openmp-5.0 + #include int main() diff --git a/openmp/runtime/test/tasking/bug_nested_proxy_task.c b/openmp/runtime/test/tasking/bug_nested_proxy_task.c index 6c0082236e06..84e4dfda9cce 100644 --- a/openmp/runtime/test/tasking/bug_nested_proxy_task.c +++ b/openmp/runtime/test/tasking/bug_nested_proxy_task.c @@ -1,4 +1,5 @@ // RUN: %libomp-compile -lpthread && %libomp-run +// REQUIRES: openmp-4.5 // The runtime currently does not get dependency information from GCC. // UNSUPPORTED: gcc diff --git a/openmp/runtime/test/tasking/bug_proxy_task_dep_waiting.c b/openmp/runtime/test/tasking/bug_proxy_task_dep_waiting.c index e6dd895fe1b7..fe8f18db9134 100644 --- a/openmp/runtime/test/tasking/bug_proxy_task_dep_waiting.c +++ b/openmp/runtime/test/tasking/bug_proxy_task_dep_waiting.c @@ -1,4 +1,5 @@ // RUN: %libomp-compile -lpthread && %libomp-run +// REQUIRES: openmp-4.5 // The runtime currently does not get dependency information from GCC. // UNSUPPORTED: gcc diff --git a/openmp/runtime/test/tasking/kmp_task_reduction_nest.cpp b/openmp/runtime/test/tasking/kmp_task_reduction_nest.cpp index 63dffe44dad5..019a9feadfdd 100644 --- a/openmp/runtime/test/tasking/kmp_task_reduction_nest.cpp +++ b/openmp/runtime/test/tasking/kmp_task_reduction_nest.cpp @@ -1,5 +1,6 @@ // RUN: %libomp-cxx-compile-and-run // RUN: %libomp-cxx-compile -DFLG=1 && %libomp-run +// REQUIRES: openmp-5.0 // GCC-5 is needed for OpenMP 4.0 support (taskgroup) // XFAIL: gcc-4 #include diff --git a/openmp/runtime/test/tasking/kmp_taskloop.c b/openmp/runtime/test/tasking/kmp_taskloop.c index 4b137933bb01..359f7a4ae916 100644 --- a/openmp/runtime/test/tasking/kmp_taskloop.c +++ b/openmp/runtime/test/tasking/kmp_taskloop.c @@ -1,5 +1,6 @@ // RUN: %libomp-compile-and-run // RUN: %libomp-compile && env KMP_TASKLOOP_MIN_TASKS=1 %libomp-run +// REQUIRES: openmp-4.5 #include #include #include "omp_my_sleep.h" diff --git a/openmp/runtime/test/tasking/omp_task_priority.c b/openmp/runtime/test/tasking/omp_task_priority.c index 7b6236017334..6acb4a804e8e 100644 --- a/openmp/runtime/test/tasking/omp_task_priority.c +++ b/openmp/runtime/test/tasking/omp_task_priority.c @@ -1,4 +1,5 @@ // RUN: %libomp-compile && env OMP_MAX_TASK_PRIORITY=42 %libomp-run +// REQUIRES: openmp-4.5 // Test OMP 4.5 task priorities // Currently only API function and envirable parsing implemented. // Test environment sets envirable: OMP_MAX_TASK_PRIORITY=42 as tested below. diff --git a/openmp/runtime/test/tasking/omp_taskloop_grainsize.c b/openmp/runtime/test/tasking/omp_taskloop_grainsize.c index 0833073efb24..c5756a481a18 100644 --- a/openmp/runtime/test/tasking/omp_taskloop_grainsize.c +++ b/openmp/runtime/test/tasking/omp_taskloop_grainsize.c @@ -1,5 +1,6 @@ // RUN: %libomp-compile-and-run // RUN: %libomp-compile && env KMP_TASKLOOP_MIN_TASKS=1 %libomp-run +// REQUIRES: openmp-4.5 // These compilers don't support the taskloop construct // UNSUPPORTED: gcc-4, gcc-5, icc-16 diff --git a/openmp/runtime/test/tasking/omp_taskloop_num_tasks.c b/openmp/runtime/test/tasking/omp_taskloop_num_tasks.c index 7c3c7042af38..75efea6e1c64 100644 --- a/openmp/runtime/test/tasking/omp_taskloop_num_tasks.c +++ b/openmp/runtime/test/tasking/omp_taskloop_num_tasks.c @@ -1,5 +1,6 @@ // RUN: %libomp-compile-and-run // RUN: %libomp-compile && env KMP_TASKLOOP_MIN_TASKS=1 %libomp-run +// REQUIRES: openmp-4.5 // These compilers don't support the taskloop construct // UNSUPPORTED: gcc-4, gcc-5, icc-16 diff --git a/openmp/runtime/test/worksharing/for/kmp_doacross_check.c b/openmp/runtime/test/worksharing/for/kmp_doacross_check.c index 59b61e32eb16..4eea328833a8 100644 --- a/openmp/runtime/test/worksharing/for/kmp_doacross_check.c +++ b/openmp/runtime/test/worksharing/for/kmp_doacross_check.c @@ -1,4 +1,5 @@ // RUN: %libomp-compile-and-run +// REQUIRES: openmp-4.5 // UNSUPPORTED: gcc // This test is incompatible with gcc because of the explicit call to // __kmpc_doacross_fini(). gcc relies on an implicit call to this function diff --git a/openmp/runtime/test/worksharing/for/kmp_sch_simd_guided.c b/openmp/runtime/test/worksharing/for/kmp_sch_simd_guided.c index 5c6f94bc729a..6cf5d2ff8224 100644 --- a/openmp/runtime/test/worksharing/for/kmp_sch_simd_guided.c +++ b/openmp/runtime/test/worksharing/for/kmp_sch_simd_guided.c @@ -1,4 +1,5 @@ // RUN: %libomp-compile-and-run +// REQUIRES: openmp-4.5 /* Test for the 'schedule(simd:guided)' clause. Compiler needs to generate a dynamic dispatching and pass the schedule diff --git a/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_api.c b/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_api.c index 987a5c0d4594..8b5f34a8c3fd 100644 --- a/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_api.c +++ b/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_api.c @@ -1,4 +1,5 @@ // RUN: %libomp-compile-and-run +// REQUIRES: openmp-4.5 // The test checks schedule(simd:runtime) // in combination with omp_set_schedule() diff --git a/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_guided.c b/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_guided.c index 5dfaf24185e7..142e9b363345 100644 --- a/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_guided.c +++ b/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_guided.c @@ -6,6 +6,7 @@ // RUN: env OMP_SCHEDULE=dynamic,1 %libomp-run 1 // RUN: env OMP_SCHEDULE=dynamic,2 %libomp-run 2 // RUN: env OMP_SCHEDULE=auto %libomp-run +// REQUIRES: openmp-4.5 // The test checks schedule(simd:runtime) // in combination with OMP_SCHEDULE=guided[,chunk] diff --git a/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_static.c b/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_static.c index d76046bac1f8..e2c878fe79f3 100644 --- a/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_static.c +++ b/openmp/runtime/test/worksharing/for/kmp_sch_simd_runtime_static.c @@ -1,5 +1,6 @@ // RUN: %libomp-compile && %libomp-run // RUN: %libomp-run 1 && %libomp-run 2 +// REQUIRES: openmp-4.5 // The test checks schedule(simd:runtime) // in combination with OMP_SCHEDULE=static[,chunk] diff --git a/openmp/runtime/test/worksharing/for/omp_doacross.c b/openmp/runtime/test/worksharing/for/omp_doacross.c index 364430675d64..32e8e82d331d 100644 --- a/openmp/runtime/test/worksharing/for/omp_doacross.c +++ b/openmp/runtime/test/worksharing/for/omp_doacross.c @@ -1,4 +1,5 @@ // RUN: %libomp-compile-and-run +// REQUIRES: openmp-4.5 // XFAIL: gcc-4, gcc-5, clang-3.7, clang-3.8, icc-15, icc-16 #include #include -- GitLab