180 lines
3.9 KiB
C
180 lines
3.9 KiB
C
/* Verify that 'acc_copyout' etc. is a no-op if there's still a structured
|
|
reference count. */
|
|
|
|
/* { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } */
|
|
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <openacc.h>
|
|
|
|
|
|
const int c0 = 58;
|
|
const int c1 = 81;
|
|
|
|
static void
|
|
assign_array (char *array, size_t size, char value)
|
|
{
|
|
for (size_t i = 0; i < size; ++i)
|
|
array[i] = value;
|
|
}
|
|
|
|
static void
|
|
verify_array (const char *array, size_t size, char value)
|
|
{
|
|
for (size_t i = 0; i < size; ++i)
|
|
assert (array[i] == value);
|
|
}
|
|
|
|
|
|
float global_var;
|
|
#pragma acc declare create (global_var)
|
|
|
|
static void
|
|
test_acc_declare ()
|
|
{
|
|
assert (acc_is_present (&global_var, sizeof global_var));
|
|
|
|
global_var = c0;
|
|
#pragma acc update device (global_var)
|
|
|
|
global_var = c1;
|
|
acc_copyout (&global_var, sizeof global_var);
|
|
assert (acc_is_present (&global_var, sizeof global_var));
|
|
assert (global_var == c1);
|
|
|
|
global_var = c1;
|
|
acc_copyout_finalize (&global_var, sizeof global_var);
|
|
assert (acc_is_present (&global_var, sizeof global_var));
|
|
assert (global_var == c1);
|
|
|
|
void *global_var_d_p = acc_deviceptr (&global_var);
|
|
assert (global_var_d_p);
|
|
|
|
void *d_p = acc_copyin (&global_var, sizeof global_var);
|
|
assert (d_p == global_var_d_p);
|
|
|
|
acc_copyout (&global_var, sizeof global_var);
|
|
assert (acc_is_present (&global_var, sizeof global_var));
|
|
|
|
d_p = acc_copyin (&global_var, sizeof global_var);
|
|
assert (d_p == global_var_d_p);
|
|
|
|
d_p = acc_copyin (&global_var, sizeof global_var);
|
|
assert (d_p == global_var_d_p);
|
|
|
|
global_var = c1;
|
|
acc_copyout_finalize (&global_var, sizeof global_var);
|
|
assert (acc_is_present (&global_var, sizeof global_var));
|
|
assert (global_var == c1);
|
|
|
|
global_var = c1;
|
|
acc_copyout (&global_var, sizeof global_var);
|
|
assert (acc_is_present (&global_var, sizeof global_var));
|
|
assert (global_var == c1);
|
|
}
|
|
|
|
|
|
static void
|
|
test_acc_map_data ()
|
|
{
|
|
const int N = 801;
|
|
|
|
char *h = (char *) malloc (N);
|
|
assert (h);
|
|
void *d = acc_malloc (N);
|
|
assert (d);
|
|
acc_map_data (h, d, N);
|
|
assert (acc_is_present (h, N));
|
|
|
|
assign_array (h, N, c0);
|
|
#pragma acc update device (h[0:N])
|
|
|
|
assign_array (h, N, c1);
|
|
#pragma acc exit data copyout (h[0:N])
|
|
assert (acc_is_present (h, N));
|
|
verify_array (h, N, c1);
|
|
|
|
assign_array (h, N, c1);
|
|
#pragma acc exit data copyout (h[0:N]) finalize
|
|
assert (acc_is_present (h, N));
|
|
verify_array (h, N, c1);
|
|
|
|
#pragma acc enter data copyin (h[0:N])
|
|
|
|
assign_array (h, N, c1);
|
|
#pragma acc exit data copyout (h[0:N])
|
|
assert (acc_is_present (h, N));
|
|
verify_array (h, N, c1);
|
|
|
|
#pragma acc enter data copyin (h[0:N])
|
|
|
|
#pragma acc enter data copyin (h[0:N])
|
|
|
|
assign_array (h, N, c1);
|
|
#pragma acc exit data copyout (h[0:N]) finalize
|
|
assert (acc_is_present (h, N));
|
|
verify_array (h, N, c1);
|
|
|
|
assign_array (h, N, c1);
|
|
#pragma acc exit data copyout (h[0:N])
|
|
assert (acc_is_present (h, N));
|
|
verify_array (h, N, c1);
|
|
}
|
|
|
|
|
|
static void
|
|
test_acc_data ()
|
|
{
|
|
#define N 23
|
|
char h[N];
|
|
|
|
assign_array (h, N, c0);
|
|
#pragma acc data copyin (h)
|
|
{
|
|
assert (acc_is_present (h, sizeof h));
|
|
|
|
assign_array (h, N, c1);
|
|
acc_copyout_finalize (h, sizeof h);
|
|
assert (acc_is_present (h, sizeof h));
|
|
verify_array (h, N, c1);
|
|
|
|
assign_array (h, N, c1);
|
|
acc_copyout (h, sizeof h);
|
|
assert (acc_is_present (h, sizeof h));
|
|
verify_array (h, N, c1);
|
|
|
|
acc_copyin (h, sizeof h);
|
|
|
|
assign_array (h, N, c1);
|
|
acc_copyout (h, sizeof h);
|
|
assert (acc_is_present (h, sizeof h));
|
|
verify_array (h, N, c1);
|
|
|
|
acc_copyin (h, sizeof h);
|
|
|
|
acc_copyin (h, sizeof h);
|
|
|
|
assign_array (h, N, c1);
|
|
acc_copyout_finalize (h, sizeof h);
|
|
assert (acc_is_present (h, sizeof h));
|
|
verify_array (h, N, c1);
|
|
|
|
assign_array (h, N, c1);
|
|
acc_copyout (h, sizeof h);
|
|
assert (acc_is_present (h, sizeof h));
|
|
verify_array (h, N, c1);
|
|
}
|
|
#undef N
|
|
}
|
|
|
|
|
|
int
|
|
main ()
|
|
{
|
|
test_acc_declare ();
|
|
test_acc_map_data ();
|
|
test_acc_data ();
|
|
|
|
return 0;
|
|
}
|