summaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.c/nqueens-1.c
blob: ed6c17921ea5b13e2c1f1b9f1614d079b8bbca8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* { dg-do run } */
/* { dg-options "-O2 -fopenmp" } */
/* { dg-require-effective-target tls_runtime } */

#include <omp.h>
#include <stdio.h>
#include <string.h>

unsigned long int strtoul(const char *, char **, int);
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;
}