#include #include 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 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 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 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 (d3); dep3 (); #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; }