Retro68/gcc/libgomp/testsuite/libgomp.c/target-27.c
2017-04-10 13:32:00 +02:00

68 lines
1.5 KiB
C

#include <stdlib.h>
#include <unistd.h>
int
main ()
{
int x = 0, y = 0, z = 0, err;
int shared_mem = 0;
#pragma omp target map(to: shared_mem)
shared_mem = 1;
#pragma omp parallel
#pragma omp single
{
#pragma omp task depend(in: x)
{
usleep (5000);
x = 1;
}
#pragma omp task depend(in: x)
{
usleep (6000);
y = 2;
}
#pragma omp task depend(out: z)
{
usleep (7000);
z = 3;
}
#pragma omp target enter data map(to: x, y, z) depend(inout: x, z) nowait
#pragma omp task depend(inout: x, z)
{
x++; y++; z++;
}
#pragma omp target update to(x, y) depend(inout: x) nowait
#pragma omp target enter data map(always, to: z) depend(inout: z) nowait
#pragma omp target map (alloc: x, y, z) map (from: err) depend(inout: x, z)
{
err = x != 2 || y != 3 || z != 4;
x = 5; y = 6; z = 7;
}
#pragma omp task depend(in: x)
{
usleep (5000);
if (!shared_mem)
x = 1;
}
#pragma omp task depend(in: x)
{
usleep (6000);
if (!shared_mem)
y = 2;
}
#pragma omp task depend(out: z)
{
usleep (3000);
if (!shared_mem)
z = 3;
}
#pragma omp target exit data map(release: z) depend(inout: z) nowait
#pragma omp target exit data map(from: x, y) depend(inout: x) nowait
#pragma omp target exit data map(from: z) depend(inout: z) nowait
#pragma omp taskwait
if (err || x != 5 || y != 6 || z != 7)
abort ();
}
return 0;
}