summaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-06-19 10:51:30 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-06-19 10:51:30 +0000
commita47a9a49fb1f5b8958dd62dfd8f6c9a5fa9b0206 (patch)
treee3719f8aa7ec1f24c6e915318298dab0c1a76e61 /libgomp/testsuite/libgomp.c
parentc04e38940f04736e37e1c49414b4b08c441162c4 (diff)
downloadgcc-a47a9a49fb1f5b8958dd62dfd8f6c9a5fa9b0206.tar.gz
* testsuite/libgomp.c/nqueens-1.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136942 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgomp/testsuite/libgomp.c')
-rw-r--r--libgomp/testsuite/libgomp.c/nqueens-1.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.c/nqueens-1.c b/libgomp/testsuite/libgomp.c/nqueens-1.c
new file mode 100644
index 00000000000..1fdc67b2963
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/nqueens-1.c
@@ -0,0 +1,66 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fopenmp" } */
+/* { dg-require-effective-target tls_runtime } */
+
+#include <omp.h>
+#include <stdio.h>
+#include <string.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;
+}