This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed] Fix cancel-taskgroup-3.c testcase (PR libgomp/87995)


Hi!

The second part of the cancel-taskgroup-3.c ICEs on hosts that have more
than 64 CPUs (cores or threads).  The problem is that the cancellation of
the taskgroup happens in the worksharing loop that iterates 64 times only,
so if each thread invokes just a single iteration, threads 64 and above
don't have their taskgroup cancelled.

The following patch checks this through a threadprivate variable, records in
each thread if the corresponding taskgroup has been cancelled and asserts
the following task is not executed only if the taskgroup should have been
cancelled.

Tested on powerpc64le-linux and bootstrapped/regtested on x86_64-linux and
i686-linux, committed to trunk.

2018-12-08  Jakub Jelinek  <jakub@redhat.com>

	PR libgomp/87995
	* testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c: Require
	tls_runtime effective target.
	(t): New threadprivate variable.
	(main): Set t in threads which execute iterations of the worksharing
	loop.  Propagate that to the task after the loop and don't abort
	if the current taskgroup hasn't been cancelled.

--- libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c.jj	2018-11-08 18:08:04.074943776 +0100
+++ libgomp/testsuite/libgomp.c-c++-common/cancel-taskgroup-3.c	2018-12-07 18:14:49.663319896 +0100
@@ -1,9 +1,12 @@
-/* { dg-do run } */
+/* { dg-do run { target tls_runtime } } */
 /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
 
 #include <stdlib.h>
 #include <omp.h>
 
+int t;
+#pragma omp threadprivate (t)
+
 int
 main ()
 {
@@ -42,11 +45,12 @@ main ()
   #pragma omp parallel
   #pragma omp taskgroup
   {
-    #pragma omp taskwait
+    int p;
     #pragma omp for reduction (task, +: a)
     for (i = 0; i < 64; ++i)
       {
 	a++;
+	t = 1;
 	#pragma omp task in_reduction (+: a)
 	{
 	  volatile int zero = 0;
@@ -58,9 +62,10 @@ main ()
       }
     if (a != 64)
       abort ();
-    #pragma omp task
+    p = t;
+    #pragma omp task firstprivate (p)
     {
-      if (omp_get_cancellation ())
+      if (p && omp_get_cancellation ())
 	abort ();
     }
   }

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]