code: def broadcast(cls, comm, in_out_array, root=0, stream=None):
      arrays = cls._get_internal_arrays(in_out_array)
      if comm.rank == root:
          shape_and_sizes = cls._get_shape_and_sizes(
              arrays, in_out_array.shape
          )
      else:
          shape_and_sizes = ()
  
      shape_and_sizes = cls._exchange_shape_and_sizes(
          comm, root, shape_and_sizes, "bcast", stream
      )
      shape = tuple(shape_and_sizes[0:2])
      sizes = shape_and_sizes[2:]
      # Naive approach, we send each of the subarrays one by one
      if comm.rank != root:
          arrays = [
              cupy.empty(s, dtype=a.dtype)
              for s, a in zip(sizes, arrays)
          ]
      # TODO(ecastill): measure if its faster to just contatenate
      # the arrays in a single one and send it
      nccl.groupStart()
      for a in arrays:
          _DenseNCCLCommunicator.broadcast(comm, a, root, stream)
      nccl.groupEnd()
      cls._assign_arrays(in_out_array, arrays, shape)
  
imports: import numpy
  import warnings
  import cupy
  from cupy.cuda import nccl
  from cupyx.distributed import _store
  from cupyx.distributed._comm import _Backend
  from cupyx.scipy import sparse
label_desc: Use image node_id 7 for calling the _SparseNCCLCommunicator obj's underlying member method code with example usage: obj.broadcast(cls, comm, in_out_array, root, stream) without return types