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