diff options
Diffstat (limited to 'boltzgen')
-rw-r--r-- | boltzgen/kernel/generator.py | 12 | ||||
-rw-r--r-- | boltzgen/kernel/template/pattern/AA.cpp.mako | 83 |
2 files changed, 90 insertions, 5 deletions
diff --git a/boltzgen/kernel/generator.py b/boltzgen/kernel/generator.py index dd44a56..ee5bf8b 100644 --- a/boltzgen/kernel/generator.py +++ b/boltzgen/kernel/generator.py @@ -10,7 +10,7 @@ template_lookup = TemplateLookup(directories = [ ]) class Generator: - def __init__(self, model, target, precision, index, layout): + def __init__(self, model, target, precision, index, layout, streaming): self.model = model self.descriptor = self.model.descriptor self.target = target @@ -26,6 +26,8 @@ class Generator: except AttributeError: raise Exception("There is no layout '%s'" % layout) from None + self.streaming = streaming + def instantiate(self, template, geometry, extras = []): template_path = Path(__file__).parent/("template/%s.%s.mako" % (template, self.target)) if not template_path.exists(): @@ -35,10 +37,10 @@ class Generator: descriptor = self.descriptor, model = self.model, geometry = geometry, + float_type = self.float_type, index = self.index_impl(geometry), layout = self.layout_impl(self.descriptor, self.index_impl, geometry), - streaming = 'AB', - float_type = self.float_type, + streaming = self.streaming, extras = extras ) @@ -53,9 +55,9 @@ class Generator: descriptor = self.descriptor, model = self.model, geometry = geometry, + float_type = self.float_type, index = self.index_impl(geometry), layout = self.layout_impl(self.descriptor, self.index_impl, geometry), - streaming = 'AB', - float_type = self.float_type, + streaming = self.streaming, extras = extras ) diff --git a/boltzgen/kernel/template/pattern/AA.cpp.mako b/boltzgen/kernel/template/pattern/AA.cpp.mako new file mode 100644 index 0000000..a61bb41 --- /dev/null +++ b/boltzgen/kernel/template/pattern/AA.cpp.mako @@ -0,0 +1,83 @@ +<%def name="operator(name, params = None)"> +void ${name}_tick( + ${float_type}* f + , std::size_t gid +% if params is not None: +% for param_type, param_name in params: + , ${param_type} ${param_name} +% endfor +% endif +) { + ${float_type}* preshifted_f = f + ${layout.cell_preshift('gid')}; + +% for i, c_i in enumerate(descriptor.c): + const ${float_type} f_curr_${i} = preshifted_f[${layout.pop_offset(i)}]; +% endfor + + ${caller.body()} + +% for i, c_i in enumerate(descriptor.c): + preshifted_f[${layout.pop_offset(i)}] = f_next_${descriptor.c.index(-c_i)}; +% endfor +} + +void ${name}_tock( + ${float_type}* f + , std::size_t gid +% if params is not None: +% for param_type, param_name in params: + , ${param_type} ${param_name} +% endfor +% endif +) { + ${float_type}* preshifted_f = f + ${layout.cell_preshift('gid')}; + +% for i, c_i in enumerate(descriptor.c): + const ${float_type} f_curr_${descriptor.c.index(-c_i)} = preshifted_f[${layout.pop_offset(i) + layout.neighbor_offset(c_i)}]; +% endfor + + ${caller.body()} + +% for i, c_i in enumerate(descriptor.c): + preshifted_f[${layout.pop_offset(i) + layout.neighbor_offset(c_i)}] = f_next_${i}; +% endfor +} +</%def> + +<%def name="functor(name, params = None)"> +void ${name}_tick( + const ${float_type}* f + , std::size_t gid +% if params is not None: +% for param_type, param_name in params: + , ${param_type} ${param_name} +% endfor +% endif +) { + const ${float_type}* preshifted_f = f + ${layout.cell_preshift('gid')}; + +% for i, c_i in enumerate(descriptor.c): + const ${float_type} f_curr_${i} = preshifted_f[${layout.pop_offset(descriptor.c.index(-c_i))}]; +% endfor + + ${caller.body()} +} + +void ${name}_tock( + const ${float_type}* f + , std::size_t gid +% if params is not None: +% for param_type, param_name in params: + , ${param_type} ${param_name} +% endfor +% endif +) { + const ${float_type}* preshifted_f = f + ${layout.cell_preshift('gid')}; + +% for i, c_i in enumerate(descriptor.c): + const ${float_type} f_curr_${i} = preshifted_f[${layout.pop_offset(i) + layout.neighbor_offset(c_i)}]; +% endfor + + ${caller.body()} +} +</%def> |