Exemple #1
0
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'))
Exemple #2
0
                        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
Exemple #3
0
        # 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
Exemple #4
0
            ]
            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