diff options
author | AndreyChurbanov <andrey.churbanov@intel.com> | 2019-11-27 15:26:51 +0300 |
---|---|---|
committer | AndreyChurbanov <andrey.churbanov@intel.com> | 2019-11-27 15:26:51 +0300 |
commit | bd2fb41c2dd537d1ab0dbce5795a1fef3de6cd52 (patch) | |
tree | 54efca4c984ed33ea32a0056e3a7ddbc4202b852 /openmp/runtime | |
parent | 755dfaa1048ef216cfdce68b05185d8ab1b00ae7 (diff) | |
download | bcm5719-llvm-bd2fb41c2dd537d1ab0dbce5795a1fef3de6cd52.tar.gz bcm5719-llvm-bd2fb41c2dd537d1ab0dbce5795a1fef3de6cd52.zip |
[openmp] Fixed nonmonotonic schedule when #threads > #chunks in a loop.
Differential Revision: https://reviews.llvm.org/D70713
Diffstat (limited to 'openmp/runtime')
-rw-r--r-- | openmp/runtime/src/kmp_dispatch.cpp | 15 | ||||
-rw-r--r-- | openmp/runtime/test/worksharing/for/omp_nonmonotonic_dynamic1.c | 40 |
2 files changed, 48 insertions, 7 deletions
diff --git a/openmp/runtime/src/kmp_dispatch.cpp b/openmp/runtime/src/kmp_dispatch.cpp index 161a2c69635..aee1a649741 100644 --- a/openmp/runtime/src/kmp_dispatch.cpp +++ b/openmp/runtime/src/kmp_dispatch.cpp @@ -379,14 +379,15 @@ void __kmp_dispatch_init_algorithm(ident_t *loc, int gtid, } break; } else { - KD_TRACE(100, ("__kmp_dispatch_init_algorithm: T#%d falling-through to " - "kmp_sch_static_balanced\n", - gtid)); - schedule = kmp_sch_static_balanced; - /* too few iterations: fall-through to kmp_sch_static_balanced */ + /* too few chunks: switching to kmp_sch_dynamic_chunked */ + schedule = kmp_sch_dynamic_chunked; + KD_TRACE(100, ("__kmp_dispatch_init_algorithm: T#%d switching to " + "kmp_sch_dynamic_chunked\n", + gtid)); + if (pr->u.p.parm1 <= 0) + pr->u.p.parm1 = KMP_DEFAULT_CHUNK; + break; } // if - /* FALL-THROUGH to static balanced */ - KMP_FALLTHROUGH(); } // case #endif case kmp_sch_static_balanced: { diff --git a/openmp/runtime/test/worksharing/for/omp_nonmonotonic_dynamic1.c b/openmp/runtime/test/worksharing/for/omp_nonmonotonic_dynamic1.c new file mode 100644 index 00000000000..0691353fe59 --- /dev/null +++ b/openmp/runtime/test/worksharing/for/omp_nonmonotonic_dynamic1.c @@ -0,0 +1,40 @@ +// RUN: %libomp-compile +// RUN: env OMP_SCHEDULE=nonmonotonic:dynamic,10 %libomp-run + +// The test checks iterations distribution for OMP 5.0 nonmonotonic OMP_SCHEDULE +// case #threads > #chunks (fallback to monotonic dynamic) + +#include <stdio.h> +#include <omp.h> + +#define ITERS 100 +#define CHUNK 10 +int err = 0; + +int main(int argc, char **argv) { + int i, ch, it[ITERS]; + omp_set_num_threads(16); // #threads is bigger than #chunks +#pragma omp parallel for schedule(runtime) + for (i = 0; i < ITERS; ++i) { + it[i] = omp_get_thread_num(); + } + // check that each chunk executed by single thread + for (ch = 0; ch < ITERS/CHUNK; ++ch) { + int iter = ch * CHUNK; + int nt = it[iter]; // thread number + for (i = 1; i < CHUNK; ++i) { +#if _DEBUG + printf("iter %d: (%d %d)\n", iter + i, nt, it[iter + i]); +#endif + if (nt != it[iter + i]) { + err++; + } + } + } + if (err > 0) { + printf("Failed, err = %d\n", err); + return 1; + } + printf("Passed\n"); + return 0; +} |