File: nqueens-1.c

package info (click to toggle)
gcc-avr 1%3A5.4.0%2BAtmel3.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 589,872 kB
  • sloc: ansic: 2,775,581; ada: 756,757; cpp: 723,977; f90: 117,673; asm: 66,898; makefile: 62,755; xml: 44,466; sh: 29,549; exp: 23,315; objc: 15,216; fortran: 10,901; pascal: 4,185; python: 4,093; perl: 2,969; awk: 2,811; ml: 2,385; cs: 879; yacc: 316; lex: 198; haskell: 112; lisp: 8
file content (67 lines) | stat: -rw-r--r-- 1,402 bytes parent folder | download | duplicates (3)
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>
#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;
}