1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include <omp.h>
5 
6 #define MAX	1000
7 
main1()8 void main1()
9 {
10   int i, N1, N2, step;
11   int a[MAX], b[MAX];
12 
13   N1 = rand () % 13;
14   N2 = rand () % (MAX - 51) + 50;
15   step = rand () % 7 + 1;
16 
17   printf ("N1 = %d\nN2 = %d\nstep = %d\n", N1, N2, step);
18 
19   for (i = N1; i <= N2; i += step)
20     a[i] = 42+ i;
21 
22   /* COUNTING UP (<).  Fill in array 'b' in parallel.  */
23   memset (b, 0, sizeof b);
24 #pragma omp parallel shared(a,b,N1,N2,step) private(i)
25   {
26 #pragma omp for
27     for (i = N1; i < N2; i += step)
28       b[i] = a[i];
29   }
30 
31   /* COUNTING UP (<).  Check that all the cells were filled in properly.  */
32   for (i = N1; i < N2; i += step)
33     if (a[i] != b[i])
34       abort ();
35 
36   printf ("for (i = %d; i < %d; i += %d) [OK]\n", N1, N2, step);
37 
38   /* COUNTING UP (<=).  Fill in array 'b' in parallel.  */
39   memset (b, 0, sizeof b);
40 #pragma omp parallel shared(a,b,N1,N2,step) private(i)
41   {
42 #pragma omp for
43     for (i = N1; i <= N2; i += step)
44       b[i] = a[i];
45   }
46 
47   /* COUNTING UP (<=).  Check that all the cells were filled in properly.  */
48   for (i = N1; i <= N2; i += step)
49     if (a[i] != b[i])
50       abort ();
51 
52   printf ("for (i = %d; i <= %d; i += %d) [OK]\n", N1, N2, step);
53 
54   /* COUNTING DOWN (>).  Fill in array 'b' in parallel.  */
55   memset (b, 0, sizeof b);
56 #pragma omp parallel shared(a,b,N1,N2,step) private(i)
57   {
58 #pragma omp for
59     for (i = N2; i > N1; i -= step)
60       b[i] = a[i];
61   }
62 
63   /* COUNTING DOWN (>).  Check that all the cells were filled in properly.  */
64   for (i = N2; i > N1; i -= step)
65     if (a[i] != b[i])
66       abort ();
67 
68   printf ("for (i = %d; i > %d; i -= %d) [OK]\n", N2, N1, step);
69 
70   /* COUNTING DOWN (>=).  Fill in array 'b' in parallel.  */
71   memset (b, 0, sizeof b);
72 #pragma omp parallel shared(a,b,N1,N2,step) private(i)
73   {
74 #pragma omp for
75     for (i = N2; i >= N1; i -= step)
76       b[i] = a[i];
77   }
78 
79   /* COUNTING DOWN (>=).  Check that all the cells were filled in properly.  */
80   for (i = N2; i >= N1; i -= step)
81     if (a[i] != b[i])
82       abort ();
83 
84   printf ("for (i = %d; i >= %d; i -= %d) [OK]\n", N2, N1, step);
85 }
86 
87 int
main()88 main ()
89 {
90   int i;
91 
92   srand (0);
93   for (i = 0; i < 10; ++i)
94     main1();
95   return 0;
96 }
97