// 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 #include #if !defined(_WIN32) #include // 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 }