Blame doc/notes/mpi.txt

Packit Service c5cf8c
MPI
Packit Service c5cf8c
- spawn/attach
Packit Service c5cf8c
- communicators
Packit Service c5cf8c
- pt2pt requests
Packit Service c5cf8c
- collective
Packit Service c5cf8c
- RMA
Packit Service c5cf8c
- error (handling, FT, reporting)
Packit Service c5cf8c
Packit Service c5cf8c
MPID
Packit Service c5cf8c
- messages
Packit Service c5cf8c
  - tradition MPI message
Packit Service c5cf8c
  - one-sided operations
Packit Service c5cf8c
  - control?
Packit Service c5cf8c
Packit Service c5cf8c
- streams
Packit Service c5cf8c
- process management (via BNR)
Packit Service c5cf8c
Packit Service c5cf8c
Communication Methods
Packit Service c5cf8c
- TCP
Packit Service c5cf8c
- VIA
Packit Service c5cf8c
- Shared Memory
Packit Service c5cf8c
- Loopback
Packit Service c5cf8c
- IMPI
Packit Service c5cf8c
Packit Service c5cf8c
===============================================================================
Packit Service c5cf8c
Packit Service c5cf8c
MPI layer
Packit Service c5cf8c
Packit Service c5cf8c
--------------------
Packit Service c5cf8c
Packit Service c5cf8c
Operations
Packit Service c5cf8c
Packit Service c5cf8c
- point-to-point
Packit Service c5cf8c
  - requests
Packit Service c5cf8c
  - datatypes
Packit Service c5cf8c
  - communicators
Packit Service c5cf8c
  - status
Packit Service c5cf8c
  - errors
Packit Service c5cf8c
Packit Service c5cf8c
- collective
Packit Service c5cf8c
  - datatypes
Packit Service c5cf8c
  - communicators
Packit Service c5cf8c
  - errors
Packit Service c5cf8c
Packit Service c5cf8c
- process management
Packit Service c5cf8c
  - communicators
Packit Service c5cf8c
  - info
Packit Service c5cf8c
  - errors
Packit Service c5cf8c
Packit Service c5cf8c
- RMA
Packit Service c5cf8c
  - datatypes
Packit Service c5cf8c
  - windows
Packit Service c5cf8c
  - communicators
Packit Service c5cf8c
  - groups
Packit Service c5cf8c
  - epoch
Packit Service c5cf8c
  - errors
Packit Service c5cf8c
Packit Service c5cf8c
- I/O
Packit Service c5cf8c
  - depends on
Packit Service c5cf8c
    - files
Packit Service c5cf8c
    - datatypes
Packit Service c5cf8c
    - requests
Packit Service c5cf8c
    - info
Packit Service c5cf8c
    - status
Packit Service c5cf8c
    - errors
Packit Service c5cf8c
  * implemented via ROMIO
Packit Service c5cf8c
    - dependent only on MPI functions
Packit Service c5cf8c
    - future enhancements may use low-level interfaces
Packit Service c5cf8c
Packit Service c5cf8c
- topology
Packit Service c5cf8c
  - communicators
Packit Service c5cf8c
  - errors
Packit Service c5cf8c
  * can be implemented entirely at the MPI layer
Packit Service c5cf8c
Packit Service c5cf8c
- generalized requests
Packit Service c5cf8c
  - errors
Packit Service c5cf8c
  * can be implemented entirely at the MPI layer
Packit Service c5cf8c
Packit Service c5cf8c
--------------------
Packit Service c5cf8c
Packit Service c5cf8c
Structures
Packit Service c5cf8c
Packit Service c5cf8c
- requests
Packit Service c5cf8c
- datatypes
Packit Service c5cf8c
- communicators
Packit Service c5cf8c
  - groups
Packit Service c5cf8c
- groups
Packit Service c5cf8c
  * are groups modified or augmented by low layers?
Packit Service c5cf8c
- windows
Packit Service c5cf8c
- files
Packit Service c5cf8c
  * defined and implemented via ROMIO
Packit Service c5cf8c
    - future enhancements may require access lower layers
Packit Service c5cf8c
- status
Packit Service c5cf8c
- errors
Packit Service c5cf8c
- attributes
Packit Service c5cf8c
  * can be defined and operations implemented entirely at the MPI layer
Packit Service c5cf8c
  - communicator
Packit Service c5cf8c
  - datatypes
