* Datatypes

  * Caching

    [traff00:mpi-impl] and [booth00:mpi-impl] discuss the need for
    datatype caching by the target process when the target process
    must be involved in the RMA operations (i.e., when the data cannot
    be directly read and interpreted by the origin process)

    Datatype caching can be either proactive or reactive.

    In the proactive case, the origin process would track whether the
    target process has a copy of the datatype and send the datatype to
    target process when necessary.  This means that each datatype must
    contain tracking information.  Unfortunately, because of dynamic
    processes in MPI-2, something more complex than a simple bit
    vector must be used to track processes already caching a datatype.
    What is the correct, high-performance structure?

    Alternatively, a reactive approach could be used.  In the reactive
    approach, the origin process would assume that the target process
    already knows about the datatype.  If that assumption is false,
    the target process will request the datatype from the origin
    process.  This simplifies the tracking on the origin, but does not
    completely eliminate it.  It is necessary for the origin to
    increase the reference count associated with the datatype until
    the next synchronization point to ensure that the datatype is not
    deleted before the target process has had sufficient opportunity
    to request a copy of the datatype.

    David, Rob, Nick and Brian vote for reactive caching.

* RMA and multi-method access

  [booth00:mpi-impl] discusses a multi-method RMA implementation,
  allowing RMA operations between a pair of processes to use the
  optimal access method

* Flow control

  Q: Do we need to implement flow control within the window subsystem
  or is this handled for us by the RHC and message passing subsystems?

* Epochs

  Q: How do the three synchronization mechanisms play together?  What
  is required in order to switch from one mechanism to another?  The
  standard talks about this briefly, but I am still somewhat confused
  about what happens when a transistions occurs from active (fence)
  synchronization to scalable or passive synchronization.  It seems as
  though active synchronization always has open access and exposure
  epochs unless the assertion MPI_MODE_NOSUCCEED is specified.
  However, no assertions are required for correct operation, so it
  would appear that one can open a new access/exposure epoch while one
  is already active.

  * External synchronization are required to separate different synchronization
    mechanisms

* Overlapping Windows

  Q: Do overlapping windows affect the implementation?  It does not
  appear affect implementations that do not use separate local and
  public buffers, but I haven't completely convinced myself that this
  is true.

* Need for mutex

  can't implement fetch-and-increment without it using the current MPI RMA API

* Progress for passive target

  - threads

  - alarm signal

  - poll during MPI routines only (not so good)

------------------------------------------------------------------------

Optimizations

* merge synchronization with RMA ops when sending messages
