1 #include <stdlib.h> 2 #include <unistd.h> 3 4 int 5 main () 6 { 7 int x = 0, y = 0, z = 0, err; 8 int shared_mem = 0; 9 #pragma omp target map(to: shared_mem) 10 shared_mem = 1; 11 #pragma omp parallel 12 #pragma omp single 13 { 14 #pragma omp task depend(in: x) 15 { 16 usleep (5000); 17 x = 1; 18 } 19 #pragma omp task depend(in: x) 20 { 21 usleep (6000); 22 y = 2; 23 } 24 #pragma omp task depend(out: z) 25 { 26 usleep (7000); 27 z = 3; 28 } 29 #pragma omp target enter data map(to: x, y, z) depend(inout: x, z) nowait 30 #pragma omp task depend(inout: x, z) 31 { 32 x++; y++; z++; 33 } 34 #pragma omp target update to(x, y) depend(inout: x) nowait 35 #pragma omp target enter data map(always, to: z) depend(inout: z) nowait 36 #pragma omp target map (alloc: x, y, z) map (from: err) depend(inout: x, z) 37 { 38 err = x != 2 || y != 3 || z != 4; 39 x = 5; y = 6; z = 7; 40 } 41 #pragma omp task depend(in: x) 42 { 43 usleep (5000); 44 if (!shared_mem) 45 x = 1; 46 } 47 #pragma omp task depend(in: x) 48 { 49 usleep (6000); 50 if (!shared_mem) 51 y = 2; 52 } 53 #pragma omp task depend(out: z) 54 { 55 usleep (3000); 56 if (!shared_mem) 57 z = 3; 58 } 59 #pragma omp target exit data map(release: z) depend(inout: z) nowait 60 #pragma omp target exit data map(from: x, y) depend(inout: x) nowait 61 #pragma omp target exit data map(from: z) depend(inout: z) nowait 62 #pragma omp taskwait 63 if (err || x != 5 || y != 6 || z != 7) 64 abort (); 65 } 66 return 0; 67 } 68