aboutsummaryrefslogtreecommitdiff
path: root/boltzgen
diff options
context:
space:
mode:
Diffstat (limited to 'boltzgen')
-rw-r--r--boltzgen/kernel/generator.py12
-rw-r--r--boltzgen/kernel/template/pattern/AA.cpp.mako83
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>