mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| int main ()
 | |
| {
 | |
|   int a = 0, b = 0, c = 0, d[7];
 | |
| 
 | |
|   #pragma omp parallel
 | |
|   #pragma omp single
 | |
|   {
 | |
|     #pragma omp task depend(out: d[0])
 | |
|       a = 2;
 | |
| 
 | |
|     #pragma omp target enter data nowait map(to: a,b,c) depend(in: d[0]) depend(out: d[1])
 | |
| 
 | |
|     #pragma omp target nowait map(alloc: a) depend(in: d[1]) depend(out: d[2])
 | |
|       a++;
 | |
| 
 | |
|     #pragma omp target nowait map(alloc: b) depend(in: d[2]) depend(out: d[3])
 | |
|     {
 | |
|       usleep (1000);
 | |
|       #pragma omp atomic update
 | |
|       b |= 4;
 | |
|     }
 | |
| 
 | |
|     #pragma omp target nowait map(alloc: b) depend(in: d[2]) depend(out: d[4])
 | |
|     {
 | |
|       usleep (5000);
 | |
|       #pragma omp atomic update
 | |
|       b |= 1;
 | |
|     }
 | |
| 
 | |
|     #pragma omp target nowait map(alloc: c) depend(in: d[3], d[4]) depend(out: d[5])
 | |
|     {
 | |
|       usleep (5000);
 | |
|       #pragma omp atomic update
 | |
|       c |= 8;
 | |
|     }
 | |
| 
 | |
|     #pragma omp target nowait map(alloc: c) depend(in: d[3], d[4]) depend(out: d[6])
 | |
|     {
 | |
|       usleep (1000);
 | |
|       #pragma omp atomic update
 | |
|       c |= 2;
 | |
|     }
 | |
| 
 | |
|     #pragma omp target exit data map(always,from: a,b,c) depend(in: d[5], d[6])
 | |
|   }
 | |
| 
 | |
|   if (a != 3 || b != 5 || c != 10)
 | |
|     abort ();
 | |
| 
 | |
|   return 0;
 | |
| }
 |