def generic_visit(self, node): if isinstance(node, ast.expr): if is_constant(node.ctype): if isnumber(node.ctype): return cast.CNum(node.ctype, typeof(None, node.ctype)) return ast.NodeTransformer.generic_visit(self, node)
def source(self, ctx, *args, **kwargs): ''' Get the source that would be compiled for specific argument types. .. note:: This is meant to have a similar signature to the function call. i.e:: print func.source(queue.context, arg1, arg2) func(queue, arg1, arg2) ''' argnames = self.func.func_code.co_varnames[:self.func.func_code.co_argcount] defaults = self.func.func_defaults arglist = cl.kernel.parse_args(self.func.__name__, args, kwargs, argnames, defaults) kwarg_types = {argnames[i]:typeof(ctx, arglist[i]) for i in range(len(argnames))} return self.compile_or_cly(ctx, source_only=True, **kwarg_types)
def __call__(self, queue_or_context, *args, **kwargs): ''' Call this kernel as a function. :param queue_or_context: a queue or context. if this is a context a queue is created and finish is called before return. :return: an OpenCL event. ''' if isinstance(queue_or_context, cl.Context): queue = cl.Queue(queue_or_context) else: queue = queue_or_context argnames = self.func.func_code.co_varnames[:self.func.func_code.co_argcount] defaults = self.func.func_defaults kwargs_ = kwargs.copy() kwargs_.pop('global_work_size', None) kwargs_.pop('global_work_offset', None) kwargs_.pop('local_work_size', None) arglist = cl.kernel.parse_args(self.func.__name__, args, kwargs_, argnames, defaults) kwarg_types = {argnames[i]:typeof(queue.context, arglist[i]) for i in range(len(argnames))} cl_kernel = self.compile(queue.context, **kwarg_types) kernel_args = self._unpack(argnames, arglist, kwarg_types) event = self.run_kernel(cl_kernel, queue, kernel_args, kwargs) #FIXME: I don't like that this breaks encapsulation if isinstance(event, EventRecord): event.set_kernel_args(kernel_args) if isinstance(queue_or_context, cl.Context): queue.finish() return event