| /* { 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; |
| } |