1 /* Verify that OpenACC 'attach'/'detach' doesn't interfere with reference
8 /* Need to shared this (and, in particular, implicit '&data_work' in
9 'attach'/'detach' clauses) between 'test' and 'test_'. */
10 static unsigned char *data_work
;
12 static void test_(unsigned variant
,
16 assert(acc_is_present(&data_work
, sizeof data_work
));
17 assert(data_work
== data
);
19 acc_update_self(&data_work
, sizeof data_work
);
20 assert(data_work
== data
);
24 #pragma acc enter data attach(data_work)
27 acc_attach((void **) &data_work
);
28 acc_update_self(&data_work
, sizeof data_work
);
29 assert(data_work
== data_d
);
36 acc_attach((void **) &data_work
);
37 #pragma acc enter data attach(data_work)
38 acc_attach((void **) &data_work
);
39 #pragma acc enter data attach(data_work)
40 #pragma acc enter data attach(data_work)
41 #pragma acc enter data attach(data_work)
42 acc_attach((void **) &data_work
);
43 acc_attach((void **) &data_work
);
44 #pragma acc enter data attach(data_work)
54 #pragma acc exit data detach(data_work)
57 acc_detach((void **) &data_work
);
58 acc_update_self(&data_work
, sizeof data_work
);
59 assert(data_work
== data
);
61 // now not attached anymore
66 acc_detach(&data_work
); //TODO PR95203 "libgomp: attach count underflow"
67 acc_update_self(&data_work
, sizeof data_work
);
68 assert(data_work
== data
);
73 assert(acc_is_present(&data_work
, sizeof data_work
));
76 static void test(unsigned variant
)
78 const int size
= sizeof (void *);
79 unsigned char *data
= (unsigned char *) malloc(size
);
81 void *data_d
= acc_create(data
, size
);
83 assert(acc_is_present(data
, size
));
89 #pragma acc data copyin(data_work)
90 test_(variant
, data
, data_d
);
94 acc_copyin(&data_work
, sizeof data_work
);
95 test_(variant
, data
, data_d
);
96 acc_delete(&data_work
, sizeof data_work
);
99 assert(acc_is_present(&data_work
, sizeof data_work
));
101 assert(!acc_is_present(&data_work
, sizeof data_work
));
105 assert(acc_is_present(data
, size
));
106 acc_delete(data
, size
);
109 assert(acc_is_present(data
, size
));
111 assert(!acc_is_present(data
, size
));
119 for (size_t i
= 0; i
< 16; ++i
)