diff options
-rwxr-xr-x | boltzgen.py | 4 | ||||
-rw-r--r-- | boltzgen/kernel/generator.py | 12 | ||||
-rw-r--r-- | boltzgen/kernel/template/pattern/AA.cpp.mako | 83 |
3 files changed, 93 insertions, 6 deletions
diff --git a/boltzgen.py b/boltzgen.py index 57b3ed0..216234f 100755 --- a/boltzgen.py +++ b/boltzgen.py @@ -10,9 +10,10 @@ argparser.add_argument('target', help = 'Target language (currently either "cl" argparser.add_argument('--lattice', required = True, help = 'Lattice type ("D2Q9", "D3Q7", "D3Q19", "D3Q27")') argparser.add_argument('--model', required = False, help = 'LBM model (currently only "BGK")') +argparser.add_argument('--precision', required = True, help = 'Floating precision ("single" or "double")') argparser.add_argument('--layout', required = True, help = 'Memory layout ("AOS" or "SOA")') argparser.add_argument('--index', required = False, help = 'Cell indexing ("XYZ" or "ZYX")') -argparser.add_argument('--precision', required = True, help = 'Floating precision ("single" or "double")') +argparser.add_argument('--streaming', required = True, help = 'Streaming pattern ("AB" or "AA")') argparser.add_argument('--geometry', required = True, help = 'Size of the block geometry ("x:y(:z)")') argparser.add_argument('--tau', required = True, help = 'BGK relaxation time') @@ -42,6 +43,7 @@ generator = Generator( model = model(lattice, tau = float(args.tau), optimize = not args.disable_cse), target = args.target, precision = args.precision, + streaming = args.streaming, index = args.index, layout = args.layout) 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> |