| 1 | // RUN: %libomp-compile-and-run |
| 2 | // critial with hint was introduced with icc 19 |
| 3 | // UNSUPPORTED: icc-18 |
| 4 | |
| 5 | #include <stdio.h> |
| 6 | #include <omp.h> |
| 7 | #include "omp_testsuite.h" |
| 8 | |
| 9 | int test_omp_critical(int iter) { |
| 10 | int sum; |
| 11 | int known_sum; |
| 12 | |
| 13 | sum = 0; |
| 14 | #pragma omp parallel |
| 15 | { |
| 16 | int mysum = 0; |
| 17 | int i; |
| 18 | #pragma omp for |
| 19 | for (i = 0; i < 1000; i++) |
| 20 | mysum = mysum + i; |
| 21 | |
| 22 | switch (iter % 4) { |
| 23 | case 0: |
| 24 | #pragma omp critical(c0) hint(omp_sync_hint_uncontended) |
| 25 | sum = mysum + sum; |
| 26 | break; |
| 27 | case 1: |
| 28 | #pragma omp critical(c1) hint(omp_sync_hint_contended) |
| 29 | sum = mysum + sum; |
| 30 | break; |
| 31 | case 2: |
| 32 | #pragma omp critical(c2) hint(omp_sync_hint_nonspeculative) |
| 33 | sum = mysum + sum; |
| 34 | break; |
| 35 | case 3: |
| 36 | #pragma omp critical(c3) hint(omp_sync_hint_speculative) |
| 37 | sum = mysum + sum; |
| 38 | break; |
| 39 | default:; |
| 40 | } |
| 41 | } |
| 42 | known_sum = 999 * 1000 / 2; |
| 43 | return (known_sum == sum); |
| 44 | } |
| 45 | |
| 46 | int main() { |
| 47 | int i; |
| 48 | int num_failed = 0; |
| 49 | |
| 50 | for (i = 0; i < 4 * REPETITIONS; i++) { |
| 51 | if (!test_omp_critical(iter: i)) { |
| 52 | num_failed++; |
| 53 | } |
| 54 | } |
| 55 | return num_failed; |
| 56 | } |
| 57 | |