#include #include #include #define N 32 typedef struct { int arr[N]; int *ptr; } sc; typedef struct { sc *c; } sb; typedef struct { sb *b; sc *c; } sa; int main (int argc, char *argv[]) { sa *p; p = (sa *) malloc (sizeof *p); p->b = (sb *) malloc (sizeof *p->b); p->b->c = (sc *) malloc (sizeof *p->b->c); p->c = (sc *) malloc (sizeof *p->c); p->b->c->ptr = (int *) malloc (N * sizeof (int)); p->c->ptr = (int *) malloc (N * sizeof (int)); for (int i = 0; i < N; i++) { p->b->c->ptr[i] = 0; p->c->ptr[i] = 0; p->b->c->arr[i] = 0; p->c->arr[i] = 0; } #pragma omp target map(to: p->b, p->b[0], p->c, p->c[0], p->b->c, p->b->c[0]) \ map(to: p->b->c->ptr, p->c->ptr) \ map(tofrom: p->b->c->ptr[:N], p->c->ptr[:N]) { for (int i = 0; i < N; i++) { p->b->c->ptr[i] = i; p->c->ptr[i] = i * 2; } } #pragma omp target map(to: p->b, p->b[0], p->b->c, p->c) \ map(tofrom: p->c[0], p->b->c[0]) { for (int i = 0; i < N; i++) { p->b->c->arr[i] = i * 3; p->c->arr[i] = i * 4; } } for (int i = 0; i < N; i++) { assert (p->b->c->ptr[i] == i); assert (p->c->ptr[i] == i * 2); assert (p->b->c->arr[i] == i * 3); assert (p->c->arr[i] == i * 4); } return 0; }