// 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 #include #include #include "omp_testsuite.h" int failed = 0; void usage() { fprintf(stderr, "usage: omp_thread_limit \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; } }