class_docstr: MpiCommunicatorBase
  
  Implementation of communicator interface defined by
  :class:`CommunicatorBase`. This communicator assumes MPI4py and
  all ChainerMN processes are invoked by ``mpirun`` (``mpiexec``)
  command. Although this lacks several important methods such as
  ``multi_node_mean_grad`` to be impelmented with speficic algorithm. See
  hierarchical communicator or pure_nccl communicator for example.
docstr: A primitive for inter-process transmitter.
  
  This method sends numpy-array to target process.
  The target process is expected to invoke ``recv()``.
  This method relies on mpi4py fast communication optimized for
  numpy arrays, which discards any information attached to
  chainer.Variable objects. Please be sure.
  
  Args:
      data: data to be sent (tuple, list or raw numpy/cupy array)
      dest (int): Target process specifier.
      tag (int): Message ID (MPI feature).
docstr_tok: ["A","primitive","for","inter-process","transmitter",".","This","method","sends","numpy-array","to","target","process",".","The","target","process","is","expected","to","invoke","``","recv","(",")","``",".","This","method","relies","on","mpi4py","fast","communication","optimized","for","numpy","arrays",",","which","discards","any","information","attached","to","chainer.Variable","objects",".","Please","be","sure",".","Args",":","data",":","data","to","be","sent","(","tuple",",","list","or","raw","numpy\/cupy","array",")","dest","(","int",")",":","Target","process","specifier",".","tag","(","int",")",":","Message","ID","(","MPI","feature",")","."]
code: def send(self, data, dest, tag):
      """A primitive for inter-process transmitter.
  
      This method sends numpy-array to target process.
      The target process is expected to invoke ``recv()``.
      This method relies on mpi4py fast communication optimized for
      numpy arrays, which discards any information attached to
      chainer.Variable objects. Please be sure.
  
      Args:
          data: data to be sent (tuple, list or raw numpy/cupy array)
          dest (int): Target process specifier.
          tag (int): Message ID (MPI feature).
  
      """
      chainer.utils.experimental(
          "chainermn.communicators.MpiCommunicatorBase.send"
      )
  
      msgtype = _MessageType(data)
      _check_dtype("send", msgtype)
  
      """We use ssend() instead of send() to pass unittests.
          If we don't use it, an error occurs in
          test_point_to_point_communication.py
          when using MVAPICH2-2.2 and GPUs.
          """
      self.mpi_comm.ssend(msgtype, dest=dest, tag=tag)
  
      # Type check.
      if not msgtype.is_tuple:
          data = [data]
  
      for array in data:
          if numpy.float16 == array.dtype:
              array = array.astype(numpy.float32)
  
          if chainer.backend.get_array_module(array) is not numpy:
              chainer.cuda.Stream.null.synchronize()
              array = (
                  _memory_utility.get_device_memory_pointer(array),
                  _get_mpi_type(msgtype),
              )
  
          else:
              array = numpy.ascontiguousarray(array)
  
          """We use Ssend() for the same reason as using ssend()."""
          self.mpi_comm.Ssend(array, dest=dest, tag=tag)
  
imports: import mpi4py
  import numpy
  import chainer
  import chainer.backends
  import chainer.utils
  from chainer.utils import collections_abc
  from chainermn.communicators import _communication_utility
  from chainermn.communicators._communication_utility import chunked_bcast_obj
  from chainermn.communicators import _memory_utility
  from chainermn.communicators import communicator_base
  import chainerx
label_desc: Use image node_id 12 for calling the MpiCommunicatorBase obj's underlying member method code with example usage: obj.send(data, dest, tag) without return types