From 93cbdebc2f71936d9c5433da33467a1b49c53abd Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Sun, 23 Sep 2012 14:42:27 -0500
Subject: [PATCH] Add better error message in case 'temp var in local?' cannot
 make a valid decision because of a potential write race.

---
 MEMO                   |  4 +---
 loopy/preprocess.py    | 10 ++++++++++
 proto-tests/test_dg.py | 12 +++---------
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/MEMO b/MEMO
index 09245716d..2d88a1040 100644
--- a/MEMO
+++ b/MEMO
@@ -47,12 +47,10 @@ To-do
 
 - Make tests run on GPUs
 
-- Streamline arg
+- Streamline argument specification
 
 - Fix timer / call code
 
-- variant_prefetch_fields in test_dg
-
 - make sure simple side effects in global work
 
 - syntax for linear array access
diff --git a/loopy/preprocess.py b/loopy/preprocess.py
index 38ebb87fb..a1420d7bc 100644
--- a/loopy/preprocess.py
+++ b/loopy/preprocess.py
@@ -151,6 +151,16 @@ def mark_local_temporaries(kernel):
 
             assert locparallel_assignee_inames <= locparallel_compute_inames
 
+            if (locparallel_assignee_inames != locparallel_compute_inames
+                    and bool(locparallel_assignee_inames)):
+                raise RuntimeError("instruction '%s' looks invalid: "
+                        "it assigns to indices based on local IDs, but "
+                        "its temporary '%s' cannot be made local because "
+                        "a write race across the iname(s) '%s' would emerge. "
+                        "(Do you need to add an extra iname to your prefetch?)"
+                        % (insn_id, temp_var.name, ", ".join(
+                            locparallel_compute_inames - locparallel_assignee_inames)))
+
             wants_to_be_local_per_insn.append(
                     locparallel_assignee_inames == locparallel_compute_inames
 
diff --git a/proto-tests/test_dg.py b/proto-tests/test_dg.py
index 9f39b1a4b..1295e6047 100644
--- a/proto-tests/test_dg.py
+++ b/proto-tests/test_dg.py
@@ -88,15 +88,13 @@ def test_dg_volume(ctx_factory):
         knl = lp.tag_inames(knl, dict(n="l.0"))
         knl = lp.split_iname(knl, "k", 3, outer_tag="g.0", inner_tag="l.1")
         for name in ["u", "v", "w", "p"]:
-            # FIXME
-            knl = lp.add_prefetch(knl, "%s[:,k]" % name)
+            knl = lp.add_prefetch(knl, "%s[:,k]" % name, ["k_inner"])
 
         return knl
 
     def variant_k_ilp(knl):
         knl = lp.tag_inames(knl, dict(n="l.0"))
 
-        # FIXME
         knl = lp.split_iname(knl, "k", 3, outer_tag="g.0", inner_tag="ilp")
         knl = lp.tag_inames(knl, dict(m="unr"))
         return knl
@@ -123,17 +121,13 @@ def test_dg_volume(ctx_factory):
 
         pad_mult = lp.find_padding_multiple(knl, "u", 1, 32)
 
-        knl = lp.split_iname(knl, "k", pad_mult, outer_tag="g.0", inner_tag="l.1")
-
         arg_names = [
                 prefix+name
                 for name in ["u", "v", "w", "p"]
                 for prefix in ["", "rhs"]]
 
-        # FIXME
         knl = lp.split_arg_axis(knl, [(nm, 1) for nm in arg_names], pad_mult)
 
-
         return knl
 
     parameters_dict = dict(K=K)
@@ -141,9 +135,9 @@ def test_dg_volume(ctx_factory):
     for variant in [
             #variant_basic,
             #variant_more_per_work_group,
-            variant_image_d,
+            #variant_image_d,
             #variant_prefetch_d,
-            #variant_prefetch_fields,
+            variant_prefetch_fields,
             #variant_k_ilp,
             #variant_simple_padding,
             #variant_fancy_padding
-- 
GitLab