diff options
Diffstat (limited to 'final/runtime/test/env/omp_thread_limit.c')
-rw-r--r-- | final/runtime/test/env/omp_thread_limit.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/final/runtime/test/env/omp_thread_limit.c b/final/runtime/test/env/omp_thread_limit.c new file mode 100644 index 0000000..800edc4 --- /dev/null +++ b/final/runtime/test/env/omp_thread_limit.c @@ -0,0 +1,82 @@ +// RUN: %libomp-compile && env OMP_THREAD_LIMIT=4 %libomp-run 4 +// RUN: %libomp-compile && env OMP_THREAD_LIMIT=7 %libomp-run 7 +// +// OMP_THREAD_LIMIT=N should imply that no more than N threads are active in +// a contention group +#include <stdio.h> +#include <string.h> +#include <limits.h> +#include "omp_testsuite.h" + +int failed = 0; + +void usage() { + fprintf(stderr, "usage: omp_thread_limit <n>\n"); +} + +void verify(const char* file_name, int line_number, int team_size) { + int num_threads = omp_get_num_threads(); + if (team_size != num_threads) { +#pragma omp critical(A) + { + char label[256]; + snprintf(label, sizeof(label), "%s:%d", file_name, line_number); + failed = 1; + printf("failed: %s: team_size(%d) != omp_get_num_threads(%d)\n", + label, team_size, num_threads); + } + } +} + +int main(int argc, char** argv) +{ + int cl_thread_limit; + + if (argc != 2) { + usage(); + return 1; + } + cl_thread_limit = atoi(argv[1]); + + omp_set_dynamic(0); + if (omp_get_thread_limit() != cl_thread_limit) { + fprintf(stderr, "omp_get_thread_limit failed with %d, should be%d\n", + omp_get_thread_limit(), cl_thread_limit); + return 1; + } + else if (omp_get_max_threads() > cl_thread_limit) { +#if _OPENMP + int team_size = cl_thread_limit; +#else + int team_size = 1; +#endif + omp_set_num_threads(19); + verify(__FILE__, __LINE__, 1); +#pragma omp parallel + { + verify(__FILE__, __LINE__, team_size); + verify(__FILE__, __LINE__, team_size); + } + verify(__FILE__, __LINE__, 1); + + omp_set_nested(1); +#pragma omp parallel num_threads(3) + { + verify(__FILE__, __LINE__, 3); +#pragma omp master +#pragma omp parallel num_threads(21) + { + verify(__FILE__, __LINE__, team_size-2); + verify(__FILE__, __LINE__, team_size-2); + } + } + verify(__FILE__, __LINE__, 1); + + return failed; + } else { + fprintf(stderr, "This test is not applicable for max num_threads='%d'\n", + omp_get_max_threads()); + return 0; + } + +} |