From e27b8015f898ce829d90a57ec37cbff1118ecf64 Mon Sep 17 00:00:00 2001 From: Marcel Koch <marcel.koch@uni-muenster.de> Date: Thu, 14 Feb 2019 16:30:17 +0100 Subject: [PATCH] separate c index array and vectorized index array --- .../codegen/blockstructured/vectorization.py | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/python/dune/codegen/blockstructured/vectorization.py b/python/dune/codegen/blockstructured/vectorization.py index c3a4b81f..b45d92f8 100644 --- a/python/dune/codegen/blockstructured/vectorization.py +++ b/python/dune/codegen/blockstructured/vectorization.py @@ -338,38 +338,67 @@ def find_accumulation_inames(knl): return inames -def add_iname_array(knl, vec_iname): - insns_with_macro_points = lp.find_instructions(knl, Tagged(vec_iname)) +def add_iname_array(knl, iname): + insns_with_macro_points = lp.find_instructions(knl, Tagged(iname)) if insns_with_macro_points: - array_name = vec_iname + '_arr' - vector_name = vec_iname + '_vec' + new_iname = knl.get_var_name_generator()(iname) + + new_dom = BasicSet('{{ [{0}] : 0<={0}<{1} }}'.format(new_iname, get_form_option('number_of_blocks'))) + + array_name = iname + '_arr' new_temporaries = dict() new_temporaries[array_name] = DuneTemporaryVariable(array_name, managed=True, shape=(get_form_option('number_of_blocks'),), scope=lp.temp_var_scope.PRIVATE, dtype=np.float64, - base_storage=vec_iname + '_buff', + base_storage=array_name + '_buff', _base_storage_access_may_be_aliasing=True) + + replacemap = dict() + replacemap[iname] = prim.Subscript(prim.Variable(array_name), (prim.Variable(iname),)) + + new_insns = [lp.Assignment(assignee=prim.Subscript(prim.Variable(array_name), (prim.Variable(new_iname),)), + expression=prim.Variable(new_iname), + id='init_{}_buffer'.format(array_name), + within_inames=frozenset({new_iname}), within_inames_is_final=True)] + + for insn in knl.instructions: + if insn in insns_with_macro_points: + transformed_insn = insn.with_transformed_expressions(lambda expr: substitute(expr, replacemap)) + new_insns.append(transformed_insn.copy(depends_on='init_{}_buffer'.format(array_name))) + else: + new_insns.append(insn) + + knl = knl.copy(instructions=new_insns, domains=knl.domains + [new_dom], + temporary_variables=dict(**knl.temporary_variables, **new_temporaries)) + + return knl + + +def add_vcl_iname_array(knl, iname, vec_iname, vcl_size): + insns_with_macro_points = lp.find_instructions(knl, And((Tagged(iname), Iname(vec_iname)))) + + if insns_with_macro_points: + iname_array = iname + '_arr' + vector_name = iname + '_vec{}'.format(vcl_size) + + new_temporaries = dict() new_temporaries[vector_name] = DuneTemporaryVariable(vector_name, managed=True, shape=(get_form_option('number_of_blocks'),), scope=lp.temp_var_scope.PRIVATE, dtype=np.float64, - base_storage=vec_iname + '_buff', + base_storage=iname_array + '_buff', _base_storage_access_may_be_aliasing=True) silenced_warning = ["read_no_write({})".format(vector_name)] - new_insns = [lp.Assignment(assignee=prim.Subscript(prim.Variable(array_name), (prim.Variable(vec_iname),)), - expression=prim.Variable(vec_iname), - id='init_{}_buffer'.format(vec_iname), - within_inames=frozenset({vec_iname}), within_inames_is_final=True)] - replacemap = dict() - replacemap[vec_iname] = prim.Subscript(prim.Variable(vector_name), (prim.Variable(vec_iname),)) + replacemap[iname_array] = prim.Variable(vector_name) + new_insns = [] for insn in knl.instructions: if insn in insns_with_macro_points: transformed_insn = insn.with_transformed_expressions(lambda expr: substitute(expr, replacemap)) - new_insns.append(transformed_insn.copy(depends_on='init_{}_buffer'.format(vec_iname))) + new_insns.append(transformed_insn.copy(depends_on='init_{}_buffer'.format(iname_array))) else: new_insns.append(insn) @@ -377,7 +406,8 @@ def add_iname_array(knl, vec_iname): temporary_variables=dict(**knl.temporary_variables, **new_temporaries), silenced_warnings=knl.silenced_warnings + silenced_warning) - knl = lp.duplicate_inames(knl, [vec_iname], within=Id('init_{}_buffer'.format(vec_iname))) + knl = lp.split_array_axis(knl, (vector_name,), 0, vcl_size) + knl = lp.tag_array_axes(knl, (vector_name,), ('c', 'vec')) return knl -- GitLab