mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-02 18:53:22 +00:00
121 lines
2.1 KiB
C
121 lines
2.1 KiB
C
/* { dg-require-effective-target offload_device_nonshared_as } */
|
|
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
|
|
#define N 40
|
|
|
|
int sum;
|
|
int var1 = 1;
|
|
int var2 = 2;
|
|
|
|
#pragma omp declare target
|
|
int D[N];
|
|
#pragma omp end declare target
|
|
|
|
void enter_data (int *X)
|
|
{
|
|
#pragma omp target enter data map(to: var1, var2, X[:N]) map(alloc: sum)
|
|
}
|
|
|
|
void exit_data_0 (int *D)
|
|
{
|
|
#pragma omp target exit data map(delete: D[:N])
|
|
}
|
|
|
|
void exit_data_1 ()
|
|
{
|
|
#pragma omp target exit data map(from: var1)
|
|
}
|
|
|
|
void exit_data_2 (int *X)
|
|
{
|
|
#pragma omp target exit data map(from: var2) map(release: X[:N], sum)
|
|
}
|
|
|
|
void exit_data_3 (int *p)
|
|
{
|
|
#pragma omp target exit data map(from: p[:0])
|
|
}
|
|
|
|
void test_nested ()
|
|
{
|
|
int X = 0, Y = 0, Z = 0;
|
|
|
|
#pragma omp target data map(from: X, Y, Z)
|
|
{
|
|
#pragma omp target data map(from: X, Y, Z)
|
|
{
|
|
#pragma omp target map(from: X, Y, Z)
|
|
X = Y = Z = 1337;
|
|
assert (X == 0);
|
|
assert (Y == 0);
|
|
assert (Z == 0);
|
|
|
|
#pragma omp target exit data map(from: X) map(release: Y)
|
|
assert (X == 0);
|
|
assert (Y == 0);
|
|
|
|
#pragma omp target exit data map(release: Y) map(delete: Z)
|
|
assert (Y == 0);
|
|
assert (Z == 0);
|
|
}
|
|
assert (X == 1337);
|
|
assert (Y == 0);
|
|
assert (Z == 0);
|
|
|
|
#pragma omp target map(from: X)
|
|
X = 2448;
|
|
assert (X == 2448);
|
|
assert (Y == 0);
|
|
assert (Z == 0);
|
|
|
|
X = 4896;
|
|
}
|
|
assert (X == 4896);
|
|
assert (Y == 0);
|
|
assert (Z == 0);
|
|
}
|
|
|
|
int main ()
|
|
{
|
|
int *X = malloc (N * sizeof (int));
|
|
int *Y = malloc (N * sizeof (int));
|
|
X[10] = 10;
|
|
Y[20] = 20;
|
|
enter_data (X);
|
|
|
|
exit_data_0 (D); /* This should have no effect on D. */
|
|
|
|
#pragma omp target map(alloc: var1, var2, X[:N]) map(to: Y[:N]) map(always from: sum)
|
|
{
|
|
var1 += X[10];
|
|
var2 += Y[20];
|
|
sum = var1 + var2;
|
|
D[sum]++;
|
|
}
|
|
|
|
assert (var1 == 1);
|
|
assert (var2 == 2);
|
|
assert (sum == 33);
|
|
|
|
exit_data_1 ();
|
|
assert (var1 == 11);
|
|
assert (var2 == 2);
|
|
|
|
/* Increase refcount of already mapped X[0:N]. */
|
|
#pragma omp target enter data map(alloc: X[16:1])
|
|
|
|
exit_data_2 (X);
|
|
assert (var2 == 22);
|
|
|
|
exit_data_3 (X + 5); /* Unmap X[0:N]. */
|
|
|
|
free (X);
|
|
free (Y);
|
|
|
|
test_nested ();
|
|
|
|
return 0;
|
|
}
|