1 // RUN: %libomptarget-compilexx-run-and-check-generic 2 3 #include <omp.h> 4 #include <stdio.h> 5 6 #define N 1024 7 8 int A[N]; 9 int B[N]; 10 int C[N]; main()11int main() { 12 for (int i = 0; i < N; i++) 13 A[i] = B[i] = i; 14 15 #pragma omp parallel num_threads(2) 16 { 17 if (omp_get_thread_num() == 1) { 18 // map data A & B and move to 19 #pragma omp target enter data map(to : A, B) depend(out : A[0]) nowait 20 21 // no data move since already mapped 22 #pragma omp target map(A, B) depend(out : A[0]) nowait 23 { 24 for (int i = 0; i < N; i++) 25 ++A[i]; 26 for (int i = 0; i < N; i++) 27 ++B[i]; 28 } 29 30 // no data move since already mapped 31 #pragma omp target teams num_teams(1) map(A, B) depend(out : A[0]) nowait 32 { 33 for (int i = 0; i < N; i++) 34 ++A[i]; 35 for (int i = 0; i < N; i++) 36 ++B[i]; 37 } 38 39 // A updated via update 40 #pragma omp target update from(A) depend(out : A[0]) nowait 41 42 // B updated via exit, A just released 43 #pragma omp target exit data map(release \ 44 : A) map(from \ 45 : B) depend(out \ 46 : A[0]) nowait 47 } // if 48 } // parallel 49 50 int Sum = 0; 51 for (int i = 0; i < N; i++) 52 Sum += A[i] + B[i]; 53 // Sum is 2 * N * (2 + N - 1 + 2) / 2 54 // CHECK: Sum = 1051648. 55 printf("Sum = %d.\n", Sum); 56 57 return Sum != 2 * N * (2 + N - 1 + 2) / 2; 58 } 59 60