Packit Service c5cf8c
  - windows
Packit Service c5cf8c
Packit Service c5cf8c
- info
Packit Service c5cf8c
  * can be defined and operations implemented entirely at the MPI layer
Packit Service c5cf8c
Packit Service c5cf8c
===============================================================================
Packit Service c5cf8c
Packit Service c5cf8c
MPID
Packit Service c5cf8c
Packit Service c5cf8c
--------------------
Packit Service c5cf8c
Packit Service c5cf8c
Operations
Packit Service c5cf8c
Packit Service c5cf8c
- point-to-point
Packit Service c5cf8c
Packit Service c5cf8c
- collective operations
Packit Service c5cf8c
Packit Service c5cf8c
- process management
Packit Service c5cf8c
Packit Service c5cf8c
- RMA
Packit Service c5cf8c
Packit Service c5cf8c
- generalized requests
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
Structures
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
--------------------
Packit Service c5cf8c
Packit Service c5cf8c
Concepts
Packit Service c5cf8c
Packit Service c5cf8c
- MPI buffer movement (moving buffers defined by an address, count and
Packit Service c5cf8c
  datatype)
Packit Service c5cf8c
Packit Service c5cf8c
- internal buffer management
Packit Service c5cf8c
Packit Service c5cf8c
- Connection management
Packit Service c5cf8c
Packit Service c5cf8c
  - virtual connection structures
Packit Service c5cf8c
Packit Service c5cf8c
  - low-level connnection management (sockets, etc.) should be handled
Packit Service c5cf8c
    entirely by the device and probably driven by a state machine
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
===============================================================================
Packit Service c5cf8c
Packit Service c5cf8c
Multi-method design
Packit Service c5cf8c
Packit Service c5cf8c
--------------------
Packit Service c5cf8c
Packit Service c5cf8c
Device-level objects
Packit Service c5cf8c
Packit Service c5cf8c
- group
Packit Service c5cf8c
Packit Service c5cf8c
  - data structures
Packit Service c5cf8c
Packit Service c5cf8c
  - methods
Packit Service c5cf8c
Packit Service c5cf8c
    - set_connection(group, rank, vc_ptr) - associate pointer to virtual
Packit Service c5cf8c
      connection structure with a (group,rank)
Packit Service c5cf8c
  
Packit Service c5cf8c
    - get_connection(group, rank) - returns pointer to virtual connection
Packit Service c5cf8c
      structure associated with (group,rank)
Packit Service c5cf8c
Packit Service c5cf8c
- communicators
Packit Service c5cf8c
Packit Service c5cf8c
  - data structures
Packit Service c5cf8c
Packit Service c5cf8c
    - group
Packit Service c5cf8c
Packit Service c5cf8c
  - methods
Packit Service c5cf8c
Packit Service c5cf8c
    - set_connection(dcomm, rank, vc_ptr) - associate pointer to virtual
Packit Service c5cf8c
      connection structure with a (dcomm,rank)
Packit Service c5cf8c
  
Packit Service c5cf8c
    - get_connection(dcomm, rank) - returns pointer to virtual connection
Packit Service c5cf8c
      structure associated with (dcomm,rank)
Packit Service c5cf8c
Packit Service c5cf8c
- virtual connections
Packit Service c5cf8c
Packit Service c5cf8c
  - alloc() - returns a pointer to a virtual connection structure
Packit Service c5cf8c
Packit Service c5cf8c
  - add_ref(vc) - increments the reference count (atomically)
Packit Service c5cf8c
Packit Service c5cf8c
  - release() - decrements the reference count; if the reference count reaches
Packit Service c5cf8c
    zero, the structure is freed
Packit Service c5cf8c
Packit Service c5cf8c
  NOTE: It may be useful to be able to locate a virtual connection based on a
Packit Service c5cf8c
  process group ID and rank, in part so we can detect when multiple virtual
Packit Service c5cf8c
  connections might be formed between a pair of processes.
Packit Service c5cf8c
Packit Service c5cf8c
  
