namespace['jit-yk-soln'] = lambda i, j: 'devito_%s_yk_soln%d' % (i, j) namespace['kernel-filename'] = 'yask_stencil_code.hpp' namespace['path'] = path namespace['kernel-path'] = os.path.join(path, 'src', 'kernel') namespace['kernel-path-gen'] = os.path.join(namespace['kernel-path'], 'gen') namespace['kernel-output'] = os.path.join(namespace['kernel-path-gen'], namespace['kernel-filename']) namespace['time-dim'] = 't' namespace['code-soln-type'] = 'yask::yk_solution' namespace['code-soln-name'] = 'soln' namespace['code-soln-run'] = 'run_solution' namespace['code-grid-type'] = 'yask::yk_grid' namespace['code-grid-name'] = lambda i: "grid_%s" % str(i) namespace['code-grid-get'] = 'get_element' namespace['code-grid-put'] = 'set_element' namespace['type-solution'] = ctypes_pointer('yask::yk_solution_ptr') namespace['type-grid'] = ctypes_pointer('yask::yk_grid_ptr') # Need a custom compiler to compile YASK kernels # This is derived from the user-selected compiler class YaskCompiler(configuration['compiler'].__class__): def __init__(self, *args, **kwargs): super(YaskCompiler, self).__init__(*args, **kwargs) # Switch to C++ self.cc = self.cpp_mapper[configuration['compiler'].cc] self.ld = self.cpp_mapper[configuration['compiler'].ld] self.cflags = configuration['compiler'].cflags + ['-std=c++11'] self.src_ext = 'cpp' # Tell the compiler where to get YASK header files and shared objects self.include_dirs.append(os.path.join(namespace['path'], 'include'))
the normal form above. """ if not isinstance(expr, FunctionFromPointer) or len(expr.params) != 2: raise ValueError target = expr.pointer expr, indices = expr.params if not isinstance(indices, ListInitializer): raise ValueError if not expr.is_Add or len(expr.args) != 2: raise ValueError values = [i for i in expr.args if not isinstance(i, FunctionFromPointer)] if not len(values) == 1: raise ValueError return target, values[0], indices # YASK conventions namespace = OrderedDict() namespace['jit-hook'] = lambda i: 'hook_%s' % i namespace['jit-soln'] = lambda i: 'soln_%s' % i namespace['code-soln-name'] = lambda i: 'soln_%s' % i namespace['code-soln-run'] = 'run_solution' namespace['code-grid-name'] = lambda i: "grid_%s" % str(i) namespace['code-grid-get'] = 'get_element' namespace['code-grid-put'] = 'set_element' namespace['code-grid-add'] = 'add_to_element' namespace['type-solution'] = ctypes.POINTER( ctypes_pointer('yask::yk_solution_ptr')) namespace['type-grid'] = ctypes.POINTER(ctypes_pointer('yask::yk_grid_ptr')) namespace['numa-put-local'] = -1
# LHS translation if e.write.from_YASK: args = [rhs] args += [ListInitializer([INT(make_grid_gets(i)) for i in lhs.indices])] call = namespace['code-grid-add' if e.is_Increment else 'code-grid-put'] handle = make_sharedptr_funcall(call, args, yk_grid_objs[e.write.name]) processed = ForeignExpression(handle, e.dtype, is_Increment=e.is_Increment) else: # Writing to a scalar temporary processed = e._rebuild(expr=e.expr.func(lhs, rhs)) mapper.update({e: processed}) return Transformer(mapper).visit(node) # YASK conventions namespace = OrderedDict() namespace['jit-hook'] = lambda i: 'hook_%s' % i namespace['jit-soln'] = lambda i: 'soln_%s' % i namespace['code-soln-name'] = lambda i: 'soln_%s' % i namespace['code-soln-run'] = 'run_solution' namespace['code-grid-name'] = lambda i: "grid_%s" % str(i) namespace['code-grid-get'] = 'get_element' namespace['code-grid-put'] = 'set_element' namespace['code-grid-add'] = 'add_to_element' namespace['type-solution'] = ctypes_pointer('yask::yk_solution_ptr') namespace['type-grid'] = ctypes_pointer('yask::yk_grid_ptr') namespace['numa-put-local'] = -1
] call = namespace['code-var-add' if e. is_Increment else 'code-var-put'] handle = make_sharedptr_funcall(call, args, yk_var_objs[e.write.name]) processed = ForeignExpression(handle, e.dtype, is_Increment=e.is_Increment) else: # Writing to a scalar temporary processed = e._rebuild(expr=e.expr.func(lhs, rhs)) mapper.update({e: processed}) return Transformer(mapper).visit(node) # YASK conventions namespace = OrderedDict() namespace['jit-hook'] = lambda i: 'hook_%s' % i namespace['jit-soln'] = lambda i: 'soln_%s' % i namespace['code-soln-name'] = lambda i: 'soln_%s' % i namespace['code-soln-run'] = 'run_solution' namespace['code-var-name'] = lambda i: "var_%s" % str(i) namespace['code-var-get'] = 'get_element' namespace['code-var-put'] = 'set_element' namespace['code-var-add'] = 'add_to_element' namespace['type-solution'] = ctypes_pointer('yask::yk_solution_ptr') namespace['type-var'] = ctypes_pointer('yask::yk_var_ptr') namespace['numa-put-local'] = -1