Пример #1
0
def get_elwise_kernel_and_types(context, arguments, operation,
        name="elwise_kernel", options=[], preamble="", **kwargs):
    if isinstance(arguments, str):
        from pyopencl.tools import parse_c_arg
        parsed_args = [parse_c_arg(arg) for arg in arguments.split(",")]
    else:
        parsed_args = arguments

    for arg in parsed_args:
        if np.float64 == arg.dtype:
            preamble = (
                    "#pragma OPENCL EXTENSION cl_khr_fp64: enable\n\n\n"
                    + preamble)
            break

    parsed_args.append(ScalarArg(np.uintp, "n"))

    prg = get_elwise_program(
        context, parsed_args, operation,
        name=name, options=options, preamble=preamble, **kwargs)

    scalar_arg_dtypes = []
    for arg in parsed_args:
        if isinstance(arg, ScalarArg):
            scalar_arg_dtypes.append(arg.dtype)
        else:
            scalar_arg_dtypes.append(None)

    kernel = getattr(prg, name)
    kernel.set_scalar_arg_dtypes(scalar_arg_dtypes)

    return kernel, parsed_args
Пример #2
0
def get_elwise_kernel_and_types(context,
                                arguments,
                                operation,
                                name="elwise_kernel",
                                keep=False,
                                options=[],
                                preamble="",
                                **kwargs):
    if isinstance(arguments, str):
        from pyopencl.tools import parse_c_arg
        parsed_args = [parse_c_arg(arg) for arg in arguments.split(",")]
    else:
        parsed_args = arguments

    for arg in parsed_args:
        if numpy.float64 == arg.dtype:
            preamble += "\n\n#pragma OPENCL EXTENSION cl_khr_fp64: enable\n"
            break

    parsed_args.append(ScalarArg(numpy.uintp, "n"))

    prg = get_elwise_program(context, parsed_args, operation, name, keep,
                             options, preamble, **kwargs)

    scalar_arg_dtypes = []
    for arg in parsed_args:
        if isinstance(arg, ScalarArg):
            scalar_arg_dtypes.append(arg.dtype)
        else:
            scalar_arg_dtypes.append(None)

    kernel = getattr(prg, name)
    kernel.set_scalar_arg_dtypes(scalar_arg_dtypes)

    return kernel, parsed_args
Пример #3
0
def get_reduction_kernel(
         ctx, out_type, out_type_size,
         neutral, reduce_expr, map_expr=None, arguments=None,
         name="reduce_kernel", preamble="",
         device=None, options=[], max_group_size=None):
    if map_expr is None:
        map_expr = "in[i]"

    if arguments is None:
        arguments = "__global const %s *in" % out_type

    inf = get_reduction_source(
            ctx, out_type, out_type_size,
            neutral, reduce_expr, map_expr, arguments,
            name, preamble, device, max_group_size)

    inf.program = cl.Program(ctx, inf.source)
    inf.program.build(options)
    inf.kernel = getattr(inf.program, name)

    from pyopencl.tools import parse_c_arg, ScalarArg

    inf.arg_types = [parse_c_arg(arg) for arg in arguments.split(",")]
    scalar_arg_dtypes = [None]
    for arg_type in inf.arg_types:
        if isinstance(arg_type, ScalarArg):
            scalar_arg_dtypes.append(arg_type.dtype)
        else:
            scalar_arg_dtypes.append(None)
    scalar_arg_dtypes.extend([np.uint32]*2)

    inf.kernel.set_scalar_arg_dtypes(scalar_arg_dtypes)

    return inf
Пример #4
0
    def parse_single_arg(obj):
        if isinstance(obj, str):
            from pyopencl.tools import parse_c_arg

            return parse_c_arg(obj, with_offset=with_offset)
        else:
            return obj
