diff options
author | Adrian Kummerlaender | 2019-11-04 23:38:36 +0100 |
---|---|---|
committer | Adrian Kummerlaender | 2019-11-04 23:38:36 +0100 |
commit | 5828235f806c3e87a5b1eed34ef69ef317a110bd (patch) | |
tree | f4fd988f2af0e0ca2cd0e1b277f26fcf8b0f3b3a /boltzgen/kernel/template/pattern/AB.cl.mako | |
parent | 05e74fb112f5b5f645b649c587d18052c7b7f9df (diff) | |
download | boltzgen-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.mako | 69 |
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> |