1 /* Test for omp_target_memcpy_rect_async considering dependence objects. */
11 int d
= omp_get_default_device ();
12 int id
= omp_get_initial_device ();
13 int a
[128], b
[64], c
[128], e
[16], q
[128], i
;
16 if (d
< 0 || d
>= omp_get_num_devices ())
19 p
= omp_target_alloc (130 * sizeof (int), d
);
23 for (i
= 0; i
< 128; i
++)
25 if (omp_target_memcpy (p
, q
, 128 * sizeof (int), 0, 0, d
, id
) != 0)
28 size_t volume
[NUM_DIMS
] = { 2, 2, 3 };
29 size_t dst_offsets
[NUM_DIMS
] = { 0, 0, 0 };
30 size_t src_offsets
[NUM_DIMS
] = { 0, 0, 0 };
31 size_t dst_dimensions
[NUM_DIMS
] = { 3, 4, 5 };
32 size_t src_dimensions
[NUM_DIMS
] = { 2, 3, 4 };
34 for (i
= 0; i
< 128; i
++)
36 for (i
= 0; i
< 64; i
++)
38 for (i
= 0; i
< 128; i
++)
40 for (i
= 0; i
< 16; i
++)
45 #pragma omp parallel num_threads(5)
48 #pragma omp task depend (out: p)
49 omp_target_memcpy (p
, a
, 128 * sizeof (int), 0, 0, d
, id
);
51 #pragma omp task depend(inout: p)
52 omp_target_memcpy (p
, b
, 64 * sizeof (int), 0, 0, d
, id
);
54 #pragma omp task depend(out: c)
55 for (i
= 0; i
< 128; i
++)
58 #pragma omp depobj(obj[0]) depend(inout: p)
59 #pragma omp depobj(obj[1]) depend(in: c)
61 /* This produces: 1 2 3 - - 5 6 7 - - at positions 0..9 and
62 13 14 15 - - 17 18 19 - - at positions 20..29. */
63 omp_target_memcpy_rect_async (p
, c
, sizeof (int), NUM_DIMS
, volume
,
64 dst_offsets
, src_offsets
, dst_dimensions
,
65 src_dimensions
, d
, id
, 2, obj
);
67 #pragma omp task depend(in: p)
68 omp_target_memcpy (p
, e
, 16 * sizeof (int), 0, 0, d
, id
);
73 if (omp_target_memcpy (q
, p
, 128 * sizeof(int), 0, 0, id
, d
) != 0)
76 for (i
= 0; i
< 16; ++i
)
79 if (q
[20] != 13 || q
[21] != 14 || q
[22] != 15 || q
[25] != 17 || q
[26] != 18
82 for (i
= 28; i
< 64; ++i
)
85 for (i
= 64; i
< 128; ++i
)
89 omp_target_free (p
, d
);