示例#1
0
    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)
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
 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