| #include <stdlib.h> |
| |
| struct blk { int x, y; }; |
| struct L |
| { |
| #define N 10 |
| struct { |
| int num_blocks[N]; |
| struct blk * blocks[N]; |
| } m; |
| }; |
| |
| void foo (struct L *l) |
| { |
| for (int i = 0; i < N; i++) |
| { |
| l->m.blocks[i] = (struct blk *) malloc (sizeof (struct blk) * N); |
| l->m.num_blocks[i] = N; |
| } |
| |
| #pragma omp target enter data map(to:l[:1]) |
| for (int i = 0; i < N; i++) |
| { |
| #pragma omp target enter data map(to:l->m.blocks[i][:l->m.num_blocks[i]]) |
| } |
| |
| #pragma omp target |
| { |
| for (int i = 0; i < N; i++) |
| for (int j = 0; j < N; j++) |
| { |
| l->m.blocks[i][j].x = i + j; |
| l->m.blocks[i][j].y = i * j; |
| } |
| } |
| |
| for (int i = 0; i < N; i++) |
| { |
| #pragma omp target exit data map(from:l->m.blocks[i][:l->m.num_blocks[i]]) |
| } |
| #pragma omp target exit data map(from:l[:1]) |
| |
| |
| for (int i = 0; i < N; i++) |
| for (int j = 0; j < N; j++) |
| { |
| if (l->m.blocks[i][j].x != i + j) |
| abort (); |
| if (l->m.blocks[i][j].y != i * j) |
| abort (); |
| } |
| |
| } |
| |
| int main (void) |
| { |
| struct L l; |
| foo (&l); |
| return 0; |
| } |