code: def run_kernel(self, func, gpu_args, threads, grid):
          
          func(*gpu_args, block=threads, grid=grid, texrefs=self.texrefs)
docs: runs the CUDA kernel passed as 'func'
  
          :param func: A PyCuda kernel compiled for this specific kernel configuration
          :type func: pycuda.driver.Function
  
          :param gpu_args: A list of arguments to the kernel, order should match the
              order in the code. Allowed values are either variables in global memory
              or single values passed by value.
          :type gpu_args: list( pycuda.driver.DeviceAllocation, numpy.int32, ...)
  
          :param threads: A tuple listing the number of threads in each dimension of
              the thread block
          :type threads: tuple(int, int, int)
  
          :param grid: A tuple listing the number of thread blocks in each dimension
              of the grid
          :type grid: tuple(int, int)