| // 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 | |
| } |