Packit Service c5cf8c
Packit Service c5cf8c
can connect/accept be called multiple times between a set of processes?
Packit Service c5cf8c
Packit Service c5cf8c
--------------------
Packit Service c5cf8c
Packit Service c5cf8c
Method-level functions
Packit Service c5cf8c
Packit Service c5cf8c
Method descriptors are strings that are used to describe the capabilities of
Packit Service c5cf8c
the methods.  These descriptors can then be used to determine if two processes
Packit Service c5cf8c
miight be capable of "talking" using the method in question.  We say "might be
Packit Service c5cf8c
capable" because in the case of a method like VIA, it may be impossible provide
Packit Service c5cf8c
enough information in the descriptor to determine in two processes can talk.
Packit Service c5cf8c
It may be necessary to simply attempt to form the connection.  This implies
Packit Service c5cf8c
that binding to a particular protocol may need to be deferred until we are
Packit Service c5cf8c
ready to form a real connection.  However, some methods, such as shared memory,
Packit Service c5cf8c
can provide enough information and thus can be bound immediately.
Packit Service c5cf8c
Packit Service c5cf8c
- query/get_descriptor()
Packit Service c5cf8c
Packit Service c5cf8c
- match_descriptors()
Packit Service c5cf8c
Packit Service c5cf8c
===============================================================================
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
MPI_Init()
Packit Service c5cf8c
Packit Service c5cf8c
- create basic datatypes
Packit Service c5cf8c
Packit Service c5cf8c
  MPIR_Datatype_init()
Packit Service c5cf8c
  {
Packit Service c5cf8c
      foreach dt (all basic datatypes)
Packit Service c5cf8c
      {
Packit Service c5cf8c
          MPID_Datatype_init(dt, ...)
Packit Service c5cf8c
      }
Packit Service c5cf8c
  }
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
- initialize device
Packit Service c5cf8c
Packit Service c5cf8c
  - BNR initialization
Packit Service c5cf8c
  
Packit Service c5cf8c
    BNR_Init()
Packit Service c5cf8c
    BNR_Get_group(&my_bnr_group)
Packit Service c5cf8c
    BNR_Get_size(my_bnr_group, &size)
Packit Service c5cf8c
    BNR_Get_rank(my_bnr_group, &rank)
Packit Service c5cf8c
    BNR_Get_parent(&parent_bnr_group)
Packit Service c5cf8c
    BNR_Merge(my_bnr_group, parent_bnr_group, &inter_bnr_group)
Packit Service c5cf8c
  
Packit Service c5cf8c
  - loop through methods
Packit Service c5cf8c
Packit Service c5cf8c
    - initialize method
Packit Service c5cf8c
  
Packit Service c5cf8c
    - query for descriptor of method's capabilities
Packit Service c5cf8c
  
Packit Service c5cf8c
    Q: what about dymanicly loaded methods?  do they have to be initialized now
Packit Service c5cf8c
    or can they be added later?
Packit Service c5cf8c
  
Packit Service c5cf8c
  - publish capabilities of all known methods
Packit Service c5cf8c
Packit Service c5cf8c
  - initialize AQ, buffer management, etc.
Packit Service c5cf8c
Packit Service c5cf8c
- establish MPI_COMM_WORLD
Packit Service c5cf8c
Packit Service c5cf8c
  - create MPI_GROUP_WORLD (internal) from BNR my_group, etc.
Packit Service c5cf8c
Packit Service c5cf8c
    stores BNR info in group structure
Packit Service c5cf8c
    allocates virtual connection structures
Packit Service c5cf8c
    initializes virtual connections to stubs
Packit Service c5cf8c
Packit Service c5cf8c
  - create MPI_COMM_WORLD from MPI_GROUP_WORLD
Packit Service c5cf8c
Packit Service c5cf8c
- establish inter-communicator with parent (if parent exists)
Packit Service c5cf8c
  
Packit Service c5cf8c
  - create inter_group from inter_bnr_group
Packit Service c5cf8c
  
Packit Service c5cf8c
  - create inter-communicator from inter_group
Packit Service c5cf8c
  
