diff --git a/loopy/target/ispc.py b/loopy/target/ispc.py index 261475eb440d5e77b382300cf393ad28dd67af43..9009b14447b611f16ccd18076f5fd8e4ca9fd0ea 100644 --- a/loopy/target/ispc.py +++ b/loopy/target/ispc.py @@ -437,9 +437,9 @@ class ISPCASTBuilder(CASTBuilder): else: for dep in get_dependencies(term): if filter_iname_tags_by_type( - kernel.iname_to_tags[dep], LocalIndexTag): + kernel.iname_to_tags.get(dep, []), LocalIndexTag): tag, = filter_iname_tags_by_type( - kernel.iname_to_tags[dep], LocalIndexTag, 1) + kernel.iname_to_tags.get(dep, []), LocalIndexTag, 1) if tag.axis == 0: raise LoopyError( "streaming store must have stride 1 in " diff --git a/test/test_target.py b/test/test_target.py index eb94bdc814dde96e17bdf8524ad9671dcaf34dd9..a00114265bda6dae6f945596b0ec69e88c5113ca 100644 --- a/test/test_target.py +++ b/test/test_target.py @@ -327,6 +327,35 @@ def test_target_invalid_type_cast(): lp.TypeCast(dtype, 1) +def test_ispc_streaming_stores(): + stream_dtype = np.float32 + index_dtype = np.int32 + + knl = lp.make_kernel( + "{[i]: 0<=i<n}", + "a[i] = b[i] + scalar * c[i]", + target=lp.ISPCTarget(), index_dtype=index_dtype, + name="stream_triad") + + vars = ["a", "b", "c", "scalar"] + knl = lp.assume(knl, "n>0") + knl = lp.split_iname( + knl, "i", 2**18, outer_tag="g.0", slabs=(0, 1)) + knl = lp.split_iname(knl, "i_inner", 8, inner_tag="l.0") + knl = lp.tag_instructions(knl, "!streaming_store") + + knl = lp.add_and_infer_dtypes(knl, { + var: stream_dtype + for var in vars + }) + + knl = lp.set_argument_order(knl, vars + ["n"]) + + knl = lp.preprocess_kernel(knl) + knl = lp.get_one_scheduled_kernel(knl) + lp.generate_code_v2(knl).all_code() + + if __name__ == "__main__": if len(sys.argv) > 1: exec(sys.argv[1])