123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375 |
- #include <omp.h>
- #include <stdlib.h>
- #include <stdint.h>
- struct S { int a, b; };
- void
- foo (int x, int *p, int *q, int px, omp_allocator_handle_t h, int fl)
- {
- int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
- int i2, j2, n2 = 9, l4;
- int i3, j3, n3 = 10, l5;
- int i4, j4, n4 = 11, l6;
- int i5;
- int v[x], w[x];
- int r2[4] = { 0, 0, 0, 0 };
- int xo = x;
- struct S s = { 27, 29 };
- for (i = 0; i < 4; i++)
- p[i] = 0;
- for (i = 0; i < 3; i++)
- q[i] = 0;
- for (i = 0; i < x; i++)
- w[i] = i;
- #pragma omp parallel private (y, v) firstprivate (x) allocate (x, y, v)
- {
- int *volatile p1 = &x;
- int *volatile p2 = &y;
- if (x != 42)
- abort ();
- #pragma omp barrier
- *p2 = 1;
- p1[0]++;
- v[0] = 7;
- v[41] = 8;
- #pragma omp barrier
- if (x != 43 || y != 1)
- abort ();
- if (v[0] != 7 || v[41] != 8)
- abort ();
- if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2
- | (uintptr_t) &v[0]) & 63) != 0)
- abort ();
- }
- x = xo;
- #pragma omp teams
- #pragma omp parallel private (y) firstprivate (x, w) allocate (h: x, y, w)
- {
- int *volatile p1 = &x;
- int *volatile p2 = &y;
- if (x != 42 || w[17] != 17 || w[41] != 41)
- abort ();
- #pragma omp barrier
- *p2 = 1;
- p1[0]++;
- w[19]++;
- #pragma omp barrier
- if (x != 43 || y != 1 || w[19] != 20)
- abort ();
- if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2
- | (uintptr_t) &w[0]) & 63) != 0)
- abort ();
- }
- x = xo;
- #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
- for (i = 0; i < 64; i++)
- {
- if (x != 42)
- abort ();
- y = 1;
- l = i;
- n += y + 15;
- r += i;
- if ((fl & 1) && (((uintptr_t) &x | (uintptr_t) &y | (uintptr_t) &r
- | (uintptr_t) &l | (uintptr_t) &n) & 63) != 0)
- abort ();
- }
- x = xo;
- #pragma omp parallel
- {
- #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
- for (i1 = 0; i1 < 64; i1++)
- {
- l2[0] = i1;
- l2[1] = i1 + 1;
- l2[2] = i1 + 2;
- l2[3] = i1 + 3;
- if (i1 < 37)
- l3 = i1;
- if ((fl & 1) && (((uintptr_t) &l2[0] | (uintptr_t) &l3 | (uintptr_t) &i1) & 63) != 0)
- abort ();
- }
- #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
- for (i2 = 3; i2 < 5; i2++)
- for (j2 = 17; j2 < 22; j2 += 2)
- {
- n2 += 17;
- l4 = i2 * 31 + j2;
- if ((fl & 1) && (((uintptr_t) &l4 | (uintptr_t) &n2
- | (uintptr_t) &i2 | (uintptr_t) &j2) & 63) != 0)
- abort ();
- }
- #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
- for (i3 = 3; i3 < 5; i3++)
- for (j3 = 17; j3 < 23; j3 += 2)
- {
- n3 += 17;
- l5 = i3 * 31 + j3;
- if ((fl & 2) && (((uintptr_t) &l5 | (uintptr_t) &n3
- | (uintptr_t) &i3 | (uintptr_t) &j3) & 63) != 0)
- abort ();
- }
- #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
- for (i4 = 3; i4 < 5; i4++)
- for (j4 = 17; j4 < 22; j4 += 2)
- {
- n4 += 17;
- l6 = i4 * 31 + j4;
- if ((fl & 1) && (((uintptr_t) &l6 | (uintptr_t) &n4
- | (uintptr_t) &i4 | (uintptr_t) &j4) & 63) != 0)
- abort ();
- }
- #pragma omp for lastprivate (i5) allocate (i5)
- for (i5 = 1; i5 < 17; i5 += 3)
- {
- if ((fl & 2) && (((uintptr_t) &i5) & 63) != 0)
- abort ();
- }
- #pragma omp for reduction(+:p[2:px], q[:3], r2) allocate(h: p, q, r2)
- for (i = 0; i < 32; i++)
- {
- p[2] += i;
- p[3] += 2 * i;
- q[0] += 3 * i;
- q[2] += 4 * i;
- r2[0] += 5 * i;
- r2[3] += 6 * i;
- /* Can't really rely on alignment of &p[0], the implementation could
- allocate the whole array or do what GCC does and allocate only part
- of it. */
- if ((fl & 1) && (((uintptr_t) &q[0] | (uintptr_t) &r2[0]) & 63) != 0)
- abort ();
- }
- #pragma omp task private(y) firstprivate(x) allocate(x, y)
- {
- int *volatile p1 = &x;
- int *volatile p2 = &y;
- if (x != 42)
- abort ();
- p1[0]++;
- p2[0] = 21;
- if (x != 43 || y != 21)
- abort ();
- if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
- abort ();
- }
- #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
- {
- int *volatile p1 = &x;
- int *volatile p2 = &y;
- if (x != 42)
- abort ();
- p1[0]++;
- p2[0] = 21;
- if (x != 43 || y != 21)
- abort ();
- if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
- abort ();
- }
- #pragma omp task private(y) firstprivate(s) allocate(s, y)
- {
- int *volatile p1 = &s.a;
- int *volatile p2 = &s.b;
- int *volatile p3 = &y;
- if (s.a != 27 || s.b != 29)
- abort ();
- p1[0]++;
- p2[0]++;
- p3[0] = 21;
- if (s.a != 28 || s.b != 30 || y != 21)
- abort ();
- if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
- abort ();
- }
- #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
- {
- int *volatile p1 = &s.a;
- int *volatile p2 = &s.b;
- int *volatile p3 = &y;
- if (s.a != 27 || s.b != 29)
- abort ();
- p1[0]++;
- p2[0]++;
- p3[0] = 21;
- if (s.a != 28 || s.b != 30 || y != 21)
- abort ();
- if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
- abort ();
- }
- }
- if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
- abort ();
- if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
- abort ();
- if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
- abort ();
- if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
- abort ();
- if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
- abort ();
- if (i5 != 19)
- abort ();
- if (p[2] != (32 * 31) / 2 || p[3] != 2 * (32 * 31) / 2
- || q[0] != 3 * (32 * 31) / 2 || q[2] != 4 * (32 * 31) / 2
- || r2[0] != 5 * (32 * 31) / 2 || r2[3] != 6 * (32 * 31) / 2)
- abort ();
- }
- void
- bar (int x, omp_allocator_handle_t h)
- {
- int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
- int i2, j2, n2 = 9, l4;
- int i3, j3, n3 = 10, l5;
- int i4, j4, n4 = 11, l6;
- int i5;
- struct S s = { 27, 29 };
- int xo = x;
- #pragma omp parallel private (y) firstprivate (x) allocate (x, y)
- {
- if (x != 42)
- abort ();
- #pragma omp barrier
- y = 1;
- x++;
- #pragma omp barrier
- if (x != 43 || y != 1)
- abort ();
- }
- x = xo;
- #pragma omp teams
- #pragma omp parallel private (y) firstprivate (x) allocate (h: x, y)
- {
- if (x != 42)
- abort ();
- #pragma omp barrier
- y = 1;
- x++;
- #pragma omp barrier
- if (x != 43 || y != 1)
- abort ();
- }
- x = xo;
- #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
- for (i = 0; i < 64; i++)
- {
- if (x != 42)
- abort ();
- y = 1;
- l = i;
- n += y + 15;
- r += i;
- }
- x = xo;
- #pragma omp parallel
- {
- #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
- for (i1 = 0; i1 < 64; i1++)
- {
- l2[0] = i1;
- l2[1] = i1 + 1;
- l2[2] = i1 + 2;
- l2[3] = i1 + 3;
- if (i1 < 37)
- l3 = i1;
- }
- #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
- for (i2 = 3; i2 < 5; i2++)
- for (j2 = 17; j2 < 22; j2 += 2)
- {
- n2 += 17;
- l4 = i2 * 31 + j2;
- }
- #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
- for (i3 = 3; i3 < 5; i3++)
- for (j3 = 17; j3 < 23; j3 += 2)
- {
- n3 += 17;
- l5 = i3 * 31 + j3;
- }
- #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
- for (i4 = 3; i4 < 5; i4++)
- for (j4 = 17; j4 < 22; j4 += 2)
- {
- n4 += 17;
- l6 = i4 * 31 + j4;
- }
- #pragma omp for lastprivate (i5) allocate (i5)
- for (i5 = 1; i5 < 17; i5 += 3)
- ;
- #pragma omp task private(y) firstprivate(x) allocate(x, y)
- {
- if (x != 42)
- abort ();
- x++;
- y = 21;
- if (x != 43 || y != 21)
- abort ();
- }
- #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
- {
- if (x != 42)
- abort ();
- x++;
- y = 21;
- if (x != 43 || y != 21)
- abort ();
- }
- #pragma omp task private(y) firstprivate(s) allocate(s, y)
- {
- if (s.a != 27 || s.b != 29)
- abort ();
- s.a++;
- s.b++;
- y = 21;
- if (s.a != 28 || s.b != 30 || y != 21)
- abort ();
- }
- #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
- {
- if (s.a != 27 || s.b != 29)
- abort ();
- s.a++;
- s.b++;
- y = 21;
- if (s.a != 28 || s.b != 30 || y != 21)
- abort ();
- }
- }
- if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
- abort ();
- if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
- abort ();
- if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
- abort ();
- if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
- abort ();
- if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
- abort ();
- if (i5 != 19)
- abort ();
- }
- int
- main ()
- {
- omp_alloctrait_t traits[3]
- = { { omp_atk_alignment, 64 },
- { omp_atk_fallback, omp_atv_null_fb } };
- omp_allocator_handle_t a
- = omp_init_allocator (omp_default_mem_space, 2, traits);
- int p[4], q[3];
- if (a == omp_null_allocator)
- abort ();
- omp_set_default_allocator (omp_default_mem_alloc);
- foo (42, p, q, 2, omp_null_allocator, 0);
- foo (42, p, q, 2, omp_default_mem_alloc, 0);
- foo (42, p, q, 2, a, 1);
- omp_set_default_allocator (a);
- foo (42, p, q, 2, omp_null_allocator, 3);
- foo (42, p, q, 2, omp_default_mem_alloc, 2);
- bar (42, a);
- omp_destroy_allocator (a);
- return 0;
- }
|