xref: /llvm-project/offload/test/api/omp_target_memcpy_rect_async2.c (revision 330d8983d25d08580fc1642fea48b2473f47a9da)
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