// RUN: %libomp-compile // RUN: env OMP_WAIT_POLICY=passive OMP_NUM_THREADS=32 %libomp-run 0 134217728 1 134217728 // // This test makes sure that large chunks sizes are handled correctly // including internal runtime calculations which incorporate the chunk size // Only one thread should execute all iterations. #include #include #include "omp_testsuite.h" typedef unsigned long long ull_t; int main(int argc, char **argv) { int i, j, lb, ub, stride, nthreads, actual_nthreads, chunk; ull_t num_iters = 0; ull_t counted_iters = 0; int errs = 0; if (argc != 5) { fprintf(stderr, "error: incorrect number of arguments\n"); fprintf(stderr, "usage: %s \n", argv[0]); exit(EXIT_FAILURE); } lb = atoi(argv[1]); ub = atoi(argv[2]); stride = atoi(argv[3]); chunk = atoi(argv[4]); nthreads = omp_get_max_threads(); if (lb >= ub) { fprintf(stderr, "error: lb must be less than ub\n"); exit(EXIT_FAILURE); } if (stride <= 0) { fprintf(stderr, "error: stride must be positive integer\n"); exit(EXIT_FAILURE); } if (chunk <= 0) { fprintf(stderr, "error: chunk must be positive integer\n"); exit(EXIT_FAILURE); } for (i = lb; i < ub; i += stride) num_iters++; #pragma omp parallel num_threads(nthreads) { #pragma omp single actual_nthreads = omp_get_num_threads(); if (actual_nthreads != nthreads) { printf("did not create enough threads, skipping test.\n"); } else { #pragma omp for schedule(dynamic, chunk) for (i = lb; i < ub; i += stride) { counted_iters++; } } } // Check that the number of iterations executed is correct if (actual_nthreads == nthreads && counted_iters != num_iters) { fprintf(stderr, "error: wrong number of final iterations counted! " "num_iters=%llu, counted_iters=%llu\n", num_iters, counted_iters); exit(EXIT_FAILURE); } return EXIT_SUCCESS; }