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