// RUN: %libomp-compile && env OMP_NUM_THREADS=2,2,2,2,2 OMP_THREAD_LIMIT=16 \ // RUN: %libomp-run #include #include "omp_testsuite.h" // When compiler supports num_threads clause list format and strict modifier, // remove the following and use num_threads clause directly #if defined(__cplusplus) extern "C" { #endif int __kmpc_global_thread_num(void *loc); void __kmpc_push_num_threads_list(void *loc, int gtid, unsigned length, int *list); void __kmpc_push_num_threads_strict(void *loc, int gtid, int nth, int sev, const char *msg); void __kmpc_push_num_threads_list_strict(void *loc, int gtid, unsigned length, int *list, int sev, const char *msg); #if defined(__cplusplus) } #endif int test_omp_parallel_num_threads_strict() { int num_failed = 0; // Test regular runtime warning about exceeding thread limit. // Tolerate whatever value was given. #pragma omp parallel reduction(+ : num_failed) num_threads(22) #pragma omp single num_failed = num_failed + !(omp_get_num_threads() <= 22); // Test with 4 threads and strict -- no problem, no warning. __kmpc_push_num_threads_strict(NULL, __kmpc_global_thread_num(NULL), 4, 1, "This warning shouldn't happen."); #pragma omp parallel reduction(+ : num_failed) // num_threads(strict:4) #pragma omp single num_failed = num_failed + !(omp_get_num_threads() == 4); // Exceed limit, specify user warning message. Tolerate whatever was given. __kmpc_push_num_threads_strict(NULL, __kmpc_global_thread_num(NULL), 20, 1, "User-supplied warning for strict."); #pragma omp parallel reduction(+ : num_failed) // num_threads(strict:20) severity(warning) // message("User-supplied warning for strict.") #pragma omp single num_failed = num_failed + !(omp_get_num_threads() <= 20); // Exceed limit, no user message, use runtime default message for strict. // Tolerate whatever value was given. __kmpc_push_num_threads_strict(NULL, __kmpc_global_thread_num(NULL), 21, 1, NULL); #pragma omp parallel reduction(+ : num_failed) // num_threads(strict:21) #pragma omp single num_failed = num_failed + !(omp_get_num_threads() <= 21); // Exceed limit at top level. Should see user warning message. int threads3[2] = {24, 2}; __kmpc_push_num_threads_list_strict(NULL, __kmpc_global_thread_num(NULL), 2, threads3, 1, "User-supplied warning on strict list."); #pragma omp parallel reduction(+ : num_failed) // num_threads(strict:24,2) severity(warning) // message("User-supplied warning on strict. list") // 1st level { #pragma omp single num_failed = num_failed + !(omp_get_num_threads() <= 24); #pragma omp parallel reduction(+ : num_failed) // 2nd level { #pragma omp single num_failed = num_failed + !(omp_get_num_threads() <= 2); } } // No strict limit at top level. Regular runtime limiting applies. __kmpc_push_num_threads_list(NULL, __kmpc_global_thread_num(NULL), 2, threads3); #pragma omp parallel reduction(+ : num_failed) // num_threads(24,2) // 1st level { #pragma omp single num_failed = num_failed + !(omp_get_num_threads() <= 24); #pragma omp parallel reduction(+ : num_failed) // 2nd level { #pragma omp single num_failed = num_failed + !(omp_get_num_threads() <= 2); } } return (!num_failed); } int main() { int i; int num_failed = 0; for (i = 0; i < REPETITIONS; i++) { if (!test_omp_parallel_num_threads_strict()) { num_failed++; } } return num_failed; }