class_docstr: Interface definition of all communicators.
  
  All communicators that have compatible set of methods with this
  class is supposed to work in ChainerMN's parallel computation
  implementation. The methods are named after MPI functions, such
  as ``bcast()`` came from ``MPI_Bcast()``.
  
  There are two types of methods: one that treats Python objects
  have ``_obj`` suffix.  The other has methods without any suffix
  and it handles ndarray and arrays filled with scaler values.  So
  the number of methods would be ::
  
      [send, recv, bcast, gather, allreduce] * [ '_obj', '']
  
  
  (with single exception ``alltoall``, ``multi_node_mean_grad``, ``split``
  and ``bcast_data`` so far). Also methods are supposed to be
  written in this order. All those methods must be implemented in
  its implementation class, or otherwise it cannot be instantiated
  in runtime.
  
  .. note:: As most implementation of ``_obj``-sufficed methods
    involves Python object pickling and unpickling, there is an
    implicit size limit.
  
  TODO(kuenishi): as of now no implementation class actually has
  ``allreduce`` method.
docstr: A function anologous to ``MPI_Comm_Split`` .
  
  This method splits the inter MPI commnicator and return a wrapped
  ChainerMN communicator.
  
  Args:
      color (int):
          Index of new group. The process with the same color will be
          assigned to the same group.
      key (int):
          Control of rank assignment. The process will be assigned
          a rank in the new group ordered by the value of key.
          If you do not care of the rank, you can just simply specify
          the original rank.
  
  Returns:
      CommunicatorBase
docstr_tok: ["A","function","anologous","to","``","MPI_Comm_Split","``",".","This","method","splits","the","inter","MPI","commnicator","and","return","a","wrapped","ChainerMN","communicator",".","Args",":","color","(","int",")",":","Index","of","new","group",".","The","process","with","the","same","color","will","be","assigned","to","the","same","group",".","key","(","int",")",":","Control","of","rank","assignment",".","The","process","will","be","assigned","a","rank","in","the","new","group","ordered","by","the","value","of","key",".","If","you","do","not","care","of","the","rank",",","you","can","just","simply","specify","the","original","rank",".","Returns",":","CommunicatorBase"]
code: def split(self, color, key):
      """A function anologous to ``MPI_Comm_Split`` .
  
      This method splits the inter MPI commnicator and return a wrapped
      ChainerMN communicator.
  
      Args:
          color (int):
              Index of new group. The process with the same color will be
              assigned to the same group.
          key (int):
              Control of rank assignment. The process will be assigned
              a rank in the new group ordered by the value of key.
              If you do not care of the rank, you can just simply specify
              the original rank.
  
      Returns:
          CommunicatorBase
  
      """
      raise NotImplementedError()
  
imports: from abc import ABCMeta
  from abc import abstractmethod
  import contextlib
  import six
  import warnings
label_desc: Use image node_id 10 for calling the CommunicatorBase obj's underlying member method code with example usage: obj.split(color, key) without return types