1 /* Verify that 'acc_copyout' etc. is a no-op if there's still a structured
2 reference count. */
3
4 /* { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } */
5
6 #include <assert.h>
7 #include <stdlib.h>
8 #include <openacc.h>
9
10
11 const int c0 = 58;
12 const int c1 = 81;
13
14 static void
15 assign_array (char *array, size_t size, char value)
16 {
17 for (size_t i = 0; i < size; ++i)
18 array[i] = value;
19 }
20
21 static void
22 verify_array (const char *array, size_t size, char value)
23 {
24 for (size_t i = 0; i < size; ++i)
25 assert (array[i] == value);
26 }
27
28
29 float global_var;
30 #pragma acc declare create (global_var)
31
32 static void
33 test_acc_declare ()
34 {
35 assert (acc_is_present (&global_var, sizeof global_var));
36
37 global_var = c0;
38 #pragma acc update device (global_var)
39
40 global_var = c1;
41 acc_copyout (&global_var, sizeof global_var);
42 assert (acc_is_present (&global_var, sizeof global_var));
43 assert (global_var == c1);
44
45 global_var = c1;
46 acc_copyout_finalize (&global_var, sizeof global_var);
47 assert (acc_is_present (&global_var, sizeof global_var));
48 assert (global_var == c1);
49
50 void *global_var_d_p = acc_deviceptr (&global_var);
51 assert (global_var_d_p);
52
53 void *d_p = acc_copyin (&global_var, sizeof global_var);
54 assert (d_p == global_var_d_p);
55
56 acc_copyout (&global_var, sizeof global_var);
57 assert (acc_is_present (&global_var, sizeof global_var));
58
59 d_p = acc_copyin (&global_var, sizeof global_var);
60 assert (d_p == global_var_d_p);
61
62 d_p = acc_copyin (&global_var, sizeof global_var);
63 assert (d_p == global_var_d_p);
64
65 global_var = c1;
66 acc_copyout_finalize (&global_var, sizeof global_var);
67 assert (acc_is_present (&global_var, sizeof global_var));
68 assert (global_var == c1);
69
70 global_var = c1;
71 acc_copyout (&global_var, sizeof global_var);
72 assert (acc_is_present (&global_var, sizeof global_var));
73 assert (global_var == c1);
74 }
75
76
77 static void
78 test_acc_map_data ()
79 {
80 const int N = 801;
81
82 char *h = (char *) malloc (N);
83 assert (h);
84 void *d = acc_malloc (N);
85 assert (d);
86 acc_map_data (h, d, N);
87 assert (acc_is_present (h, N));
88
89 assign_array (h, N, c0);
90 #pragma acc update device (h[0:N])
91
92 assign_array (h, N, c1);
93 #pragma acc exit data copyout (h[0:N])
94 assert (acc_is_present (h, N));
95 verify_array (h, N, c1);
96
97 assign_array (h, N, c1);
98 #pragma acc exit data copyout (h[0:N]) finalize
99 assert (acc_is_present (h, N));
100 verify_array (h, N, c1);
101
102 #pragma acc enter data copyin (h[0:N])
103
104 assign_array (h, N, c1);
105 #pragma acc exit data copyout (h[0:N])
106 assert (acc_is_present (h, N));
107 verify_array (h, N, c1);
108
109 #pragma acc enter data copyin (h[0:N])
110
111 #pragma acc enter data copyin (h[0:N])
112
113 assign_array (h, N, c1);
114 #pragma acc exit data copyout (h[0:N]) finalize
115 assert (acc_is_present (h, N));
116 verify_array (h, N, c1);
117
118 assign_array (h, N, c1);
119 #pragma acc exit data copyout (h[0:N])
120 assert (acc_is_present (h, N));
121 verify_array (h, N, c1);
122 }
123
124
125 static void
126 test_acc_data ()
127 {
128 #define N 23
129 char h[N];
130
131 assign_array (h, N, c0);
132 #pragma acc data copyin (h)
133 {
134 assert (acc_is_present (h, sizeof h));
135
136 assign_array (h, N, c1);
137 acc_copyout_finalize (h, sizeof h);
138 assert (acc_is_present (h, sizeof h));
139 verify_array (h, N, c1);
140
141 assign_array (h, N, c1);
142 acc_copyout (h, sizeof h);
143 assert (acc_is_present (h, sizeof h));
144 verify_array (h, N, c1);
145
146 acc_copyin (h, sizeof h);
147
148 assign_array (h, N, c1);
149 acc_copyout (h, sizeof h);
150 assert (acc_is_present (h, sizeof h));
151 verify_array (h, N, c1);
152
153 acc_copyin (h, sizeof h);
154
155 acc_copyin (h, sizeof h);
156
157 assign_array (h, N, c1);
158 acc_copyout_finalize (h, sizeof h);
159 assert (acc_is_present (h, sizeof h));
160 verify_array (h, N, c1);
161
162 assign_array (h, N, c1);
163 acc_copyout (h, sizeof h);
164 assert (acc_is_present (h, sizeof h));
165 verify_array (h, N, c1);
166 }
167 #undef N
168 }
169
170
171 int
172 main ()
173 {
174 test_acc_declare ();
175 test_acc_map_data ();
176 test_acc_data ();
177
178 return 0;
179 }