#include #include void dep (void) { int x = 1; omp_depend_t d1, d2; #pragma omp depobj (d1) depend(in: x) #pragma omp depobj (d2) depend(in: x) #pragma omp depobj (d2) 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) destroy #pragma omp depobj (d1) destroy } void dep2 (void) { #pragma omp parallel #pragma omp single { int x = 1; omp_depend_t d1, d2; #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 } } void dep3 (void) { omp_depend_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; 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 () { dep (); dep2 (); dep3 (); #pragma omp depobj (dd1) depend (inout: xx) #pragma omp depobj (dd2) depend (in : xx) antidep (); #pragma omp depobj (dd2) destroy #pragma omp depobj (dd1) destroy return 0; }