diff options
| author | Andrey Churbanov <Andrey.Churbanov@intel.com> | 2019-06-05 16:14:47 +0000 |
|---|---|---|
| committer | Andrey Churbanov <Andrey.Churbanov@intel.com> | 2019-06-05 16:14:47 +0000 |
| commit | d47f5488cf02fa06259a0f8563f684e2d45165c9 (patch) | |
| tree | 456b83d445bfae2315d234f4e856998a235930d2 /openmp/runtime/test | |
| parent | de586bd1fd57f3d4438fa9fdfcc7406727a90004 (diff) | |
| download | bcm5719-llvm-d47f5488cf02fa06259a0f8563f684e2d45165c9.tar.gz bcm5719-llvm-d47f5488cf02fa06259a0f8563f684e2d45165c9.zip | |
Added propagation of not big initial stack size of master thread to workers.
Currently implemented only for non-Windows 64-bit platforms.
Differential Revision: https://reviews.llvm.org/D62488
llvm-svn: 362618
Diffstat (limited to 'openmp/runtime/test')
| -rw-r--r-- | openmp/runtime/test/misc_bugs/stack-propagate.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/openmp/runtime/test/misc_bugs/stack-propagate.c b/openmp/runtime/test/misc_bugs/stack-propagate.c new file mode 100644 index 00000000000..ac289b56ccd --- /dev/null +++ b/openmp/runtime/test/misc_bugs/stack-propagate.c @@ -0,0 +1,65 @@ +// RUN: %libomp-compile-and-run + +// https://bugs.llvm.org/show_bug.cgi?id=26540 requested +// stack size to be propagated from master to workers. +// Library implements propagation of not too big stack +// for Linux x86_64 platform (skipped Windows for now). +// +// The test checks that workers can use more than 4MB +// of stack (4MB - was historical default for +// stack size of worker thread in runtime library). + +#include <stdio.h> +#include <omp.h> +#if !defined(_WIN32) +#include <sys/resource.h> // getrlimit +#endif + +#define STK 4800000 + +double foo(int n, int th) +{ + double arr[n]; + int i; + double res = 0.0; + for (i = 0; i < n; ++i) { + arr[i] = (double)i / (n + 2); + } + for (i = 0; i < n; ++i) { + res += arr[i] / n; + } + return res; +} + +int main(int argc, char *argv[]) +{ +#if defined(_WIN32) + // don't test Windows + printf("stack propagation not implemented, skipping test...\n"); + return 0; +#else + int status; + double val = 0.0; + int m = STK / 8; // > 4800000 bytes per thread + // read stack size of calling thread, save it as default + struct rlimit rlim; + status = getrlimit(RLIMIT_STACK, &rlim); + if (sizeof(void *) > 4 && // do not test 32-bit systems, + status == 0 && rlim.rlim_cur > STK) { // or small initial stack size +#pragma omp parallel reduction(+:val) + { + val += foo(m, omp_get_thread_num()); + } + } else { + printf("too small stack size limit (needs about 8MB), skipping test...\n"); + return 0; + } + if (val > 0.1) { + printf("passed\n"); + return 0; + } else { + printf("failed, val = %f\n", val); + return 1; + } +#endif // _WIN32 +} |