Пример #5
0
def get_elwise_kernel_and_types(context, arguments, operation,
        name="elwise_kernel", options=[], preamble="", use_range=False,
        **kwargs):
    if isinstance(arguments, str):
        from pyopencl.tools import parse_c_arg
        parsed_args = [parse_c_arg(arg) for arg in arguments.split(",")]
    else:
        parsed_args = arguments

    auto_preamble = kwargs.pop("auto_preamble", True)

    pragmas = []
    includes = []
    have_double_pragma = False
    have_complex_include = False

    if auto_preamble:
        for arg in parsed_args:
            if arg.dtype in [np.float64, np.complex128]:
                if not have_double_pragma:
                    pragmas.append(
                            "#pragma OPENCL EXTENSION cl_khr_fp64: enable\n"
                            "#define PYOPENCL_DEFINE_CDOUBLE\n")
                    have_double_pragma = True
            if arg.dtype.kind == 'c':
                if not have_complex_include:
                    includes.append("#include <pyopencl-complex.h>\n")
                    have_complex_include = True

    if pragmas or includes:
        preamble = "\n".join(pragmas+includes) + "\n" + preamble

    if use_range:
        parsed_args.extend([
            ScalarArg(np.intp, "start"),
            ScalarArg(np.intp, "stop"),
            ScalarArg(np.intp, "step"),
            ])
    else:
        parsed_args.append(ScalarArg(np.intp, "n"))

    prg = get_elwise_program(
        context, parsed_args, operation,
        name=name, options=options, preamble=preamble,
        use_range=use_range, **kwargs)

    scalar_arg_dtypes = []
    for arg in parsed_args:
        if isinstance(arg, ScalarArg):
            scalar_arg_dtypes.append(arg.dtype)
        else:
            scalar_arg_dtypes.append(None)

    kernel = getattr(prg, name)
    kernel.set_scalar_arg_dtypes(scalar_arg_dtypes)

    return kernel, parsed_args
Пример #6
0
def get_reduction_kernel(stage,
                         ctx,
                         out_type,
                         out_type_size,
                         neutral,
                         reduce_expr,
                         map_expr=None,
                         arguments=None,
                         name="reduce_kernel",
                         preamble="",
                         device=None,
                         options=[],
                         max_group_size=None):
    if map_expr is None:
        if stage == 2:
            map_expr = "pyopencl_reduction_inp[i]"
        else:
            map_expr = "in[i]"

    if stage == 2:
        in_arg = "__global const %s *pyopencl_reduction_inp" % out_type
        if arguments:
            arguments = in_arg + ", " + arguments
        else:
            arguments = in_arg

    inf = get_reduction_source(ctx, out_type, out_type_size, neutral,
                               reduce_expr, map_expr, arguments, name,
                               preamble, device, max_group_size)

    inf.program = cl.Program(ctx, inf.source)
    inf.program.build(options)
    inf.kernel = getattr(inf.program, name)

    from pyopencl.tools import parse_c_arg, ScalarArg

    inf.arg_types = [parse_c_arg(arg) for arg in arguments.split(",")]
    scalar_arg_dtypes = [None]
    for arg_type in inf.arg_types:
        if isinstance(arg_type, ScalarArg):
            scalar_arg_dtypes.append(arg_type.dtype)
        else:
            scalar_arg_dtypes.append(None)
    scalar_arg_dtypes.extend([np.uint32] * 2)

    inf.kernel.set_scalar_arg_dtypes(scalar_arg_dtypes)

    return inf
Пример #7
0
def get_elwise_kernel_and_types(context, arguments, operation,
        name="elwise_kernel", options=[], preamble="", **kwargs):
    if isinstance(arguments, str):
        from pyopencl.tools import parse_c_arg
        parsed_args = [parse_c_arg(arg) for arg in arguments.split(",")]
    else:
        parsed_args = arguments

    pragmas = []
    includes = []
    have_double_pragma = False
    have_complex_include = False

    for arg in parsed_args:
        if arg.dtype in [np.float64, np.complex128]:
            if not have_double_pragma:
                pragmas.append(
                        "#pragma OPENCL EXTENSION cl_khr_fp64: enable\n"
                        "#define PYOPENCL_DEFINE_CDOUBLE\n")
                have_double_pragma = True
        if arg.dtype.kind == 'c':
            if not have_complex_include:
                includes.append("#include <pyopencl-complex.h>\n")
                have_complex_include = True

    if pragmas or includes:
        preamble = "\n".join(pragmas+includes) + "\n" + preamble

    parsed_args.append(ScalarArg(np.uintp, "n"))

    prg = get_elwise_program(
        context, parsed_args, operation,
        name=name, options=options, preamble=preamble, **kwargs)

    scalar_arg_dtypes = []
    for arg in parsed_args:
        if isinstance(arg, ScalarArg):
            scalar_arg_dtypes.append(arg.dtype)
        else:
            scalar_arg_dtypes.append(None)

    kernel = getattr(prg, name)
    kernel.set_scalar_arg_dtypes(scalar_arg_dtypes)

    return kernel, parsed_args
Пример #8
0
 def parse_single_arg(obj):
     if isinstance(obj, str):
         from pyopencl.tools import parse_c_arg
         return parse_c_arg(obj, with_offset=with_offset)
     else:
         return obj