123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- extern void abort (void);
- extern int omp_get_num_threads (void);
- struct Y
- {
- int l[5][10];
- };
- struct X
- {
- struct Y y;
- float b[10];
- };
- void
- parallel (int a, int b)
- {
- int i, j;
- struct X A[10][5];
- a = b = 3;
- for (i = 0; i < 10; i++)
- for (j = 0; j < 5; j++)
- A[i][j].y.l[3][3] = -10;
- #pragma omp parallel shared (a, b, A) num_threads (5)
- {
- int i, j;
- #pragma omp atomic
- a += omp_get_num_threads ();
- #pragma omp atomic
- b += omp_get_num_threads ();
- #pragma omp for private (j)
- for (i = 0; i < 10; i++)
- for (j = 0; j < 5; j++)
- A[i][j].y.l[3][3] += 20;
- }
- for (i = 0; i < 10; i++)
- for (j = 0; j < 5; j++)
- if (A[i][j].y.l[3][3] != 10)
- abort ();
- if (a != 28)
- abort ();
- if (b != 28)
- abort ();
- }
- int
- main()
- {
- parallel (1, 2);
- return 0;
- }
|