| extern void abort (void); |
| |
| int |
| main () |
| { |
| int a = 1, b = 2, c = 4, d[7]; |
| #pragma omp parallel |
| { |
| #pragma omp single |
| { |
| #pragma omp taskgroup |
| { |
| #pragma omp target enter data nowait map (to: a, b, c) depend(out: d[0]) |
| #pragma omp target nowait map (alloc: a, b) depend(in: d[0]) depend(out: d[1]) |
| { |
| #pragma omp atomic update |
| a |= 4; |
| #pragma omp atomic update |
| b |= 8; |
| } |
| #pragma omp target nowait map (alloc: a, c) depend(in: d[0]) depend(out: d[2]) |
| { |
| #pragma omp atomic update |
| a |= 16; |
| #pragma omp atomic update |
| c |= 32; |
| } |
| #pragma omp target exit data nowait map (from: a, b, c) depend(in: d[1], d[2]) |
| } |
| if (a != 21 || b != 10 || c != 36) |
| abort (); |
| #pragma omp target map (tofrom: a, b) nowait |
| { |
| a &= ~16; |
| b &= ~2; |
| } |
| #pragma omp target map (tofrom: c) nowait |
| { |
| c |= 8; |
| } |
| } /* Implicit barrier here. */ |
| #pragma omp single |
| { |
| if (a != 5 || b != 8 || c != 44) |
| abort (); |
| #pragma omp target map (tofrom: a, b) nowait |
| { |
| a |= 32; |
| b |= 4; |
| } |
| #pragma omp target map (tofrom: c) nowait |
| c &= ~4; |
| #pragma omp taskwait |
| if (a != 37 || b != 12 || c != 40) |
| abort (); |
| #pragma omp target nowait map (tofrom: a, b) depend(out: d[3]) |
| { |
| #pragma omp atomic update |
| a = a + 9; |
| b -= 8; |
| } |
| #pragma omp target nowait map (tofrom: a, c) depend(out: d[4]) |
| { |
| #pragma omp atomic update |
| a = a + 4; |
| c >>= 1; |
| } |
| #pragma omp task if (0) depend (in: d[3], d[4]) shared (a, b, c) |
| if (a != 50 || b != 4 || c != 20) |
| abort (); |
| #pragma omp task shared (a) |
| a += 50; |
| #pragma omp target nowait map (tofrom: b) |
| b++; |
| #pragma omp target map (tofrom: c) nowait |
| c--; |
| #pragma omp taskwait |
| if (a != 100 || b != 5 || c != 19) |
| abort (); |
| #pragma omp target map (tofrom: a) nowait depend(out: d[5]) |
| a++; |
| #pragma omp target map (tofrom: b) nowait depend(out: d[6]) |
| b++; |
| #pragma omp target map (tofrom: a, b) depend(in: d[5], d[6]) |
| { |
| if (a != 101 || b != 6) |
| a = -9; |
| else |
| { |
| a = 24; |
| b = 38; |
| } |
| } |
| if (a != 24 || b != 38) |
| abort (); |
| } /* Implicit barrier here. */ |
| #pragma omp master |
| { |
| #pragma omp target nowait map (tofrom: a, b) |
| { |
| a *= 2; |
| b++; |
| } |
| #pragma omp target map (tofrom: c) nowait |
| c--; |
| } |
| #pragma omp barrier |
| if (a != 48 || b != 39 || c != 18) |
| abort (); |
| } |
| return 0; |
| } |