8 /* Say this is N rows and M columns. */
12 #define row_offset 256
13 #define row_length 512
14 #define col_offset 128
15 #define col_length 384
20 int *arr2d
= (int *) calloc (N
* M
, sizeof (int));
22 int hostdev
= omp_get_initial_device ();
25 #pragma omp target enter data map(to: arr2d[col_offset*M:col_length*M])
27 #pragma omp target map(from: targdev, dstptr) \
28 map(present, tofrom: arr2d[col_offset*M:col_length*M])
30 for (int j
= col_offset
; j
< col_offset
+ col_length
; j
++)
31 for (int i
= row_offset
; i
< row_offset
+ row_length
; i
++)
33 targdev
= omp_get_device_num ();
34 dstptr
= (uintptr_t) arr2d
;
37 /* Copy rectangular block back to the host. */
39 size_t volume
[2] = { col_length
, row_length
};
40 size_t offsets
[2] = { col_offset
, row_offset
};
41 size_t dimensions
[2] = { N
, M
};
42 omp_target_memcpy_rect ((void *) arr2d
, (const void *) dstptr
,
43 sizeof (int), 2, &volume
[0], &offsets
[0],
44 &offsets
[0], &dimensions
[0], &dimensions
[0],
48 #pragma omp target exit data map(release: arr2d[col_offset*M:col_length*M])
50 for (int j
= 0; j
< N
; j
++)
51 for (int i
= 0; i
< M
; i
++)
52 if (i
>= row_offset
&& i
< row_offset
+ row_length
53 && j
>= col_offset
&& j
< col_offset
+ col_length
)
54 assert (arr2d
[j
* M
+ i
] == 1);
56 assert (arr2d
[j
* M
+ i
] == 0);