This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[gomp] New tasking testcase/benchmark
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 19 Jun 2008 06:59:32 -0400
- Subject: [gomp] New tasking testcase/benchmark
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
Just a classical tasking example, which can serve both as a testcase
and a benchmark (in that case with bigger N than 8, like 14 or 15).
Committed to trunk.
2008-06-19 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c/nqueens-1.c: New test.
--- libgomp/testsuite/libgomp.c/nqueens-1.c (revision 0)
+++ libgomp/testsuite/libgomp.c/nqueens-1.c (revision 136942)
@@ -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;
+}
Jakub