code: def gather_cuda(
      self,
      rank,
      world_size,
      comm,
      cupy_sign_list_packed,
      cupy_recvbuf_sign,
      cupy_worker_scale,
      cupy_recvbuf_scale,
  ):
      # We do in-place operations on cupy buffers so we do not return any buffers
      requests = []
      for idx in range(world_size):
          req_sign = self.my_igather(
              rank,
              world_size,
              comm,
              cupy_sign_list_packed[idx],
              cupy_recvbuf_sign,
              root=idx,
          )
          requests += req_sign
  
      for idx in range(world_size):
          req_scale = self.my_igather(
              rank,
              world_size,
              comm,
              cupy_worker_scale,
              cupy_recvbuf_scale,
              root=idx,
          )
          requests += req_scale
  
      MPI.Request.Waitall(requests)
  
file_path: DeepSpeed/deepspeed/runtime/comm/mpi.py
imports: import torch
  import cupy
  import time
  import numpy
  from mpi4py import MPI
  from deepspeed.runtime.compression.cupy import CupyBackend
label_desc: Use image node_id 3 for calling the MpiBackend obj's underlying member method code with example usage: obj.gather_cuda(rank, world_size, comm, cupy_sign_list_packed, cupy_recvbuf_sign, cupy_worker_scale, cupy_recvbuf_scale) without return types