mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			243 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
| // { dg-do run }
 | |
| 
 | |
| #include <omp.h>
 | |
| #include <assert.h>
 | |
| 
 | |
| struct B
 | |
| {
 | |
|   static int ic, dc, xc, ac, cc;
 | |
| 
 | |
|   B();
 | |
|   B(const B &);
 | |
|   ~B();
 | |
|   B& operator=(const B &);
 | |
|   void doit();
 | |
|   static void clear();
 | |
| };
 | |
| 
 | |
| int B::ic;
 | |
| int B::dc;
 | |
| int B::xc;
 | |
| int B::cc;
 | |
| int B::ac;
 | |
| 
 | |
| B::B()
 | |
| {
 | |
|   #pragma omp atomic
 | |
|     ic++;
 | |
| }
 | |
| 
 | |
| B::~B()
 | |
| {
 | |
|   #pragma omp atomic
 | |
|     dc++;
 | |
| }
 | |
| 
 | |
| B::B(const B &)
 | |
| {
 | |
|   #pragma omp atomic
 | |
|     cc++;
 | |
| }
 | |
| 
 | |
| B& B::operator=(const B &)
 | |
| {
 | |
|   #pragma omp atomic
 | |
|     ac++;
 | |
|   return *this;
 | |
| }
 | |
| 
 | |
| void B::doit()
 | |
| {
 | |
|   #pragma omp atomic
 | |
|     xc++;
 | |
| }
 | |
| 
 | |
| void B::clear()
 | |
| {
 | |
|   ic = 0;
 | |
|   dc = 0;
 | |
|   cc = 0;
 | |
|   ac = 0;
 | |
|   xc = 0;
 | |
| }
 | |
| 
 | |
| static int n;
 | |
| 
 | |
| void f1(B &a)
 | |
