From b47bdf9d6c35defd38ecb40f506c286ffbe8b17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Kl=C3=B6ckner?= <inform@tiker.net> Date: Mon, 12 Dec 2016 16:28:02 -0500 Subject: [PATCH] Revert "Merge branch 'remove-ambigiuous-scheduling-warning' into 'master'" This reverts merge request !62 --- doc/tutorial.rst | 13 +++++++++---- loopy/schedule/__init__.py | 26 +++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/doc/tutorial.rst b/doc/tutorial.rst index 9e4bd8c91..d9627deed 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -456,8 +456,8 @@ control is the nesting of loops. For example, should the *i* loop be nested around the *j* loop, or the other way around, in the following simple zero-fill kernel? -It turns out that Loopy will choose a loop nesting for us, but it might be -ambiguous. Consider the following code: +It turns out that Loopy will typically choose a loop nesting for us, but it +does not like doing so. Loo.py will react to the following code .. doctest:: @@ -467,8 +467,13 @@ ambiguous. Consider the following code: ... a[i,j] = 0 ... """) -Both nestings of the inames `i` and `j` result in a correct kernel. -This ambiguity can be resolved: +By saying:: + + LoopyWarning: kernel scheduling was ambiguous--more than one schedule found, ignoring + +And by picking one of the possible loop orderings at random. + +The warning (and the nondeterminism it warns about) is easily resolved: .. doctest:: diff --git a/loopy/schedule/__init__.py b/loopy/schedule/__init__.py index bf51147b5..e23e5f350 100644 --- a/loopy/schedule/__init__.py +++ b/loopy/schedule/__init__.py @@ -1959,7 +1959,7 @@ def get_one_scheduled_kernel(kernel): if CACHING_ENABLED: try: - result = schedule_cache[sched_cache_key] + result, ambiguous = schedule_cache[sched_cache_key] logger.debug("%s: schedule cache hit" % kernel.name) from_cache = True @@ -1967,18 +1967,38 @@ def get_one_scheduled_kernel(kernel): pass if not from_cache: + ambiguous = False + + kernel_count = 0 + from time import time start_time = time() logger.info("%s: schedule start" % kernel.name) - result = next(iter(generate_loop_schedules(kernel))) + for scheduled_kernel in generate_loop_schedules(kernel): + kernel_count += 1 + + if kernel_count == 1: + # use the first schedule + result = scheduled_kernel + + if kernel_count == 2: + ambiguous = True + break logger.info("%s: scheduling done after %.2f s" % ( kernel.name, time()-start_time)) + if ambiguous: + from warnings import warn + from loopy.diagnostic import LoopyWarning + warn("scheduling for kernel '%s' was ambiguous--more than one " + "schedule found, ignoring" % kernel.name, LoopyWarning, + stacklevel=2) + if CACHING_ENABLED and not from_cache: - schedule_cache[sched_cache_key] = result + schedule_cache[sched_cache_key] = result, ambiguous return result -- GitLab