code: def broadcast(data, root):
      
      rank = get_rank()
      length = ctypes.c_ulong()
      if root == rank:
          assert data is not None, 'need to pass in data when broadcasting'
          s = pickle.dumps(data, protocol=pickle.HIGHEST_PROTOCOL)
          length.value = len(s)
      # run first broadcast
      _LIB.RabitBroadcast(ctypes.byref(length),
                          ctypes.sizeof(ctypes.c_ulong), root)
      if root != rank:
          dptr = (ctypes.c_char * length.value)()
          # run second
          _LIB.RabitBroadcast(ctypes.cast(dptr, ctypes.c_void_p),
                              length.value, root)
          data = pickle.loads(dptr.raw)
          del dptr
      else:
          _LIB.RabitBroadcast(ctypes.cast(ctypes.c_char_p(s), ctypes.c_void_p),
                              length.value, root)
          del s
      return data
docs: Broadcast object from one node to all other nodes.
  
      Parameters
      ----------
      data : any type that can be pickled
          Input data, if current rank does not equal root, this can be None
      root : int
          Rank of the node to broadcast data from.
  
      Returns
      -------
      object : int
          the result of broadcast.