def print_plans(self): print(" Plans ".center(80, '-')) for plan in self._plans.plans: print("%s" % plan) if hasattr(plan, 'description'): print(indent(plan.description, 4))
def print_plans(self): print(" Plans ".center(80, '-')) for plan in self._plans: print("%r" % plan) if hasattr(plan, 'description'): print(indent(plan.description, 4))
def plan_direct(queue, code, init, input_names, inputs, output, tag=None): from . import ast_conversion assert len(input_names) == len(inputs) N = len(inputs[0]) for x in inputs: assert len(x) == len(output) for x in inputs + [output]: assert (x.shape1s == 1).all() and (x.stride1s == 1).all() assert (x.stride0s == 1).all() input_types = [x.ctype for x in inputs] output_type = output.ctype text = """ ////////// MAIN FUNCTION ////////// __kernel void direct( % for iname, itype in zip(input_names, input_types): __global const int *${iname}_starts__, __global const ${itype} *${iname}_data__, % endfor __global const int *${oname}_starts__, __global ${otype} *${oname}_data__ ) { const int n = get_global_id(0); if (n >= ${N}) return; % for iname, itype in zip(input_names, input_types): __global const ${itype} *${iname} = ${iname}_data__ + ${iname}_starts__[n]; % endfor __global ${otype} *${oname} = ${oname}_data__ + ${oname}_starts__[n]; /////vvvvv USER DECLARATIONS BELOW vvvvv ${init} /////vvvvv USER COMPUTATIONS BELOW vvvvv ${code} // END OF FUNC: put nothing after user code, since it can return } """ textconf = dict(init=indent(init, 12), code=indent(code, 12), N=N, input_names=input_names, input_types=input_types, oname=ast_conversion.OUTPUT_NAME, otype=output_type, ) text = as_ascii(Template(text, output_encoding='ascii').render(**textconf)) full_args = [] for x in inputs: full_args.extend([x.cl_starts, x.cl_buf]) full_args.extend([output.cl_starts, output.cl_buf]) _fn = cl.Program(queue.context, text).build().direct _fn.set_args(*[arr.data for arr in full_args]) gsize = (N,) rval = Plan(queue, _fn, gsize, lsize=None, name="cl_direct", tag=tag) rval.full_args = full_args # prevent garbage-collection rval.description = ( "groups: %d; items: %d; items/group: %0.1f [%d, %d]" % (len(output), output.sizes.sum(), output.sizes.mean(), output.sizes.min(), output.sizes.max())) return rval