mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			61 lines
		
	
	
		
			843 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			843 B
		
	
	
	
		
			C
		
	
	
	
| extern void abort (void);
 | |
| extern int omp_get_num_threads (void);
 | |
| 
 | |
| struct Y
 | |
| {
 | |
|   int l[5][10];
 | |
| };
 | |
| 
 | |
| struct X
 | |
| {
 | |
|   struct Y y;
 | |
|   float b[10];
 | |
| };
 | |
| 
 | |
| void
 | |
| parallel (int a, int b)
 | |
| {
 | |
|   int i, j;
 | |
|   struct X A[10][5];
 | |
|   a = b = 3;
 | |
| 
 | |
|   for (i = 0; i < 10; i++)
 | |
|     for (j = 0; j < 5; j++)
 | |
|       A[i][j].y.l[3][3] = -10;
 | |
| 
 | |
|   #pragma omp parallel shared (a, b, A) num_threads (5)
 | |
|     {
 | |
|       int i, j;
 | |
| 
 | |
|       #pragma omp atomic
 | |
|       a += omp_get_num_threads ();
 | |
| 
 | |
|       #pragma omp atomic
 | |
|       b += omp_get_num_threads ();
 | |
| 
 | |
|       #pragma omp for private (j)
 | |
|       for (i = 0; i < 10; i++)
 | |
| 	for (j = 0; j < 5; j++)
 | |
| 	  A[i][j].y.l[3][3] += 20;
 | |
| 
 | |
|     }
 | |
| 
 | |
|   for (i = 0; i < 10; i++)
 | |
|     for (j = 0; j < 5; j++)
 | |
|       if (A[i][j].y.l[3][3] != 10)
 | |
| 	abort ();
 | |
| 
 | |
|   if (a != 28)
 | |
|     abort ();
 | |
| 
 | |
|   if (b != 28)
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| int
 | |
| main()
 | |
| {
 | |
|   parallel (1, 2);
 | |
|   return 0;
 | |
| }
 |