code: def read_to_gpu_single(fd, sz, gpubuf):
      os.lseek(fd, 0, os.SEEK_SET)
      with Timing("total: ", lambda x: f", {sz/x:.2f} GB/s"):
          with Timing(
              "gpu host alloc: ", lambda x: f", {sz/x:.2f} GB/s"
          ):
              hst = dev.allocator._hostalloc(sz)
          with Timing(
              "read to host:   ", lambda x: f", {sz/x:.2f} GB/s"
          ):
              ret = libc.read(fd, hst, sz)
          with Timing(
              "gpu host copy:  ", lambda x: f", {sz/x:.2f} GB/s"
          ):
              dev.allocator._copyin_async(gpubuf, hst, sz)
              dev.synchronize()
  
file_path: tinygrad/extra/disk_read_speed.py
imports: import os, ctypes, ctypes.util, io, mmap
  from tinygrad import Tensor, dtypes, Device
  from tinygrad.helpers import Timing, from_mv
  from tinygrad.runtime.ops_hip import HIPDevice
label_desc: Use image node_id 4 for calling a global function with example usage: read_to_gpu_single(fd, sz, gpubuf) without return types