// { dg-do run } #include #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; }