Initialization

* MPI_Win_create(base, size, disp_unit, info, comm, win)

  * collectively creates a MPI Window from a set of local windows (zero or one
    window for each process) residing within the set of processes defined by
    the specified communicator
  
  * base, size - defines the region of memory which represents the local window
    for the calling process

    * if locks are to be used, the implementation may require that this region
      of memory be allocated with MPI_Alloc_mem()
  
  * disp_unit - multiplier for displacements specified in the communication
    routines
  
  * info - hints to the runtime about the expected usage pattern(s) of the
    window
  
    * no_locks - states that MPI_Win_lock() and MPI_Win_unlock() will not be
      used with this window
  
  * comm - communicator which represent the group of processes participating in
    the window


* MPI_Win_free(win)

  * frees resources use by the window

----------

Communication operations (requests)

* all communication operations are non-blocking

* MPI_Put(origin_addr, origin_count, origin_datatype,
          target_rank, target_disp, target_count, target_datatype, win)

  * target buffer must not overlap with other communcation operations during
    the same exposure epoch

* MPI_Get(origin_addr, origin_count, origin_datatype,
          target_rank, target_disp, target_count, target_datatype, win)

  * target buffer must not overlap with other communcation operations during
    the same exposure epoch

* MPI_Accumulate(origin_addr, origin_count, origin_datatype,
                 target_rank, target_disp, target_count, target_datatype,
		 op, win)

  * target buffer may overlap with other MPI_Accumulate() operations during the
    same exposure epoch, but not with MPI_Put() or MPI_Get() operations

  * operations with overlapping target buffers submitted in the same exposure
    epoch must atomically update the data elements within the overlapping
    region

----------

Synchronization

* the synchronization operations define epochs

  * exposure epoch - during an exposure epoch, a process' local window is made
    accessible to one more other processes in the window group

  * access epoch - during an access epoch, a process is able to submit
    communication requests causing operation to be performed with respect to
    one or more local windows (residing within processes that are part of the
    window group).  these local window must already be exposed (either
    explicitly/actively or implicitly/passively) by an exposure epoch.

* Active target synchronization

  * Fence

    MPI_Win_fence(assert, win)

    * causes all processes to open exposure and access epochs for all local
      windows

  * General

    * Access epoch

      MPI_Win_start(group, assert, win)
      MPI_Win_complete(win)

    * Exposure epoch

      MPI_Win_Post(group, assert, win)
      MPI_Win_wait(win)
      MPI_Win_test(win)

* Passive target synchronization

  MPI_Win_lock(lock_type, rank, assert, win)
  MPI_Win_unlock(rank, win)

  * lock_type

    MPI_LOCK_EXCLUSIVE
    MPI_LOCK_SHARED
