code: def __call__(
      self,
      *args,
      global_size: Tuple[int, int, int],
      local_size: Tuple[int, int, int],
      vals: Tuple[int, ...] = (),
      wait=False,
  ):
      if MOCKHIP:
          return float("inf")
      check(hip.hipSetDevice(self.device))
      return hip_time_execution(
          lambda: check(
              hip.hipModuleLaunchKernel(
                  self.prg,
                  *global_size,
                  *local_size,
                  0,
                  None,
                  None,
                  encode_args_cuda_style(
                      args, vals, hip.hipDeviceptr_t, marks=(1, 2, 3)
                  )[0],
              )
          ),
          enable=wait,
      )
  
imports: from __future__ import annotations
  import ctypes, functools, subprocess, io
  from typing import Tuple, TypeVar, List
  import gpuctypes.hip
  from tinygrad.helpers import DEBUG, getenv, init_c_var, compile_cuda_style, encode_args_cuda_style, time_execution_cuda_style
  from tinygrad.helpers import from_mv, round_up, to_mv
  from tinygrad.device import Compiled, LRUAllocator, MallocAllocator
  from tinygrad.renderer.cstyle import HIPRenderer
  from tinygrad.codegen.kernel import LinearizerOptions
label_desc: Use image node_id 3 for calling the HIPProgram obj's underlying member method code with example usage: obj.__call__() and returns: hip_time_execution, float