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
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
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
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
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
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
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