12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- #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;
- }
|