From 9839514634da169e18798c53e4ab5f26a5dc96a8 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Mon, 7 Nov 2011 11:42:00 -0500
Subject: [PATCH] Scheduler: be less eager about entering loops, more eager
 about leaving them.

---
 loopy/schedule.py | 43 +++++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/loopy/schedule.py b/loopy/schedule.py
index 8c61405e0..bd5151da9 100644
--- a/loopy/schedule.py
+++ b/loopy/schedule.py
@@ -197,7 +197,6 @@ def generate_loop_schedules_internal(kernel, loop_priority, schedule=[]):
     # {{{ decide about debug mode
 
     debug_mode = False
-    #if (set(["D", "u"]) <= scheduled_insn_ids and active_inames_set == set(["e"])):
     if False:
         debug_mode = True
 
@@ -206,6 +205,9 @@ def generate_loop_schedules_internal(kernel, loop_priority, schedule=[]):
         print "--------------------------------------------"
         dump_schedule(schedule)
 
+    #if len(schedule) == 3:
+        #from pudb import set_trace; set_trace()
+
     if debug_mode:
         print "active:", ",".join(active_inames)
         print "entered:", ",".join(entered_inames)
@@ -289,6 +291,22 @@ def generate_loop_schedules_internal(kernel, loop_priority, schedule=[]):
 
     # }}}
 
+    # {{{ see if we're ready to leave a loop
+
+    if  last_entered_loop is not None:
+        can_leave = True
+        for insn_id in unscheduled_insn_ids:
+            insn = kernel.id_to_insn[insn_id]
+            if last_entered_loop in kernel.insn_inames(insn):
+                can_leave = False
+                break
+
+        if can_leave:
+            schedule = schedule + [LeaveLoop(iname=last_entered_loop)]
+            made_progress = True
+
+    # }}}
+
     # {{{ see if any loop can be entered now
 
     available_loops = (kernel.all_referenced_inames()
@@ -298,7 +316,11 @@ def generate_loop_schedules_internal(kernel, loop_priority, schedule=[]):
             - parallel_inames
             )
 
-    if available_loops:
+    # Don't be eager about scheduling new loops--if progress has been made,
+    # revert to top of scheduler and see if more progress can be made another
+    # way. (hence 'and not made_progress')
+
+    if available_loops and not made_progress:
         useful_loops = []
 
         for iname in available_loops:
@@ -336,7 +358,7 @@ def generate_loop_schedules_internal(kernel, loop_priority, schedule=[]):
         # {{{ tier building
 
         # Build priority tiers. If a schedule is found in the first tier, then
-        # loops in the second are not even tried.
+        # loops in the second are not even tried (and so on).
 
         loop_priority_set = set(loop_priority)
         useful_and_desired = set(useful_loops) & loop_priority_set
@@ -372,21 +394,6 @@ def generate_loop_schedules_internal(kernel, loop_priority, schedule=[]):
 
     # }}}
 
-    # {{{ see if we're ready to leave a loop
-
-    if  last_entered_loop is not None:
-        can_leave = True
-        for insn_id in unscheduled_insn_ids:
-            insn = kernel.id_to_insn[insn_id]
-            if last_entered_loop in kernel.insn_inames(insn):
-                can_leave = False
-                break
-
-        if can_leave:
-            schedule = schedule + [LeaveLoop(iname=last_entered_loop)]
-            made_progress = True
-
-    # }}}
 
     if debug_mode:
         raw_input("Enter:")
-- 
GitLab