| {
 | |
|   B b;
 | |
|   B &c = b;
 | |
|   #pragma omp parallel default(none) private(a, c) shared (n)
 | |
|     {
 | |
|       #pragma omp master
 | |
| 	n = omp_get_num_threads ();
 | |
|       a.doit();
 | |
|       c.doit();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void f2(B &a)
 | |
| {
 | |
|   B b;
 | |
|   B &c = b;
 | |
|   #pragma omp parallel default(none) firstprivate(a, c) shared(n)
 | |
|     {
 | |
|       #pragma omp master
 | |
| 	n = omp_get_num_threads ();
 | |
|       a.doit();
 | |
|       c.doit();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void f3(B &a)
 | |
| {
 | |
|   B b;
 | |
|   B &c = b;
 | |
|   #pragma omp parallel default(none) shared(n, a, c)
 | |
|     {
 | |
|       #pragma omp master
 | |
| 	n = omp_get_num_threads ();
 | |
|       #pragma omp for lastprivate (a, c)
 | |
|       for (int i = 0; i < omp_get_num_threads (); i++)
 | |
| 	{
 | |
| 	  a.doit();
 | |
| 	  c.doit();
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| void f4()
 | |
| {
 | |
|   B b;
 | |
|   B &c = b;
 | |
|   #pragma omp parallel default(none) private (c) shared (n)
 | |
|     {
 | |
|       B d;
 | |
|       B &e = d;
 | |
|       #pragma omp single copyprivate (c, e)
 | |
|       {
 | |
| 	c.doit();
 | |
| 	e.doit();
 | |
|       }
 | |
|       c.doit();
 | |
|       e.doit();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void f5(B (&a)[2])
 | |
| {
 | |
|   B b[2];
 | |
|   B (&c)[2] = b;
 | |
|   #pragma omp parallel default(none) private(a, c) shared (n)
 | |
|     {
 | |
|       #pragma omp master
 | |
| 	n = omp_get_num_threads ();
 | |
|       a[0].doit();
 | |
|       a[1].doit();
 | |
|       c[0].doit();
 | |
|       c[1].doit();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void f6(B (&a)[2])
 | |
| {
 | |
|   B b[2];
 | |
|   B (&c)[2] = b;
 | |
|   #pragma omp parallel default(none) firstprivate(a, c) shared (n)
 | |
|     {
 | |
|       #pragma omp master
 | |
| 	n = omp_get_num_threads ();
 | |
|       a[0].doit();
 | |
|       a[1].doit();
 | |
|       c[0].doit();
 | |
|       c[1].doit();
 | |
|     }
 | |
| }
 | |
| 
 | |
| void f7(B (&a)[2])
 | |
| {
 | |
|   B b[2];
 | |
|   B (&c)[2] = b;
 | |
|   #pragma omp parallel default(none) shared(n, a, c)
 | |
|     {
 | |
|       #pragma omp master
 | |
| 	n = omp_get_num_threads ();
 | |
|       #pragma omp for lastprivate (a, c)
 | |
|       for (int i = 0; i < omp_get_num_threads (); i++)
 | |
| 	{
 | |
| 	  a[0].doit();
 | |
| 	  a[1].doit();
 | |
| 	  c[0].doit();
 | |
| 	  c[1].doit();
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| void f8()
 | |
| {
 | |
|   B b[2];
 | |
|   B (&c)[2] = b;
 | |
|   #pragma omp parallel default(none) private (c) shared (n)
 | |
|     {
 | |
|       B d[2];
 | |
|       B (&e)[2] = d;
 | |
|       #pragma omp single copyprivate (c, e)
 | |
|       {
 | |
| 	c[0].doit();
 | |
| 	c[1].doit();
 | |
| 	e[0].doit();
 | |
| 	e[1].doit();
 | |
|       }
 | |
|       c[0].doit();
 | |
|       c[1].doit();
 | |
|       e[0].doit();
 | |
|       e[1].doit();
 | |
|     }
 | |
| }
 | |
| 
 | |
| int main()
 | |
| {
 | |
|   {
 | |
|     B a;
 | |
|     f1(a);
 | |
|   }
 | |
|   assert (B::xc == 2*n && B::ic == 2*n+2 && B::dc == 2*n+2 && B::ac == 0 && B::cc == 0);
 | |
|   B::clear();
 | |
|   {
 | |
|     B a;
 | |
|     f2(a);
 | |
|   }
 | |
|   assert (B::xc == 2*n && B::ic == 2 && B::dc == 2*n+2 && B::ac == 0 && B::cc == 2*n);
 | |
|   B::clear();
 | |
|   {
 | |
|     B a;
 | |
|     f3(a);
 | |
|   }
 | |
|   assert (B::xc == 2*n && B::ic == 2*n+2 && B::dc == 2*n+2 && B::ac == 2 && B::cc == 0);
 | |
|   B::clear();
 | |
|   f4();
 | |
|   assert (B::xc == 2*n+2 && B::ic == 2*n+1 && B::dc == 2*n+1 && B::ac == 2*n-2 && B::cc == 0);
 | |
|   B::clear();
 | |
|   {
 | |
|     B a[2];
 | |
|     f5(a);
 | |
|   }
 | |
|   assert (B::xc == 4*n && B::ic == 4*n+4 && B::dc == 4*n+4 && B::ac == 0 && B::cc == 0);
 | |
|   B::clear();
 | |
|   {
 | |
|     B a[2];
 | |
|     f6(a);
 | |
|   }
 | |
|   assert (B::xc == 4*n && B::ic == 4 && B::dc == 4*n+4 && B::ac == 0 && B::cc == 4*n);
 | |
|   B::clear();
 | |
|   {
 | |
|     B a[2];
 | |
|     f7(a);
 | |
|   }
 | |
|   assert (B::xc == 4*n && B::ic == 4*n+4 && B::dc == 4*n+4 && B::ac == 4 && B::cc == 0);
 | |
|   B::clear();
 | |
|   f8();
 | |
|   assert (B::xc == 4*n+4 && B::ic == 4*n+2 && B::dc == 4*n+2 && B::ac == 4*n-4 && B::cc == 0);
 | |
|   return 0;
 | |
| }
 |