1 /* Test nested dynamic/structured data mappings (multiple blocks on data
2 regions). */
3
4 /* { dg-skip-if "" { *-*-* } { "-DACC_MEM_SHARED=1" } } */
5
6 #include <openacc.h>
7 #include <assert.h>
8 #include <stdlib.h>
9
10 #define SIZE 1024
11
12 void
13 f1 (void)
14 {
15 char *block1 = (char *) malloc (SIZE);
16 char *block2 = (char *) malloc (SIZE);
17
18 #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
19 {
20 #ifdef OPENACC_API
21 acc_copyin (block1, SIZE);
22 acc_copyout (block1, SIZE);
23 #else
24 #pragma acc enter data copyin(block1[0:SIZE])
25 #pragma acc exit data copyout(block1[0:SIZE])
26 #endif
27 }
28
29 assert (!acc_is_present (block1, SIZE));
30 assert (!acc_is_present (block2, SIZE));
31
32 free (block1);
33 free (block2);
34 }
35
36 void
37 f2 (void)
38 {
39 char *block1 = (char *) malloc (SIZE);
40 char *block2 = (char *) malloc (SIZE);
41
42 #ifdef OPENACC_API
43 acc_copyin (block1, SIZE);
44 #else
45 #pragma acc enter data copyin(block1[0:SIZE])
46 #endif
47
48 #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
49 {
50 }
51
52 #ifdef OPENACC_API
53 acc_copyout (block1, SIZE);
54 #else
55 #pragma acc exit data copyout(block1[0:SIZE])
56 #endif
57
58 assert (!acc_is_present (block1, SIZE));
59 assert (!acc_is_present (block2, SIZE));
60
61 free (block1);
62 free (block2);
63 }
64
65 void
66 f3 (void)
67 {
68 char *block1 = (char *) malloc (SIZE);
69 char *block2 = (char *) malloc (SIZE);
70
71 #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
72 {
73 #ifdef OPENACC_API
74 acc_copyin (block1, SIZE);
75 acc_copyin (block2, SIZE);
76 acc_copyout (block2, SIZE);
77 acc_copyout (block1, SIZE);
78 #else
79 #pragma acc enter data copyin(block1[0:SIZE])
80 #pragma acc enter data copyin(block2[0:SIZE])
81 #pragma acc exit data copyout(block2[0:SIZE])
82 #pragma acc exit data copyout(block1[0:SIZE])
83 #endif
84 }
85
86 assert (!acc_is_present (block1, SIZE));
87 assert (!acc_is_present (block2, SIZE));
88
89 free (block1);
90 free (block2);
91 }
92
93 void
94 f4 (void)
95 {
96 char *block1 = (char *) malloc (SIZE);
97 char *block2 = (char *) malloc (SIZE);
98
99 #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
100 {
101 #ifdef OPENACC_API
102 acc_copyin (block1, SIZE);
103 #else
104 #pragma acc enter data copyin(block1[0:SIZE])
105 #endif
106
107 #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
108 {
109 #ifdef OPENACC_API
110 acc_copyin (block2, SIZE);
111 acc_copyout (block2, SIZE);
112 #else
113 #pragma acc enter data copyin(block2[0:SIZE])
114 #pragma acc exit data copyout(block2[0:SIZE])
115 #endif
116 }
117 #ifdef OPENACC_API
118 acc_copyout (block1, SIZE);
119 #else
120 #pragma acc exit data copyout(block1[0:SIZE])
121 #endif
122 }
123
124 assert (!acc_is_present (block1, SIZE));
125 assert (!acc_is_present (block2, SIZE));
126
127 free (block1);
128 free (block2);
129 }
130
131 void
132 f5 (void)
133 {
134 char *block1 = (char *) malloc (SIZE);
135 char *block2 = (char *) malloc (SIZE);
136
137 #ifdef OPENACC_API
138 acc_copyin (block1, SIZE);
139 #else
140 #pragma acc enter data copyin(block1[0:SIZE])
141 #endif
142
143 #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
144 {
145 #ifdef OPENACC_API
146 acc_copyin (block2, SIZE);
147 #else
148 #pragma acc enter data copyin(block2[0:SIZE])
149 #endif
150
151 #pragma acc data copy(block1[0:SIZE], block2[0:SIZE])
152 {
153 }
154 #ifdef OPENACC_API
155 acc_copyout (block2, SIZE);
156 #else
157 #pragma acc exit data copyout(block2[0:SIZE])
158 #endif
159 }
160
161 #ifdef OPENACC_API
162 acc_copyout (block1, SIZE);
163 #else
164 #pragma acc exit data copyout(block1[0:SIZE])
165 #endif
166
167 assert (!acc_is_present (block1, SIZE));
168 assert (!acc_is_present (block2, SIZE));
169
170 free (block1);
171 free (block2);
172 }
173
174 int
175 main (int argc, char *argv[])
176 {
177 f1 ();
178 f2 ();
179 f3 ();
180 f4 ();
181 f5 ();
182 return 0;
183 }