| 1 | // RUN: %libomp-compile && env OMP_NUM_THREADS=2,2,2,2,2 OMP_THREAD_LIMIT=16 \ |
| 2 | // RUN: %libomp-run |
| 3 | #include <stdio.h> |
| 4 | #include "omp_testsuite.h" |
| 5 | |
| 6 | // When compiler supports num_threads clause list format and strict modifier, |
| 7 | // remove the following and use num_threads clause directly |
| 8 | #if defined(__cplusplus) |
| 9 | extern "C" { |
| 10 | #endif |
| 11 | |
| 12 | int __kmpc_global_thread_num(void *loc); |
| 13 | void __kmpc_push_num_threads_list(void *loc, int gtid, unsigned length, |
| 14 | int *list); |
| 15 | void __kmpc_push_num_threads_strict(void *loc, int gtid, int nth, int sev, |
| 16 | const char *msg); |
| 17 | void __kmpc_push_num_threads_list_strict(void *loc, int gtid, unsigned length, |
| 18 | int *list, int sev, const char *msg); |
| 19 | |
| 20 | #if defined(__cplusplus) |
| 21 | } |
| 22 | #endif |
| 23 | |
| 24 | int test_omp_parallel_num_threads_strict() { |
| 25 | int num_failed = 0; |
| 26 | |
| 27 | // Test regular runtime warning about exceeding thread limit. |
| 28 | // Tolerate whatever value was given. |
| 29 | #pragma omp parallel reduction(+ : num_failed) num_threads(22) |
| 30 | #pragma omp single |
| 31 | num_failed = num_failed + !(omp_get_num_threads() <= 22); |
| 32 | |
| 33 | // Test with 4 threads and strict -- no problem, no warning. |
| 34 | __kmpc_push_num_threads_strict(NULL, gtid: __kmpc_global_thread_num(NULL), nth: 4, sev: 1, |
| 35 | msg: "This warning shouldn't happen." ); |
| 36 | #pragma omp parallel reduction(+ : num_failed) // num_threads(strict:4) |
| 37 | #pragma omp single |
| 38 | num_failed = num_failed + !(omp_get_num_threads() == 4); |
| 39 | |
| 40 | // Exceed limit, specify user warning message. Tolerate whatever was given. |
| 41 | __kmpc_push_num_threads_strict(NULL, gtid: __kmpc_global_thread_num(NULL), nth: 20, sev: 1, |
| 42 | msg: "User-supplied warning for strict." ); |
| 43 | #pragma omp parallel reduction(+ : num_failed) |
| 44 | // num_threads(strict:20) severity(warning) |
| 45 | // message("User-supplied warning for strict.") |
| 46 | #pragma omp single |
| 47 | num_failed = num_failed + !(omp_get_num_threads() <= 20); |
| 48 | |
| 49 | // Exceed limit, no user message, use runtime default message for strict. |
| 50 | // Tolerate whatever value was given. |
| 51 | __kmpc_push_num_threads_strict(NULL, gtid: __kmpc_global_thread_num(NULL), nth: 21, sev: 1, |
| 52 | NULL); |
| 53 | #pragma omp parallel reduction(+ : num_failed) // num_threads(strict:21) |
| 54 | #pragma omp single |
| 55 | num_failed = num_failed + !(omp_get_num_threads() <= 21); |
| 56 | |
| 57 | // Exceed limit at top level. Should see user warning message. |
| 58 | int threads3[2] = {24, 2}; |
| 59 | __kmpc_push_num_threads_list_strict(NULL, gtid: __kmpc_global_thread_num(NULL), length: 2, |
| 60 | list: threads3, sev: 1, |
| 61 | msg: "User-supplied warning on strict list." ); |
| 62 | #pragma omp parallel reduction(+ : num_failed) |
| 63 | // num_threads(strict:24,2) severity(warning) |
| 64 | // message("User-supplied warning on strict. list") // 1st level |
| 65 | { |
| 66 | #pragma omp single |
| 67 | num_failed = num_failed + !(omp_get_num_threads() <= 24); |
| 68 | #pragma omp parallel reduction(+ : num_failed) // 2nd level |
| 69 | { |
| 70 | #pragma omp single |
| 71 | num_failed = num_failed + !(omp_get_num_threads() <= 2); |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | // No strict limit at top level. Regular runtime limiting applies. |
| 76 | __kmpc_push_num_threads_list(NULL, gtid: __kmpc_global_thread_num(NULL), length: 2, |
| 77 | list: threads3); |
| 78 | #pragma omp parallel reduction(+ : num_failed) |
| 79 | // num_threads(24,2) // 1st level |
| 80 | { |
| 81 | #pragma omp single |
| 82 | num_failed = num_failed + !(omp_get_num_threads() <= 24); |
| 83 | #pragma omp parallel reduction(+ : num_failed) // 2nd level |
| 84 | { |
| 85 | #pragma omp single |
| 86 | num_failed = num_failed + !(omp_get_num_threads() <= 2); |
| 87 | } |
| 88 | } |
| 89 | |
| 90 | return (!num_failed); |
| 91 | } |
| 92 | |
| 93 | int main() { |
| 94 | int i; |
| 95 | int num_failed = 0; |
| 96 | |
| 97 | for (i = 0; i < REPETITIONS; i++) { |
| 98 | if (!test_omp_parallel_num_threads_strict()) { |
| 99 | num_failed++; |
| 100 | } |
| 101 | } |
| 102 | return num_failed; |
| 103 | } |
| 104 | |