[Openmp-dev] 100% CPU usage when threads can't steal tasks

Adhityaa Chandrasekar via Openmp-dev openmp-dev at lists.llvm.org
Thu Sep 21 13:11:43 PDT 2017


Hi,

My name is Adhityaa and I'm an undergrad student. This is my first time
getting involved in OpenMP development at LLVM. I have used the library a
bunch of times before, but I haven't been involved in the behind-the-scenes
work before.

So I was just taking a look at https://bugs.llvm.org/show_bug.cgi?id=33543 and
I tried solving it (it looked like a simple, reproducible bug that looked
quite important). First I ran strace on the program to see exactly what was
happening - I found that the threads without any tasks were issuing a whole
bunch of `sched_yield()`, making the CPU go to 100%.

Then I tried going into the code. I came up with a fairly simple patch that
almost solved the issue:

--- kmp_wait_release.h (revision 313888)
+++ kmp_wait_release.h (working copy)
@@ -188,6 +188,7 @@
   // Main wait spin loop
   while (flag->notdone_check()) {
     int in_pool;
+    int executed_tasks = 1;
     kmp_task_team_t *task_team = NULL;
     if (__kmp_tasking_mode != tskm_immediate_exec) {
       task_team = this_thr->th.th_task_team;
@@ -200,10 +201,11 @@
          disabled (KMP_TASKING=0).  */
       if (task_team != NULL) {
         if (TCR_SYNC_4(task_team->tt.tt_active)) {
-          if (KMP_TASKING_ENABLED(task_team))
-            flag->execute_tasks(
+          if (KMP_TASKING_ENABLED(task_team)) {
+            executed_tasks = flag->execute_tasks(
                 this_thr, th_gtid, final_spin,
                 &tasks_completed USE_ITT_BUILD_ARG(itt_sync_obj), 0);
+          }
           else
             this_thr->th.th_reap_state = KMP_SAFE_TO_REAP;
         } else {
@@ -269,7 +271,7 @@
       continue;

     // Don't suspend if there is a likelihood of new tasks being spawned.
-    if ((task_team != NULL) && TCR_4(task_team->tt.tt_found_tasks))
+    if ((task_team != NULL) && TCR_4(task_team->tt.tt_found_tasks) &&
executed_tasks)
       continue;

 #if KMP_USE_MONITOR

Alas, this led to a deadlock - the thread went into a futex wait and was
never woke again. So I looked at how GCC did things and they issue a
FUTEX_WAKE_PRIVATE for INT_MAX threads at the end of things. This should
solve the problem, I think?

Anyway, it's pretty late here and I've been at this for over 6-7 hours at a
stretch, so I'm really tired. I was just wondering if I could get some help
on how to proceed from here (and whether I'm even on the right track).

Thanks,
Adhityaa
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/openmp-dev/attachments/20170922/00b8d450/attachment.html>


More information about the Openmp-dev mailing list