| // RUN: %libomp-compile && env OMP_NUM_THREADS=2,2,2,2,2 OMP_THREAD_LIMIT=16 \ | |
| // RUN: %libomp-run | |
| #include <stdio.h> | |
| #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; | |
| } |