1*330d8983SJohannes Doerfert // RUN: %libomptarget-compile-and-run-generic
2*330d8983SJohannes Doerfert
3*330d8983SJohannes Doerfert #include <omp.h>
4*330d8983SJohannes Doerfert #include <stdlib.h>
5*330d8983SJohannes Doerfert
6*330d8983SJohannes Doerfert #define NUM_DIMS 3
7*330d8983SJohannes Doerfert
main()8*330d8983SJohannes Doerfert int main() {
9*330d8983SJohannes Doerfert int d = omp_get_default_device();
10*330d8983SJohannes Doerfert int id = omp_get_initial_device();
11*330d8983SJohannes Doerfert int a[128], b[64], c[128], e[16], q[128], i;
12*330d8983SJohannes Doerfert void *p;
13*330d8983SJohannes Doerfert
14*330d8983SJohannes Doerfert if (d < 0 || d >= omp_get_num_devices())
15*330d8983SJohannes Doerfert d = id;
16*330d8983SJohannes Doerfert
17*330d8983SJohannes Doerfert p = omp_target_alloc(130 * sizeof(int), d);
18*330d8983SJohannes Doerfert if (p == NULL)
19*330d8983SJohannes Doerfert return 0;
20*330d8983SJohannes Doerfert
21*330d8983SJohannes Doerfert for (i = 0; i < 128; i++)
22*330d8983SJohannes Doerfert q[i] = 0;
23*330d8983SJohannes Doerfert if (omp_target_memcpy(p, q, 128 * sizeof(int), 0, 0, d, id) != 0)
24*330d8983SJohannes Doerfert abort();
25*330d8983SJohannes Doerfert
26*330d8983SJohannes Doerfert size_t volume[NUM_DIMS] = {2, 2, 3};
27*330d8983SJohannes Doerfert size_t dst_offsets[NUM_DIMS] = {0, 0, 0};
28*330d8983SJohannes Doerfert size_t src_offsets[NUM_DIMS] = {0, 0, 0};
29*330d8983SJohannes Doerfert size_t dst_dimensions[NUM_DIMS] = {3, 4, 5};
30*330d8983SJohannes Doerfert size_t src_dimensions[NUM_DIMS] = {2, 3, 4};
31*330d8983SJohannes Doerfert
32*330d8983SJohannes Doerfert for (i = 0; i < 128; i++)
33*330d8983SJohannes Doerfert a[i] = 42;
34*330d8983SJohannes Doerfert for (i = 0; i < 64; i++)
35*330d8983SJohannes Doerfert b[i] = 24;
36*330d8983SJohannes Doerfert for (i = 0; i < 128; i++)
37*330d8983SJohannes Doerfert c[i] = 0;
38*330d8983SJohannes Doerfert for (i = 0; i < 16; i++)
39*330d8983SJohannes Doerfert e[i] = 77;
40*330d8983SJohannes Doerfert
41*330d8983SJohannes Doerfert omp_depend_t obj[2];
42*330d8983SJohannes Doerfert
43*330d8983SJohannes Doerfert #pragma omp parallel num_threads(5)
44*330d8983SJohannes Doerfert #pragma omp single
45*330d8983SJohannes Doerfert {
46*330d8983SJohannes Doerfert #pragma omp task depend(out : p)
47*330d8983SJohannes Doerfert omp_target_memcpy(p, a, 128 * sizeof(int), 0, 0, d, id);
48*330d8983SJohannes Doerfert
49*330d8983SJohannes Doerfert #pragma omp task depend(inout : p)
50*330d8983SJohannes Doerfert omp_target_memcpy(p, b, 64 * sizeof(int), 0, 0, d, id);
51*330d8983SJohannes Doerfert
52*330d8983SJohannes Doerfert #pragma omp task depend(out : c)
53*330d8983SJohannes Doerfert for (i = 0; i < 128; i++)
54*330d8983SJohannes Doerfert c[i] = i + 1;
55*330d8983SJohannes Doerfert
56*330d8983SJohannes Doerfert #pragma omp depobj(obj[0]) depend(inout : p)
57*330d8983SJohannes Doerfert #pragma omp depobj(obj[1]) depend(in : c)
58*330d8983SJohannes Doerfert
59*330d8983SJohannes Doerfert /* This produces: 1 2 3 - - 5 6 7 - - at positions 0..9 and
60*330d8983SJohannes Doerfert 13 14 15 - - 17 18 19 - - at positions 20..29. */
61*330d8983SJohannes Doerfert omp_target_memcpy_rect_async(p, c, sizeof(int), NUM_DIMS, volume,
62*330d8983SJohannes Doerfert dst_offsets, src_offsets, dst_dimensions,
63*330d8983SJohannes Doerfert src_dimensions, d, id, 2, obj);
64*330d8983SJohannes Doerfert
65*330d8983SJohannes Doerfert #pragma omp task depend(in : p)
66*330d8983SJohannes Doerfert omp_target_memcpy(p, e, 16 * sizeof(int), 0, 0, d, id);
67*330d8983SJohannes Doerfert }
68*330d8983SJohannes Doerfert
69*330d8983SJohannes Doerfert #pragma omp taskwait
70*330d8983SJohannes Doerfert
71*330d8983SJohannes Doerfert if (omp_target_memcpy(q, p, 128 * sizeof(int), 0, 0, id, d) != 0)
72*330d8983SJohannes Doerfert abort();
73*330d8983SJohannes Doerfert
74*330d8983SJohannes Doerfert for (i = 0; i < 16; ++i)
75*330d8983SJohannes Doerfert if (q[i] != 77)
76*330d8983SJohannes Doerfert abort();
77*330d8983SJohannes Doerfert if (q[20] != 13 || q[21] != 14 || q[22] != 15 || q[25] != 17 || q[26] != 18 ||
78*330d8983SJohannes Doerfert q[27] != 19)
79*330d8983SJohannes Doerfert abort();
80*330d8983SJohannes Doerfert for (i = 28; i < 64; ++i)
81*330d8983SJohannes Doerfert if (q[i] != 24)
82*330d8983SJohannes Doerfert abort();
83*330d8983SJohannes Doerfert for (i = 64; i < 128; ++i)
84*330d8983SJohannes Doerfert if (q[i] != 42)
85*330d8983SJohannes Doerfert abort();
86*330d8983SJohannes Doerfert
87*330d8983SJohannes Doerfert omp_target_free(p, d);
88*330d8983SJohannes Doerfert return 0;
89*330d8983SJohannes Doerfert }
90