aboutsummaryrefslogtreecommitdiff
path: root/boltzgen/kernel/template/pattern/AB.cl.mako
diff options
context:
space:
mode:
authorAdrian Kummerlaender2019-11-04 23:38:36 +0100
committerAdrian Kummerlaender2019-11-04 23:38:36 +0100
commit5828235f806c3e87a5b1eed34ef69ef317a110bd (patch)
treef4fd988f2af0e0ca2cd0e1b277f26fcf8b0f3b3a /boltzgen/kernel/template/pattern/AB.cl.mako
parent05e74fb112f5b5f645b649c587d18052c7b7f9df (diff)
downloadboltzgen-5828235f806c3e87a5b1eed34ef69ef317a110bd.tar
boltzgen-5828235f806c3e87a5b1eed34ef69ef317a110bd.tar.gz
boltzgen-5828235f806c3e87a5b1eed34ef69ef317a110bd.tar.bz2
boltzgen-5828235f806c3e87a5b1eed34ef69ef317a110bd.tar.lz
boltzgen-5828235f806c3e87a5b1eed34ef69ef317a110bd.tar.xz
boltzgen-5828235f806c3e87a5b1eed34ef69ef317a110bd.tar.zst
boltzgen-5828235f806c3e87a5b1eed34ef69ef317a110bd.zip
Extract streaming pattern into Mako definitions
This should allow for plugging in e.g. a AA pattern implementation without without touching any file but `AA.$target.mako`. OpenCL and C++ target templates now look basically the same and could potentially be merged. However this would decrease flexibility should more differences appear in the future. Maintaining separate template files is an acceptable overhead to preserve flexibility.
Diffstat (limited to 'boltzgen/kernel/template/pattern/AB.cl.mako')
-rw-r--r--boltzgen/kernel/template/pattern/AB.cl.mako69
1 files changed, 69 insertions, 0 deletions
diff --git a/boltzgen/kernel/template/pattern/AB.cl.mako b/boltzgen/kernel/template/pattern/AB.cl.mako
new file mode 100644
index 0000000..c6391fa
--- /dev/null
+++ b/boltzgen/kernel/template/pattern/AB.cl.mako
@@ -0,0 +1,69 @@
+<%def name="operator_ab(name, params = None)">
+__kernel void ${name}(
+ __global ${float_type}* f_next
+ , __global ${float_type}* f_prev
+ , unsigned int gid
+% if params is not None:
+% for param_type, param_name in params:
+ , ${param_type} ${param_name}
+% endfor
+% endif
+) {
+ __global ${float_type}* preshifted_f_next = f_next + ${layout.cell_preshift('gid')};
+ __global ${float_type}* preshifted_f_prev = f_prev + ${layout.cell_preshift('gid')};
+
+% for i, c_i in enumerate(descriptor.c):
+ const ${float_type} f_curr_${i} = preshifted_f_prev[${layout.pop_offset(i) + layout.neighbor_offset(-c_i)}];
+% endfor
+
+ ${caller.body()}
+
+% for i, _ in enumerate(descriptor.c):
+ preshifted_f_next[${layout.pop_offset(i)}] = f_next_${i};
+% endfor
+}
+
+% if 'cell_list_dispatch' in extras:
+__kernel void ${name}_cells(
+ __global ${float_type}* f_next
+ , __global ${float_type}* f_prev
+ , __global unsigned int* cells
+% if params is not None:
+% for param_type, param_name in params:
+ , ${param_type} ${param_name}
+% endfor
+% endif
+) {
+ ${name}(
+ f_next
+ , f_prev
+ , cells[get_global_id(0)]
+% if params is not None:
+% for param_type, param_name in params:
+ , ${param_name}
+% endfor
+% endif
+ );
+}
+% endif
+</%def>
+
+<%def name="functor_ab(name, params = None)">
+__kernel void ${name}(
+ __global ${float_type}* f
+ , unsigned int gid
+% if params is not None:
+% for param_type, param_name in params:
+ , ${param_type} ${param_name}
+% endfor
+% endif
+) {
+ __global ${float_type}* preshifted_f = f + ${layout.cell_preshift('gid')};
+
+% for i in range(0,descriptor.q):
+ const ${float_type} f_curr_${i} = preshifted_f[${layout.pop_offset(i)}];
+% endfor
+
+ ${caller.body()}
+}
+</%def>