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