123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include <stdlib.h>
- #include <omp.h>
- void
- dep (omp_depend_t &d1, omp_depend_t *d2)
- {
- int x = 1;
- #pragma omp depobj (d1) depend(in: x)
- #pragma omp depobj (*d2) depend(in: x)
- #pragma omp depobj (d2[0]) update(out)
- #pragma omp parallel
- #pragma omp single
- {
- #pragma omp task shared (x) depend(depobj:*d2)
- x = 2;
- #pragma omp task shared (x) depend(depobj : d1)
- if (x != 2)
- abort ();
- }
- #pragma omp depobj (d2[0]) destroy
- #pragma omp depobj (d1) destroy
- }
- template <typename T>
- void
- dep2 (T &d2)
- {
- T d1;
- #pragma omp parallel
- #pragma omp single
- {
- int x = 1;
- #pragma omp depobj (d1) depend(out: x)
- #pragma omp depobj (*&d2) depend (in:x)
- #pragma omp depobj(d2)update(in)
- #pragma omp task shared (x) depend(depobj :d1)
- x = 2;
- #pragma omp task shared (x) depend(depobj: d2)
- if (x != 2)
- abort ();
- #pragma omp taskwait
- #pragma omp depobj(d1)destroy
- #pragma omp depobj((&d2)[0]) destroy
- }
- }
- template <typename T>
- void
- dep3 (void)
- {
- T d[2];
- #pragma omp parallel
- {
- int x = 1;
- #pragma omp single
- {
- #pragma omp depobj(d[0]) depend(out:x)
- #pragma omp depobj(d[1]) depend(in: x)
- #pragma omp task shared (x) depend(depobj:*d)
- x = 2;
- #pragma omp task shared (x) depend(depobj:*(d + 1))
- if (x != 2)
- abort ();
- }
- }
- #pragma omp depobj(d[0]) destroy
- #pragma omp depobj(d[1]) destroy
- }
- int xx;
- omp_depend_t dd1, dd2;
- template <int N>
- void
- antidep (void)
- {
- xx = 1;
- #pragma omp parallel
- #pragma omp single
- {
- #pragma omp task shared(xx) depend(depobj:dd2)
- if (xx != 1)
- abort ();
- #pragma omp task shared(xx) depend(depobj:dd1)
- xx = 2;
- }
- }
- int
- main ()
- {
- omp_depend_t d1, d2, d3;
- dep (d1, &d2);
- dep2 <omp_depend_t> (d3);
- dep3 <omp_depend_t> ();
- #pragma omp depobj (dd1) depend (inout: xx)
- #pragma omp depobj (dd2) depend (in : xx)
- antidep <0> ();
- #pragma omp depobj (dd2) destroy
- #pragma omp depobj (dd1) destroy
- return 0;
- }
|