/* Based on sollve_vv's tests/5.0/declare_target/test_nested_declare_target.c. */ #define N 1024 int a[N], b[N], c[N]; int i = 0; void update () { for (i = 0; i < N; i++) { a[i] += 1; b[i] += 2; c[i] += 3; } } #pragma omp declare target #pragma omp declare target link(a,c,b,i) #pragma omp declare target to(update) #pragma omp end declare target int main () { for (i = 0; i < N; i++) { a[i] = i; b[i] = i + 1; c[i] = i + 2; } //__builtin_printf("i=5: A=%d, B=%d, C=%d\n", a[5], b[5], c[5]); #pragma omp target map(to: i) map(tofrom: a, b, c) { update(); /* Device. */ } //__builtin_printf("i=5: A=%d, B=%d, C=%d\n", a[5], b[5], c[5]); for (i = 0; i < N; i++) if ( a[i] != i + 1 || b[i] != i + 3 || c[i] != i + 5) __builtin_abort(); update(); /* Host. */ //__builtin_printf("i=5: A=%d, B=%d, C=%d\n", a[5], b[5], c[5]); for (i = 0; i < N; i++) if ( a[i] != i + 2 || b[i] != i + 5 || c[i] != i + 8) __builtin_abort (); return 0; }