code: def __call__(self, *args_dev, **kwargs):
      args_hst = [
          _unwrap(arg).cpu() if hasattr(arg, "data_ptr") else arg
          for arg in args_dev
      ]
      # removes reserved keywords from kwargs
      kwargs = {
          k: v for k, v in kwargs.items() if k not in RESERVED_KWS
      }
      # remaps core language functions to interpreted ones
      self._patch_lang(builder)
      # we need to copy arguments to the host for the interpreter
      # implicitly convert tensor arguments to their base pointers
      args = inspect.getcallargs(self.fn, *args_hst, **kwargs)
      args = {
          name: arg if name in self.constexprs else _implicit_cvt(arg)
          for name, arg in args.items()
      }
      # iterate through grid
      grid = self.grid(args) if callable(self.grid) else self.grid
      assert len(grid) <= 3
      grid = grid + (1,) * (3 - len(grid))
      builder.set_grid_dim(*grid)
      for x in range(grid[0]):
          for y in range(grid[1]):
              for z in range(grid[2]):
                  builder.set_grid_idx(x, y, z)
                  self.fn(**args)
      # copy arguments back to propagate side-effects
      for arg_dev, arg_hst in zip(args_dev, args_hst):
          if hasattr(arg_dev, "data_ptr"):
              _unwrap(arg_dev).copy_(arg_hst.to(arg_dev.device))
  
imports: import inspect
  import numpy
  import triton
  import triton.language
  from .._C.libtriton import interpreter
label_desc: Use image node_id 3 for calling the GridExecutor obj's underlying member method code with example usage: obj.__call__() without return types