| #include <cstdlib> | |
| #include <cstring> | |
| #include <cassert> | |
| 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; | |
| } |