| // { dg-do run } | |
| #include <cassert> | |
| #define N 256 | |
| struct doublebuf | |
| { | |
| int buf_a[N][N]; | |
| int buf_b[N][N]; | |
| }; | |
| #pragma omp declare mapper(lo:doublebuf b) map(b.buf_a[0:N/2][0:N]) \ | |
| map(b.buf_b[0:N/2][0:N]) | |
| #pragma omp declare mapper(hi:doublebuf b) map(b.buf_a[N/2:N/2][0:N]) \ | |
| map(b.buf_b[N/2:N/2][0:N]) | |
| int main (int argc, char *argv[]) | |
| { | |
| doublebuf db; | |
| for (int i = 0; i < N; i++) | |
| for (int j = 0; j < N; j++) | |
| db.buf_a[i][j] = db.buf_b[i][j] = 0; | |
| #pragma omp target map(mapper(lo), tofrom:db) | |
| { | |
| for (int i = 0; i < N / 2; i++) | |
| for (int j = 0; j < N; j++) | |
| { | |
| db.buf_a[i][j]++; | |
| db.buf_b[i][j]++; | |
| } | |
| } | |
| #pragma omp target map(mapper(hi), tofrom:db) | |
| { | |
| for (int i = N / 2; i < N; i++) | |
| for (int j = 0; j < N; j++) | |
| { | |
| db.buf_a[i][j]++; | |
| db.buf_b[i][j]++; | |
| } | |
| } | |
| for (int i = 0; i < N; i++) | |
| for (int j = 0; j < N; j++) | |
| { | |
| assert (db.buf_a[i][j] == 1); | |
| assert (db.buf_b[i][j] == 1); | |
| } | |
| return 0; | |
| } |