[Openmp-commits] [PATCH] D26187: Change task stealing to always get task from head of victim's deque.

Phabricator via Openmp-commits openmp-commits at lists.llvm.org
Wed Nov 2 09:55:00 PDT 2016


This revision was automatically updated to reflect the committed changes.
Closed by commit rL285833: Change task stealing to always get task from head of victim's deque. (authored by achurbanov).

Changed prior to commit:
  https://reviews.llvm.org/D26187?vs=76690&id=76724#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D26187

Files:
  openmp/trunk/runtime/src/kmp_tasking.c


Index: openmp/trunk/runtime/src/kmp_tasking.c
===================================================================
--- openmp/trunk/runtime/src/kmp_tasking.c
+++ openmp/trunk/runtime/src/kmp_tasking.c
@@ -1782,37 +1782,32 @@
 
     KMP_DEBUG_ASSERT( victim_td -> td.td_deque != NULL );
 
-    if ( !is_constrained ) {
-        taskdata = victim_td -> td.td_deque[ victim_td -> td.td_deque_head ];
-        KMP_ASSERT(taskdata);
-        // Bump head pointer and Wrap.
-        victim_td -> td.td_deque_head = ( victim_td -> td.td_deque_head + 1 ) & TASK_DEQUE_MASK(victim_td->td);
-    } else {
-        // While we have postponed tasks let's steal from tail of the deque (smaller tasks)
-        kmp_int32 tail = ( victim_td -> td.td_deque_tail - 1 ) & TASK_DEQUE_MASK(victim_td->td);  // Wrap index.
-        taskdata = victim_td -> td.td_deque[ tail ];
-        KMP_ASSERT(taskdata);
+    taskdata = victim_td->td.td_deque[victim_td->td.td_deque_head];
+    if ( is_constrained ) {
         // we need to check if the candidate obeys task scheduling constraint:
-        // only child of current task can be scheduled
+        // only descendant of current task can be scheduled
         kmp_taskdata_t * current = __kmp_threads[ gtid ]->th.th_current_task;
         kmp_int32        level = current->td_level;
         kmp_taskdata_t * parent = taskdata->td_parent;
         while ( parent != current && parent->td_level > level ) {
             parent = parent->td_parent;  // check generation up to the level of the current task
             KMP_DEBUG_ASSERT(parent != NULL);
         }
         if ( parent != current ) {
-            // If the tail task is not a descendant of the current task then do not steal it.
+            // If the head task is not a descendant of the current task then do not
+            // steal it. No other task in victim's deque can be a descendant of the
+            // current task.
             __kmp_release_bootstrap_lock( & victim_td -> td.td_deque_lock );
             KA_TRACE(10, ("__kmp_steal_task(exit #2): T#%d could not steal from T#%d: task_team=%p "
                           "ntasks=%d head=%u tail=%u\n",
                           gtid, __kmp_gtid_from_thread( threads_data[victim_tid].td.td_thr ),
                           task_team, victim_td->td.td_deque_ntasks,
                           victim_td->td.td_deque_head, victim_td->td.td_deque_tail) );
             return NULL;
         }
-        victim_td -> td.td_deque_tail = tail;
     }
+    // Bump head pointer and Wrap.
+    victim_td->td.td_deque_head = (victim_td->td.td_deque_head + 1) & TASK_DEQUE_MASK(victim_td->td);
     if (*thread_finished) {
         // We need to un-mark this victim as a finished victim.  This must be done before
         // releasing the lock, or else other threads (starting with the master victim)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26187.76724.patch
Type: text/x-patch
Size: 2851 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20161102/decc6d43/attachment.bin>


More information about the Openmp-commits mailing list