mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
| /* { dg-do run } */
 | |
| /* { dg-require-effective-target tls_runtime } */
 | |
| 
 | |
| #include <omp.h>
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| int cnt;
 | |
| #pragma omp threadprivate (cnt)
 | |
| 
 | |
| void
 | |
| nqueens (char *a, int n, int pos)
 | |
| {
 | |
|   /* b[i] = j means the queen in i-th row is in column j.  */
 | |
|   char b[pos + 1];
 | |
|   int i, j;
 | |
|   memcpy (b, a, pos);
 | |
|   for (i = 0; i < n; i++)
 | |
|     {
 | |
|       for (j = 0; j < pos; j++)
 | |
| 	if (b[j] == i || b[j] == i + pos - j || i == b[j] + pos - j)
 | |
| 	  break;
 | |
|       if (j < pos)
 | |
| 	continue;
 | |
|       if (pos == n - 1)
 | |
| 	/* Found a solution.  Could output it here.  */
 | |
| 	++cnt;
 | |
|       else
 | |
| 	{
 | |
| 	  b[pos] = i;
 | |
| 	  #pragma omp task
 | |
| 	    nqueens (b, n, pos + 1);
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| int
 | |
| main (int argc, char **argv)
 | |
| {
 | |
|   int n = 8;
 | |
|   if (argc >= 2)
 | |
|     n = strtoul (argv[1], NULL, 0);
 | |
|   if (n < 1 || n > 127)
 | |
|     {
 | |
|       fprintf (stderr, "invalid count %d\n", n);
 | |
|       return 1;
 | |
|     }
 | |
|   cnt = 0;
 | |
|   double stime = omp_get_wtime ();
 | |
|   nqueens ("", n, 0);
 | |
|   printf ("serial   N %d solutions # %d time %f\n", n, cnt, omp_get_wtime () - stime);
 | |
|   #pragma omp parallel
 | |
|     cnt = 0;
 | |
|   stime = omp_get_wtime ();
 | |
|   int tempcnt = 0;
 | |
|   #pragma omp parallel reduction (+:tempcnt)
 | |
|     {
 | |
|       #pragma omp single
 | |
| 	nqueens ("", n, 0);
 | |
|       tempcnt = cnt;
 | |
|     }
 | |
|   cnt = tempcnt;
 | |
|   printf ("parallel N %d solutions # %d time %f\n", n, cnt, omp_get_wtime () - stime);
 | |
|   return 0;
 | |
| }
 |