xref: /llvm-project/openmp/runtime/test/worksharing/for/omp_for_ordered.c (revision 373107699709f6fb06992bf6b76274091570aaf2)
1 // RUN: %libomp-compile-and-run
2 #include <stdio.h>
3 #include <math.h>
4 #include "omp_testsuite.h"
5 
6 static int last_i = 0;
7 
8 /* Utility function to check that i is increasing monotonically
9    with each call */
check_i_islarger(int i)10 static int check_i_islarger (int i)
11 {
12   int islarger;
13   islarger = (i > last_i);
14   last_i = i;
15   return (islarger);
16 }
17 
test_omp_for_ordered()18 int test_omp_for_ordered()
19 {
20   int sum;
21   int is_larger = 1;
22   int known_sum;
23 
24   last_i = 0;
25   sum = 0;
26 
27   #pragma omp parallel
28   {
29     int i;
30     int my_islarger = 1;
31     #pragma omp for schedule(static,1) ordered
32     for (i = 1; i < 100; i++) {
33       #pragma omp ordered
34       {
35         my_islarger = check_i_islarger(i) && my_islarger;
36         sum = sum + i;
37       }
38     }
39     #pragma omp critical
40     {
41       is_larger = is_larger && my_islarger;
42     }
43   }
44 
45   known_sum=(99 * 100) / 2;
46   return ((known_sum == sum) && is_larger);
47 }
48 
main()49 int main()
50 {
51   int i;
52   int num_failed=0;
53 
54   for(i = 0; i < REPETITIONS; i++) {
55     if(!test_omp_for_ordered()) {
56       num_failed++;
57     }
58   }
59   return num_failed;
60 }
61