code: def __alltoall_cpu(
      rank, world_size, output_tensor_list, input_tensor_list
  ):
      """
      Each process scatters list of input tensors to all processes in a cluster
      and return gathered list of tensors in output list. The tensors should have the same shape.
  
      Parameters
      ----------
      rank : int
          The rank of current worker
      world_size : int
          The size of the entire
      output_tensor_list : List of tensor
          The received tensors
      input_tensor_list : List of tensor
          The tensors to exchange
      """
      input_tensor_list = [
          tensor.to(torch.device("cpu")) for tensor in input_tensor_list
      ]
      # TODO(#5002): As Boolean data is not supported in
      # ``torch.distributed.scatter()``, we convert boolean into uint8 before
      # scatter and convert it back afterwards.
      dtypes = [t.dtype for t in input_tensor_list]
      for i, dtype in enumerate(dtypes):
          if dtype == torch.bool:
              input_tensor_list[i] = input_tensor_list[i].to(torch.int8)
              output_tensor_list[i] = output_tensor_list[i].to(
                  torch.int8
              )
      for i in range(world_size):
          dist.scatter(
              output_tensor_list[i],
              input_tensor_list if i == rank else [],
              src=i,
          )
      # Convert back to original dtype
      for i, dtype in enumerate(dtypes):
          if dtype == torch.bool:
              input_tensor_list[i] = input_tensor_list[i].to(dtype)
              output_tensor_list[i] = output_tensor_list[i].to(dtype)
  
imports: import numpy
  import torch
  import torch.distributed
label_desc: Use image node_id 2 for calling a global function with example usage: __alltoall_cpu(rank, world_size, output_tensor_list, input_tensor_list) without return types