Packit Service c5cf8c
- create inter_group from inter_bnr_gorup
Packit Service c5cf8c
Packit Service c5cf8c
- create inter-communicator from inter_group
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
MPI_Spawn()
Packit Service c5cf8c
{
Packit Service c5cf8c
    BNR_Open_group(my_bnr_group, &new_bnr_group)
Packit Service c5cf8c
    BNR_Spawn(remote_bnr_group, N, ..., func)
Packit Service c5cf8c
    BNR_Close(remote_bnr_group)
Packit Service c5cf8c
    BNR_Merge(my_bnr_group, remote_bnr_group, &inter_bnr_group);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
need a BNR_Group_ID which is globally unique in order to implement MPI_Connect/Attach
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
------------------------------------------------------------------------
Packit Service c5cf8c
Packit Service c5cf8c
Structures that cross layers
Packit Service c5cf8c
Packit Service c5cf8c
- many of the information structures that are passed through the layers contain
Packit Service c5cf8c
  data sections from multiple layers
Packit Service c5cf8c
Packit Service c5cf8c
- ne option is to include device (and method) include files in the MPICH layer
Packit Service c5cf8c
  include file.  Rob and Brian feel this would be bad.
Packit Service c5cf8c
Packit Service c5cf8c
- David suggests that the structure definitions be supplied by the device
Packit Service c5cf8c
  header files and that method specific information be included in those
Packit Service c5cf8c
  definition using unions.  Rob and Brian feel this is ugly (from a software
Packit Service c5cf8c
  engineering standpoint).
Packit Service c5cf8c
Packit Service c5cf8c
- Rob and Brian suggest having each layer define their own portion of the
Packit Service c5cf8c
  structure.  The definitions of the higher layers are known to the lower
Packit Service c5cf8c
  layers, but not vice versa.  To increase cache locality and reduce memory
Packit Service c5cf8c
  allocation, the device (and methods) report the amount of space they need in
Packit Service c5cf8c
  these structures so that the highest layer can allocate sufficient space.
Packit Service c5cf8c
  pointer arithmatic, etc.
Packit Service c5cf8c
Packit Service c5cf8c
Virtual connection
Packit Service c5cf8c
Packit Service c5cf8c
- used by MM implementation to allow late binding to a method
Packit Service c5cf8c
Packit Service c5cf8c
  this implies that the VC contains a pointer to either the function pointer
Packit Service c5cf8c
  table for the method to which it is bound or the function pointer to table to
Packit Service c5cf8c
  a set of functions that perform the binding to such a method
Packit Service c5cf8c
Packit Service c5cf8c
- one-to-one correspondence between a virtual connection and a real connection
Packit Service c5cf8c
Packit Service c5cf8c
- Contains
Packit Service c5cf8c
  - state of binding
Packit Service c5cf8c
  - method specific information
Packit Service c5cf8c
  - function pointer table?
Packit Service c5cf8c
Packit Service c5cf8c
----------
Packit Service c5cf8c
Packit Service c5cf8c
Communicators
Packit Service c5cf8c
- Contains
Packit Service c5cf8c
  - communication group
Packit Service c5cf8c
  - local group (inter-communicator only)
Packit Service c5cf8c
  - send and receive context IDs - same for intra-communicator
Packit Service c5cf8c
  - attributes
Packit Service c5cf8c
  - reference count
Packit Service c5cf8c
  - error handlers
Packit Service c5cf8c
  - device specific information (needed for MPICH-G2)
Packit Service c5cf8c
  
Packit Service c5cf8c
----------
Packit Service c5cf8c
Packit Service c5cf8c
Groups
Packit Service c5cf8c
- Contains
Packit Service c5cf8c
  - virtual connection table
Packit Service c5cf8c
  - my rank
Packit Service c5cf8c
  - reference count
Packit Service c5cf8c
  - device specific information (???)
Packit Service c5cf8c
Packit Service c5cf8c
----------
Packit Service c5cf8c
Packit Service c5cf8c
Requests
Packit Service c5cf8c
- probably allocated and partially initialized above ADI
Packit Service c5cf8c
- initialization complete by device/method
Packit Service c5cf8c
Packit Service c5cf8c
- Request contains
Packit Service c5cf8c
  - Immutable after initialization
Packit Service c5cf8c
    - type of request
Packit Service c5cf8c
      - persistent request flag
Packit Service c5cf8c
      - send, bsend, rsend, ssend, recv, generalized
Packit Service c5cf8c
    - buffer
Packit Service c5cf8c
    - count
Packit Service c5cf8c
    - datatype
Packit Service c5cf8c
    - rank (src or dest depending on type of request)
Packit Service c5cf8c
    - tag
Packit Service c5cf8c
    - comm
Packit Service c5cf8c
----------
Packit Service c5cf8c
Packit Service c5cf8c
Connection resolution
Packit Service c5cf8c
Packit Service c5cf8c
- needs to talk to with BNR
Packit Service c5cf8c
Packit Service c5cf8c
----------
Packit Service c5cf8c
Packit Service c5cf8c
Communication agent