#include #include #include struct sa0 { int *ptr; }; struct sb0 { int arr[10]; }; struct sc0 { sa0 a; sb0 b; sc0 (sa0 &my_a, sb0 &my_b) : a(my_a), b(my_b) {} }; void foo0 () { sa0 my_a; sb0 my_b; my_a.ptr = (int *) malloc (sizeof (int) * 10); sc0 my_c(my_a, my_b); memset (my_c.a.ptr, 0, sizeof (int) * 10); #pragma omp target map (my_c.a.ptr, my_c.a.ptr[:10]) { for (int i = 0; i < 10; i++) my_c.a.ptr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c.a.ptr[i] == i); memset (my_c.b.arr, 0, sizeof (int) * 10); #pragma omp target map (my_c.b.arr[:10]) { for (int i = 0; i < 10; i++) my_c.b.arr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c.b.arr[i] == i); free (my_a.ptr); } struct sa { int *ptr; }; struct sb { int arr[10]; }; struct sc { sa &a; sb &b; sc (sa &my_a, sb &my_b) : a(my_a), b(my_b) {} }; void foo () { sa my_a; sb my_b; my_a.ptr = (int *) malloc (sizeof (int) * 10); sc my_c(my_a, my_b); memset (my_c.a.ptr, 0, sizeof (int) * 10); #pragma omp target map (my_c.a.ptr, my_c.a.ptr[:10]) { for (int i = 0; i < 10; i++) my_c.a.ptr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c.a.ptr[i] == i); memset (my_c.b.arr, 0, sizeof (int) * 10); #pragma omp target map (my_c.b.arr[:10]) { for (int i = 0; i < 10; i++) my_c.b.arr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c.b.arr[i] == i); free (my_a.ptr); } void bar () { sa my_a; sb my_b; my_a.ptr = (int *) malloc (sizeof (int) * 10); sc my_c(my_a, my_b); sc &my_cref = my_c; memset (my_cref.a.ptr, 0, sizeof (int) * 10); #pragma omp target map (my_cref.a.ptr, my_cref.a.ptr[:10]) { for (int i = 0; i < 10; i++) my_cref.a.ptr[i] = i; } for (int i = 0; i < 10; i++) assert (my_cref.a.ptr[i] == i); memset (my_cref.b.arr, 0, sizeof (int) * 10); #pragma omp target map (my_cref.b.arr[:10]) { for (int i = 0; i < 10; i++) my_cref.b.arr[i] = i; } for (int i = 0; i < 10; i++) assert (my_cref.b.arr[i] == i); free (my_a.ptr); } struct scp0 { sa *a; sb *b; scp0 (sa *my_a, sb *my_b) : a(my_a), b(my_b) {} }; void foop0 () { sa *my_a = new sa; sb *my_b = new sb; my_a->ptr = new int[10]; scp0 *my_c = new scp0(my_a, my_b); memset (my_c->a->ptr, 0, sizeof (int) * 10); #pragma omp target map (my_c->a, my_c->a[:1], my_c->a->ptr, my_c->a->ptr[:10]) { for (int i = 0; i < 10; i++) my_c->a->ptr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c->a->ptr[i] == i); memset (my_c->b->arr, 0, sizeof (int) * 10); #pragma omp target map (my_c->b, my_c->b[:1], my_c->b->arr[:10]) { for (int i = 0; i < 10; i++) my_c->b->arr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c->b->arr[i] == i); delete[] my_a->ptr; delete my_a; delete my_b; } struct scp { sa *&a; sb *&b; scp (sa *&my_a, sb *&my_b) : a(my_a), b(my_b) {} }; void foop () { sa *my_a = new sa; sb *my_b = new sb; my_a->ptr = new int[10]; scp *my_c = new scp(my_a, my_b); memset (my_c->a->ptr, 0, sizeof (int) * 10); #pragma omp target map (my_c->a, my_c->a[:1], my_c->a->ptr, my_c->a->ptr[:10]) { for (int i = 0; i < 10; i++) my_c->a->ptr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c->a->ptr[i] == i); memset (my_c->b->arr, 0, sizeof (int) * 10); #pragma omp target map (my_c->b, my_c->b[:1], my_c->b->arr[:10]) { for (int i = 0; i < 10; i++) my_c->b->arr[i] = i; } for (int i = 0; i < 10; i++) assert (my_c->b->arr[i] == i); delete[] my_a->ptr; delete my_a; delete my_b; } void barp () { sa *my_a = new sa; sb *my_b = new sb; my_a->ptr = new int[10]; scp *my_c = new scp(my_a, my_b); scp *&my_cref = my_c; memset (my_cref->a->ptr, 0, sizeof (int) * 10); #pragma omp target map (my_cref->a, my_cref->a[:1], my_cref->a->ptr, \ my_cref->a->ptr[:10]) { for (int i = 0; i < 10; i++) my_cref->a->ptr[i] = i; } for (int i = 0; i < 10; i++) assert (my_cref->a->ptr[i] == i); memset (my_cref->b->arr, 0, sizeof (int) * 10); #pragma omp target map (my_cref->b, my_cref->b[:1], my_cref->b->arr[:10]) { for (int i = 0; i < 10; i++) my_cref->b->arr[i] = i; } for (int i = 0; i < 10; i++) assert (my_cref->b->arr[i] == i); delete my_a->ptr; delete my_a; delete my_b; } int main (int argc, char *argv[]) { foo0 (); foo (); bar (); foop0 (); foop (); barp (); return 0; }