-/* Verify that 'acc_unmap_data' unmaps even in presence of dynamic reference
- counts. */
+/* Verify that 'acc_unmap_data' unmaps even in presence of structured and
+ dynamic reference counts, but the device memory remains allocated. */
/* { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } */
#include <assert.h>
#include <stdlib.h>
+#include <string.h>
#include <openacc.h>
int
main ()
{
const int N = 180;
-
- char *h = (char *) malloc (N);
- char *d = (char *) acc_malloc (N);
- if (!d)
- abort ();
- acc_map_data (h, d, N);
-
- char *d_ = (char *) acc_create (h + 3, N - 77);
- assert (d_ == d + 3);
-
- d_ = (char *) acc_create (h, N);
- assert (d_ == d);
-
- acc_unmap_data (h);
- assert (!acc_is_present (h, N));
+ const int N_i = 537;
+ const int C = 37;
+
+ unsigned char *h = (unsigned char *) malloc (N);
+ assert (h);
+ unsigned char *d = (unsigned char *) acc_malloc (N);
+ assert (d);
+
+ for (int i = 0; i < N_i; ++i)
+ {
+ acc_map_data (h, d, N);
+ assert (acc_is_present (h, N));
+#pragma acc parallel present(h[0:N])
+ {
+ if (i == 0)
+ memset (h, C, N);
+ }
+
+ unsigned char *d_ = (unsigned char *) acc_create (h + 3, N - 77);
+ assert (d_ == d + 3);
+
+#pragma acc data create(h[6:N - 44])
+ {
+ d_ = (unsigned char *) acc_create (h, N);
+ assert (d_ == d);
+
+#pragma acc enter data create(h[0:N])
+
+ assert (acc_is_present (h, N));
+ acc_unmap_data (h);
+ assert (!acc_is_present (h, N));
+ }
+
+ /* We can however still access the device memory. */
+#pragma acc parallel loop deviceptr(d)
+ for (int j = 0; j < N; ++j)
+ d[j] += i * j;
+ }
+
+ acc_memcpy_from_device(h, d, N);
+ for (int j = 0; j < N; ++j)
+ assert (h[j] == ((C + N_i * (N_i - 1) / 2 * j) % 256));
+
+ acc_free (d);
return 0;
}