% -*- latex -*-
%
% Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
%                         University Research and Technology
%                         Corporation.  All rights reserved.
% Copyright (c) 2004-2005 The University of Tennessee and The University
%                         of Tennessee Research Foundation.  All rights
%                         reserved.
% Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 
%                         University of Stuttgart.  All rights reserved.
% Copyright (c) 2004-2005 The Regents of the University of California.
%                         All rights reserved.
% $COPYRIGHT$
% 
% Additional copyrights may follow
% 
% $HEADER$
%

\chapter{Open MPI Components}
\label{sec:mca-ompi}

{\Huge JMS Needs massive overhaul}

There are multiple types of MPI components:

\begin{enumerate}
\item \mcafw{rpi}: MPI point-to-point communication, also known as the
  Open MPI Request Progression Interface (RPI).

\item \mcafw{coll}: MPI collective communication.

\item \mcafw{cr}: Checkpoint/restart support for MPI programs.
\end{enumerate}

Each of these types, and the modules that are available in the default
Open MPI distribution, are discussed in detail below.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{General MPI MCA Parameters}
\label{sec:mca-ompi:mpi-params}

\changebegin{7.1}

The default hostmap file is \ifile{\$sysconf/lam-hostmap} (typically
\file{\$prefix/etc/lam-hostmap.txt}).  This file is only useful in
environments with multiple TCP networks, and is typically populated by
the system administrator (see the Open MPI Installation Guide for more
details on this file).

The MCA parameter \issiparam{mpi\_hostmap} can be used to specify an
alternate hostmap file.  For example:

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell$ mpirun C -ssi mpi_hostmap my_hostmap.txt my_mpi_application
\end{lstlisting}
% stupid emacs mode: $

This tells Open MPI to use the hostmap \file{my\_hostmap.txt} instead of
\file{\$sysconf/lam-hostmap.txt}.  The special filename
``\cmdarg{none}'' can also be used to indicate that no address
remapping should be performed.

\changeend{7.1}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{MPI Module Selection Process}
\label{sec:mca-ompi-component-selection}

The modules used in an MPI process may be related or dependent upon
external factors.  For example, the \rpi{gm} RPI cannot be used for
MPI point-to-point communication unless there is Myrinet hardware
present in the node.  The \crssi{blcr} checkpoint/restart module
cannot be used unless thread support was included.  And so on.  As
such, it is important for users to understand the module selection
algorithm.

\begin{enumerate}
\item Set the thread level to be what was requested, either via
  \mpifunc{MPI\_\-INIT\_\-THREAD} or the environment variable
  \ienvvar{Open MPI\_\-MPI\_\-THREAD\_\-LEVEL}.

\item Query relevant modules and make lists of the resulting available
  modules.  ``Relevant'' means either a specific module (or set of
  modules) if the user specified them through MCA parameters, or all
  modules if not specified.
  
\item Eliminate all modules who do not support the current MPI thread
  level.

\item If no \kind{rpi} modules remain, try a lower thread support
  level until all levels have been tried.  If no thread support level
  can provide an \kind{rpi} module, abort.
  
\item Select the highest priority \kind{rpi} module.  Reset the thread
  level (if necessary) to be at least the lower bound of thread levels
  that the selected \kind{rpi} module supports.
  
\item Eliminate all \kind{coll} and \kind{cr} modules that cannot
  operate at the current thread level.
  
\item If no \kind{coll} modules remain, abort.  Final selection
  \kind{coll} modules is discussed in
  Section~\ref{sec:mca-ompi-coll-select}
  (page~\pageref{sec:mca-ompi-coll-select}).

\item If no \kind{cr} modules remain and checkpoint/restart support
  was specifically requested, abort.  Otherwise, select the highest
  priority \kind{cr} module.
\end{enumerate}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{MPI Point-to-point Communication (Request Progression
  Interface / RPI)}
\label{sec:mca-ompi-rpi}

Open MPI provides multiple MCA modules for MPI point-to-point
communication.  Also known as the Request Progression Interface (RPI),
these modules are used for all aspects of MPI point-to-point
communication in an MPI application.  Some of the modules require
external hardware and/or software (e.g., the native Myrinet RPI module
requires both Myrinet hardware and the GM message passing library).
The \icmd{laminfo} command can be used to determine which RPI modules
are available in a Open MPI installation.

Although one RPI module will likely be the default, the selection of
which RPI module is used can be changed through the MCA parameter
\issiparam{rpi}.  For example:

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell$ mpirun -ssi rpi tcp C my_mpi_program
\end{lstlisting}
% Stupid emacs mode: $

\noindent runs the \file{my\_\-mpi\_\-program} executable on all
available CPUs using the \rpi{tcp} RPI module, while:

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell$ mpirun -ssi rpi gm C my_mpi_program
\end{lstlisting}
% Stupid emacs mode: $

\noindent runs the \file{my\_\-mpi\_\-program} executable on all
available CPUs using the \rpi{gm} RPI module.

It should be noted that the choice of RPI usually does not affect the
\kind{boot} MCA module -- hence, the \cmd{lamboot} command
requirements on hostnames specified in the boot schema is not
dependent upon the RPI.  For example, if the \rpi{gm} RPI is selected,
\cmd{lamboot} may still require TCP/IP hostnames in the boot schema,
not Myrinet hostnames.  Also note that selecting a particular module
does not guarantee that it will be able to be used.  For example,
selecting the \rpi{gm} RPI module will still cause a run-time failure
if there is no Myrinet hardware present.

The available modules are described in the sections below.  Note that
much of this information (particularly the tunable MCA parameters) is
also available in the \file{lamssi\_\-rpi(7)} manual page.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\changebegin{7.0.3}

\subsection{Two Different Shared Memory RPI Modules}
\label{sec:mca-ompi-shmem}

The \rpi{sysv} (Section~\ref{sec:mca-ompi-sysv},
page~\pageref{sec:mca-ompi-sysv}) and the \rpi{usysv}
(Section~\ref{sec:mca-ompi-usysv}, page~\pageref{sec:mca-ompi-usysv})
modules differ only in the mechanism used to synchronize the transfer
of messages via shared memory.
%
The \rpi{sysv} module uses System V semaphores while the \rpi{usysv}
module uses spin locks with back-off.
%
Both modules use a small number of System V semaphores for
synchronizing both the deallocation of shared structures and access to
the shared pool.

The blocking nature of the \rpi{sysv} module should generally provide
better performance than \rpi{usysv} on oversubscribed nodes (i.e.,
when the number of processes is greater than the number of available
processors).  System V semaphores will effectively force processes
yield to other processes, allowing at least some degree of
fair/regular scheduling.  In non-oversubscribed environments (i.e.,
where the number of processes is less than or equal to the number of
available processors), the \rpi{usysv} RPI should generally provide
better performance than the \rpi{sysv} RPI because spin locks keep
processors busy-waiting.  This hopefully keeps the operating system
from suspending or swapping out the processes, allowing them to react
immediately when the lock becomes available.

\changeend{7.0.3}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \rpi{crtcp} Module (Checkpoint-able TCP
  Communication)}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt crtcp} \\
  {\bf Kind:} & \kind{rpi} \\
  {\bf Default MCA priority:} & 25 \\
  {\bf Checkpoint / restart:} & yes \\
  \hline
\end{tabular}
\vspace{11pt}

The \rpi{crtcp} RPI module is almost identical to the \rpi{tcp}
module, described in Section~\ref{sec:mca-ompi-tcp}.  TCP sockets are
used for communication between MPI processes.

%%%%%

\subsubsection{Overview}

The following are the main differences between the \rpi{tcp} and
\rpi{crtcp} RPI modules:

\begin{itemize}
\item The \rpi{crtcp} module can be checkpointed and restarted.  It is
  currently the {\em only} RPI module in Open MPI that supports
  checkpoint/restart functionality.
  
\item The \rpi{crtcp} module does not have the ``fast'' message
  passing optimization that is in the \rpi{tcp} module.  As result,
  there is a small performance loss in certain types of MPI
  applications.
\end{itemize}

All other aspects of the \rpi{crtcp} module are the same as the
\rpi{tcp} module.

%%%%%

\subsubsection{Checkpoint/Restart Functionality}

The \rpi{crtcp} module is designed to work in conjunction with a
\kind{cr} module to provide checkpoint/restart functionality.  See
Section~\ref{sec:mca-ompi-cr} for a description of how Open MPI's overall
checkpoint/restart functionality is used.

The \rpi{crtcp} module's checkpoint/restart functionality is invoked
when the \kind{cr} module indicates that it is time to perform a
checkpoint.  The \rpi{crtcp} then quiesces all ``in-flight'' MPI
messages and then allows the checkpoint to be performed.  Upon
restart, TCP connections are re-formed, and message passing processing
continues.  No additional buffers or ``rollback'' mechanisms are
required, nor is any special coding required in the user's MPI
application.

%%%%%  

\subsubsection{Tunable Parameters}

\changebegin{7.1}

The \rpi{crtcp} module has the same tunable parameters as the
\rpi{tcp} module (maximum size of a short message and amount of OS
socket buffering), although they have different names:
\issiparam{rpi\_\-crtcp\_\-short},
\issiparam{rpi\_\-crtcp\_\-sockbuf}.

\changeend{7.1}

\begin{table}[htbp]
  \begin{ssiparamtb}
%
    \ssiparamentry{rpi\_\-crtcp\_\-priority}{25}{Default priority
    level.}
%
    \ssiparamentry{rpi\_\-crtcp\_\-short}{65535}{Maximum length
    (in bytes) of a ``short'' message.}
%
    \ssiparamentry{rpi\_\-crtcp\_\-sockbuf}{-1}{Socket buffering in
    the OS kernel (-1 means use the short message size).}
  \end{ssiparamtb}
  \caption{MCA parameters for the \rpi{crtcp} RPI module.}
  \label{tbl:mca-ompi-crtcp-mca-params}
\end{table}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \rpi{gm} Module (Myrinet)}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt gm} \\
  {\bf Kind:} & \kind{rpi} \\
  {\bf Default MCA priority:} & 50 \\
  {\bf Checkpoint / restart:} & yes (*) \\
  \hline
\end{tabular}
\vspace{11pt}

The \rpi{gm} RPI module is for native message passing over Myrinet
networking hardware.  The \rpi{gm} RPI provides low latency, high
bandwidth message passing performance.

\changebegin{7.1}

Be sure to also read the release notes entitled ``Operating System
Bypass Communication: Myrinet and Infiniband'' in the Open MPI
Installation Guide for notes about memory management with Myrinet.
Specifically, it deals with Open MPI's automatic overrides of the
\func{malloc()}, \func{calloc()}, and \func{free()} functions.

\changeend{7.1}

%%%%%

\subsubsection{Overview}

In general, using the \rpi{gm} RPI module is just like using any other
RPI module -- MPI functions will simply use native GM message passing
for their back-end message transport.

Although it is not required, users are strongly encouraged to use the
\mpifunc{MPI\_\-ALLOC\_\-MEM} and \mpifunc{MPI\_\-FREE\_\-MEM}
functions to allocate and free memory (instead of, for example,
\func{malloc()} and \func{free()}.

\changebegin{7.1}

The \rpi{gm} RPI module is marked as ``yes'' for checkpoint / restart
support, but this is only true when the module was configured and
compiled with the \confflag{with-rpi-gm-get} configure flag.  This
enables Open MPI to use the GM 2.x function \func{gm\_\-get()}.  Note that
enabling this feature slightly with the \ssiparam{rpi\_\-gm\_\-cr} MCA
parameter decreases the performance of the \rpi{gm} module (which is
why it is disabled by default) because of additional bookkeeping that
is necessary.  The performance difference is actually barely
measurable -- it is well below one microsecond.  It is not the default
behavior simply on principle.

At the time of this writing, there still appeared to be problems with
\func{gm\_\-get()}, so this behavior is disabled by default.  It is
not clear whether the problems with \func{gm\_\-get()} are due to a
problem with Myricom's GM library or a problem in Open MPI itself; the
\confflag{with-rpi-gm-get} option is provided as a ``hedging our
bets'' solution; if the problem does turn out to be with the GM
library, Open MPI users can enable checkpoint support (and slightly lower
long message latency) by using this switch.

\changeend{7.1}

%%%%%

\subsubsection{Tunable Parameters}

Table~\ref{tbl:mca-ompi-gm-mca-params} shows the MCA parameters that
may be changed at run-time; the text below explains each one in
detail.

\begin{table}[htbp]
  \begin{ssiparamtb}
%
    \ssiparamentry{rpi\_\-gm\_\-cr}{0}{Whether to enable checkpoint /
      restart support or not.}
%
    \ssiparamentry{rpi\_\-gm\_\-fast}{0}{Whether to enable the
      ``fast'' algorithm for sending short messages.  This is an
      unreliable transport and is not recommended for MPI applications
      that do not continually invoke the MPI progression engine.}
%
    \ssiparamentry{rpi\_\-gm\_\-maxport}{32}{Maximum GM port
    number to check during \mpifunc{MPI\_\-INIT} when looking for an
    available port.}
%
    \ssiparamentry{rpi\_\-gm\_\-nopin}{0}{Whether to let Open MPI
    register (``pin'') arbitrary buffers or not.}
%
    \ssiparamentry{rpi\_\-gm\_\-port}{-1}{Specific GM port to use
    (-1 indicates none).}
%
    \ssiparamentry{rpi\_\-gm\_\-priority}{50}{Default priority level.}
%
    \ssiparamentry{rpi\_\-gm\_\-tinymsglen}{1024}{Maximum length
    (in bytes) of a ``tiny'' message.}
  \end{ssiparamtb}
  \caption{MCA parameters for the \rpi{gm} RPI module.}
  \label{tbl:mca-ompi-gm-mca-params}
\end{table}

%%%%%

\subsubsection{Port Allocation}

It is usually unnecessary to specify which Myrinet/GM port to use.
Open MPI will automatically attempt to acquire ports greater than 1.

By default, Open MPI will check for any available port between 1 and 8.  If
your Myrinet hardware has more than 8 possible ports, you can change
the upper port number that Open MPI will check with the
\issiparam{rpi\_\-gm\_\-maxport} MCA parameter.

However, if you wish Open MPI to use a specific GM port number (and not
check all the ports from $[1, {\rm maxport}]$), you can tell Open MPI which
port to use with the \issiparam{rpi\_\-gm\_\-port} MCA parameter.
%
Specifying which port to use has precedence over the port range check
-- if a specific port is indicated, Open MPI will try to use that and not
check a range of ports.  Specifying to use port ``-1'' (or not
specifying to use a specific port) will tell Open MPI to check the range of
ports to find any available port.

Note that in all cases, if Open MPI cannot acquire a valid port for every
MPI process in the job, the entire job will be aborted.

Be wary of forcing a specific port to be used, particularly in
conjunction with the MPI dynamic process calls (e.g.,
\mpifunc{MPI\_\-COMM\_\-SPAWN}).  For example, attempting to spawn a
child process on a node that already has an MPI process in the same
job, Open MPI will try to use the same specific port, which will result in
failure because the MPI process already on that node will have already
claimed that port.

%%%%%

\subsubsection{Adjusting Message Lengths}

The \rpi{gm} RPI uses two different protocols for passing data between
MPI processes: tiny and long.  Selection of which protocol to use is
based solely on the length of the message.  Tiny messages are sent
(along with tag and communicator information) in one transfer to the
receiver.  Long messages use a rendezvous protocol -- the envelope is
sent to the destination, the receiver responds with an ACK (when it is
ready), and then the sender sends another envelope followed by the
data of the message.

The message lengths at which the different protocols are used can be
changed with the MCA parameter \issiparam{rpi\_\-gm\_\-tinymsglen} ,
which represent the maximum length of tiny messages.  Open MPI defaults to
1,024 bytes for the maximum lengths of tiny messages.

It may be desirable to adjust these values for different kinds of
applications and message passing patterns.  The Open MPI Team would
appreciate feedback on the performance of different values for real
world applications.

%%%%%

\subsubsection{Pinning Memory}
\label{sec:mca-ompi-gm-ptmalloc}

The Myrinet native communication library (gm) can only communicate
through ``registered'' (sometimes called ``pinned'') memory.  In most
operating systems, Open MPI handles this automatically by pinning
user-provided buffers when required.  This allows for good message
passing performance, especially when re-using buffers to send/receive
multiple messages.

However, the gm library does not have the ability to pin arbitrary
memory on Solaris systems -- auxiliary buffers must be used.  Although
Open MPI controls all pinned memory, this has a detrimental effect on
performance of large messages: Open MPI must copy all messages from the
application-provided buffer to an auxiliary buffer before it can be
sent (and vice versa for receiving messages).  As such, users are
strongly encouraged to use the \mpifunc{MPI\_\-ALLOC\_\-MEM} and
\mpifunc{MPI\_\-FREE\_\-MEM} functions instead of \func{malloc()} and
\func{free()}.  Using these functions will allocate ``pinned'' memory
such that Open MPI will not have to use auxiliary buffers and an extra
memory copy.

The \ssiparam{rpi\_\-gm\_\-nopin} MCA parameter can be used to force
Solaris-like behavior.  On Solaris platforms, the default value is
``1'', specifying to use auxiliary buffers as described above.  On
non-Solaris platforms, the default value is ``0'', meaning that
Open MPI will attempt to pin and send/receive directly from user
buffers.

Note that since Open MPI manages all pinned memory, Open MPI must be
aware of memory that is freed so that it can be properly unpinned
before it is returned to the operating system.  Hence, Open MPI must
intercept calls to functions such as \func{sbrk()} and \func{munmap()}
to effect this behavior.  Since gm cannot pin arbitrary memory on
Solaris, Open MPI does not need to intercept these calls on Solaris
machines.

To this end, support for additional memory allocation packages are
included in Open MPI and will automatically be used on platforms that
support arbitrary pinning.  These memory allocation managers allow
Open MPI to intercept the relevant functions and ensure that memory is
unpinned before returning it to the operating system.  Use of these
managers will effectively overload all memory allocation functions
(e.g., \func{malloc()}, \func{calloc()}, \func{free()}, etc.) for all
applications that are linked against the Open MPI libraries
(potentially regardless of whether they are using the ib RPI module or
not).  

See Section \ref{release-notes:os-bypass} (page
\pageref{release-notes:os-bypass}) for more information on Open MPI's
memory allocation managers.

%%%%%

\subsubsection{Memory Checking Debuggers}

When running Open MPI's \rpi{gm} RPI through a memory checking debugger
(see Section~\ref{sec:debug-mem}), a number of ``Read from
unallocated'' (RUA) and/or ``Read from uninitialized'' (RFU) errors
may appear, originating from functions beginning with ``\func{gm\_*}''
or ``\func{lam\_\-ssi\_\-rpi\_\-gm\_*}''.  These RUA/RFU errors are
normal -- they are not actually reads from unallocated sections of
memory.  The Myrinet hardware and gm kernel device driver handle some
aspects of memory allocation, and therefore the operating
system/debugging environment is not always aware of all valid memory.
As a result, a memory checking debugger will often raise warnings,
even though this is valid behavior.

%%%%%

\subsubsection{Known Issues}

As of Open MPI \lamversion, the following issues still remain in the
\rpi{gm} RPI module:

\begin{itemize}
\item Heterogeneity between big and little endian machines is not
  supported.
  
\item The \rpi{gm} RPI is not supported with IMPI.
  
\item Mixed shared memory / GM message passing is not yet supported;
  all message passing is through Myrinet / GM.
  
\item XMPI tracing is not yet supported.

\changebegin{7.0.3}
  
\item The \rpi{gm} RPI module is designed to run in environments where
  the number of available processors is greater than or equal to the
  number of MPI processes on a given node.  The \rpi{gm} RPI module
  will perform poorly (particularly in blocking MPI communication
  calls) if there are less processors than processes on a node.

\changeend{7.0.3}

\changebegin{7.1}

\item ``Fast'' support is available and slightly decreases the latency
  for short gm messages.  However, it is unreliable and is subject to
  timeouts for MPI applications that do not invoke the MPI progression
  engine often, and is therefore not the default behavior.

\item Support for the \func{gm\_\-get()} function in the GM 2.x series
  is available starting with Open MPI 7.1, but is disabled by support.
  See the Installation Guide for more details.
  
\item Checkpoint/restart support is included for the \rpi{gm} module,
  but is only possible when the \rpi{gm} module was compiled with
  support for \func{gm\_\-get()}.

\changeend{7.1}

\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \rpi{ib} Module (Infiniband)}
\label{sec:mca-ompi-ib}

\changebegin{7.1}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt ib} \\
  {\bf Kind:} & \kind{rpi} \\
  {\bf Default MCA priority:} & 50 \\
  {\bf Checkpoint / restart:} & no \\
  \hline
\end{tabular}
\vspace{11pt}


The \rpi{ib} RPI module is for native message passing over Infiniband
networking hardware.  The \rpi{ib} RPI provides low latency, high
bandwidth message passing performance.

Be sure to also read the release notes entitled ``Operating System
Bypass Communication: Myrinet and Infiniband'' in the Open MPI
Installation Guide for notes about memory management with Infiniband.
Specifically, it deals with Open MPI's automatic overrides of the
\func{malloc()}, \func{calloc()}, and \func{free()} functions.

%%%%%

\subsubsection{Overview}

In general, using the \rpi{ib} RPI module is just like using any other
RPI module -- MPI functions will simply use native Infiniband message
passing for their back-end message transport.

Although it is not required, users are strongly encouraged to use the
\mpifunc{MPI\_\-ALLOC\_\-MEM} and \mpifunc{MPI\_\-FREE\_\-MEM}
functions to allocate and free memory used for communication (instead
of, for example, \func{malloc()} and \func{free()}. This would avoid
the need to pin the memory during communication time and hence save on
message passsing latency.

%%%%%

\subsubsection{Tunable Parameters}

Table~\ref{tbl:mca-ompi-ib-mca-params} shows the MCA parameters that
may be changed at run-time; the text below explains each one in
detail.

\begin{table}[htbp]
  \begin{ssiparamtb}
%
    \ssiparamentry{rpi\_\-ib\_\-hca\_\-id}{X}{The string ID of the
    Infiniband hardware HCA to be used}
%
    \ssiparamentry{rpi\_\-ib\_\-num\_\-envelopes}{64}{Number of
    envelopes to be preposted per peer process.}
%
    \ssiparamentry{rpi\_\-ib\_\-port}{-1}{Specific IB port to use
    (-1 indicates none).}
%
    \ssiparamentry{rpi\_\-ib\_\-priority}{50}{Default priority level.}
%
    \ssiparamentry{rpi\_\-ib\_\-tinymsglen}{1024}{Maximum length
    (in bytes) of a ``tiny'' message.}
%
    \ssiparamentry{rpi\_\-ib\_\-mtu}{1024}{Maximum Transmission
    Unit (MTU) value to be used for IB.}

  \end{ssiparamtb}
  \caption{MCA parameters for the \rpi{ib} RPI module.}
  \label{tbl:mca-ompi-ib-mca-params}
\end{table}

%%%%%

\subsubsection{Port Allocation}

It is usually unnecessary to specify which Infiniband port to use.
Open MPI will automatically attempt to acquire ports greater than 1.

However, if you wish Open MPI to use a specific Infiniband port number, you
can tell Open MPI which port to use with the \issiparam{rpi\_\-ib\_\-port}
MCA parameter.
%
Specifying which port to use has precedence over the port range check
-- if a specific port is indicated, Open MPI will try to use that and not
check a range of ports.  Specifying to use port ``-1'' (or not
specifying to use a specific port) will tell Open MPI to check the range of
ports to find any available port.

Note that in all cases, if Open MPI cannot acquire a valid port for every
MPI process in the job, the entire job will be aborted.

Be wary of forcing a specific port to be used, particularly in
conjunction with the MPI dynamic process calls (e.g.,
\mpifunc{MPI\_\-COMM\_\-SPAWN}).  For example, attempting to spawn a
child process on a node that already has an MPI process in the same
job, Open MPI will try to use the same specific port, which will result in
failure because the MPI process already on that node will have already
claimed that port.

%%%%%

\subsubsection{Choosing an HCA ID}

The HCA ID is the Mellanox Host Channel Adapter ID.  For example:
InfiniHost0.  It is usually unnecessary to specify which HCA ID to
use.  Open MPI will search for all HCAs available and select the first
one which is available.  If you want to use a fixed HCA ID, then you
can specify that using the \ssiparam{rpi\_\-ib\_\-hca\_\-id} MCA
parameter.

%%%%%

\subsubsection{Adjusting Message Lengths}

The \rpi{ib} RPI uses two different protocols for passing data between
MPI processes: tiny and long.  Selection of which protocol to use is
based solely on the length of the message.  Tiny messages are sent
(along with tag and communicator information) in one transfer to the
receiver.  Long messages use a rendezvous protocol -- the envelope is
sent to the destination, the receiver responds with an ACK (when it is
ready), and then the sender sends another envelope followed by the
data of the message.

The message lengths at which the different protocols are used can be
changed with the MCA parameter \issiparam{rpi\_\-ib\_\-tinymsglen} ,
which represent the maximum length of tiny messages.  Open MPI defaults to
1,024 bytes for the maximum lengths of tiny messages.

It may be desirable to adjust these values for different kinds of
applications and message passing patterns.  The Open MPI Team would
appreciate feedback on the performance of different values for real
world applications.

%%%%%

\subsubsection{Posting Envelopes to Recieve / Scalability}
\label{sec:mca-ompi-ib-envelopes}

Receive buffers must be posted to the IB communication
hardware/library before any receives can occur.  Open MPI uses
enevelopes that contain MPI signature information, and in the case of
tiny messages, they also hold the actual message contents.
%
The size of each envelope is therefore sum of the size of the headers
and the maximum size of a tiny message (controlled by
\issiparam{rpi\_\-ib\_\-tinymsglen} MCA parameter).  Open MPI pre-posts 64
evnvelope buffers per peer process by default, but can be overridden
at run-time with then \issiparam{rpi\_\-ib\_\-num\_\-envelopes} MCA
parameter.

\changebegin{7.1.2}

These two MCA parameters can have a large effect on scalability.
Since Open MPI pre-posts a total of $((num\_processes - 1) \times
num\_envelopes \times tinymsglen)$ bytes, this can be prohibitive if
$num\_processes$ grows large.  However, $num\_envelopes$ and
$tinymsglen$ can be adjusted to help keep this number low, although
they may have an effect on run-time performance.  Changing the number
of pre-posted envelopes effectively controls how many messages can be
simultaneously flowing across the network; changing the tiny message
size affects when Open MPI switches to use a rendezvous sending protocol
instead of an eager send protocol.  Relevant values for these
parameters are likely to be application-specific; keep this in mind
when running large parallel jobs.

\changeend{7.1.2}

%%%%%

\subsubsection{Modifying the MTU value}
\label{sec:mca-ompi-ib-mtu}

\changebegin{7.1.2}

The Maximum Transmission Unit (MTU) values to be used for Infiniband
can be configured at runtime using the
\issiparam{rpi\_\-ib\_\-mtu} MCA parameter. It can take in
values of 256, 512, 1024, 2048 and 4096 corresponding to MTU256,
MTU512, MTU1024, MTU2048 and MTU4096 values of Infiniband MTUs
respectively. The default value is 1024 (corresponding to MTU1024).

\changeend{7.1.2}

%%%%%

\subsubsection{Pinning Memory}
\label{sec:mca-ompi-ib-ptmalloc}

The Infiniband communication library can only communicate through
``registered'' (sometimes called ``pinned'') memory.  Open MPI handles
this automatically by pinning user-provided buffers when required.
This allows for good message passing performance, especially when
re-using buffers to send/receive multiple messages.

Note that since Open MPI manages all pinned memory, Open MPI must be
aware of memory that is freed so that it can be properly unpinned
before it is returned to the operating system.  Hence, Open MPI must
intercept calls to functions such as \func{sbrk()} and \func{munmap()}
to effect this behavior.

To this end, support for additional memory allocation packages are
included in Open MPI and will automatically be used on platforms that
support arbitrary pinning.  These memory allocation managers allow
Open MPI to intercept the relevant functions and ensure that memory is
unpinned before returning it to the operating system.  Use of these
managers will effectively overload all memory allocation functions
(e.g., \func{malloc()}, \func{calloc()}, \func{free()}, etc.) for all
applications that are linked against the Open MPI libraries
(potentially regardless of whether they are using the ib RPI module or
not).  

See Section \ref{release-notes:os-bypass} (page
\pageref{release-notes:os-bypass}) for more information on Open MPI's
memory allocation managers.

%%%%%

\subsubsection{Memory Checking Debuggers}

When running Open MPI's \rpi{ib} RPI through a memory checking debugger
(see Section~\ref{sec:debug-mem}), a number of ``Read from
unallocated'' (RUA) and/or ``Read from uninitialized'' (RFU) errors
may appear pertaining to VAPI.  These RUA/RFU errors are
normal -- they are not actually reads from unallocated sections of
memory.  The Infiniband hardware and kernel device driver handle some
aspects of memory allocation, and therefore the operating
system/debugging environment is not always aware of all valid memory.
As a result, a memory checking debugger will often raise warnings,
even though this is valid behavior.

%%%%%

\subsubsection{Known Issues}

As of Open MPI \lamversion, the following issues remain in the
\rpi{ib} RPI module:

\begin{itemize}

\changebegin{7.1.2}

\item The \rpi{ib} \kind{rpi} will not scale well to large numbers of
  processes.  See the section entitled ``Posting Envelopes to Receive
  / Scalability,'' above.

\changeend{7.1.2}

\item On machines which have IB (VAPI) shared libraries but not the IB
  hardware, and when Open MPI is compiled with IB support, you may see some
  error messages like ``can't open device file'' when trying to use
  Open MPI, even when you are not using the IB module.  This error
  message pertains to IB (VAPI) shared libraries and is not from
  within Open MPI.  It results because when Open MPI tries to query the
  shared libraries, VAPI tries to open the IB device during the shared
  library init phase, which is not proper.  

\item Heterogeneity between big and little endian machines is not
  supported.
  
\item The \rpi{ib} RPI is not supported with IMPI.
  
\item Mixed shared memory / IB message passing is not yet supported;
  all message passing is through Infiniband.
  
\item XMPI tracing is not yet supported.

\item The \rpi{ib} RPI module is designed to run in environments where
  the number of available processors is greater than or equal to the
  number of MPI processes on a given node.  The \rpi{ib} RPI module
  will perform poorly (particularly in blocking MPI communication
  calls) if there are less processors than processes on a node.

\changeend{7.1}

\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \rpi{lamd} Module (Daemon-Based Communication)}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt lamd} \\
  {\bf Kind:} & \kind{rpi} \\
  {\bf Default MCA priority:} & 10 \\
  {\bf Checkpoint / restart:} & no \\
  \hline
\end{tabular}
\vspace{11pt}

The \rpi{lamd} RPI module uses the Open MPI daemons for all interprocess
communication.  This allows for true asynchronous message passing
(i.e., messages can progress even while the user's program is
executing), albeit at the cost of a significantly higher latency and
lower bandwidth.

%%%%%

\subsubsection{Overview}

Rather than send messages directly from one MPI process to another,
all messages are routed through the local Open MPI daemon, the remote Open MPI
daemon (if the target process is on a different node), and then
finally to the target MPI process.  This potentially adds two hops to
each MPI message.

Although the latency incurred can be significant, the \rpi{lamd} RPI
can actually make message passing progress ``in the background.''
Specifically, since Open MPI is an single-threaded MPI implementation,
it can typically only make progress passing messages when the user's
program is in an MPI function call.  With the \rpi{lamd} RPI, since
the messages are all routed through separate processes, message
passing can actually occur when the user's program is {\em not} in an
MPI function call.

User programs that utilize latency-hiding techniques can exploit this
asynchronous message passing behavior, and therefore actually achieve
high performance despite of the high overhead associated with the
\rpi{lamd} RPI.\footnote{Several users on the Open MPI mailing list
  have mentioned this specifically; even though the \rpi{lamd} RPI is
  slow, it provides {\em significantly} better performance because it
  can provide true asynchronous message passing.}

%%%%%

\subsubsection{Tunable Parameters}

The \rpi{lamd} module has only one tunable parameter: its priority.

\begin{table}[htbp]
  \begin{ssiparamtb}
%
    \ssiparamentry{rpi\_\-lamd\_\-priority}{10}{Default priority
    level.}
  \end{ssiparamtb}
  \caption{MCA parameters for the \rpi{lamd} RPI module.}
  \label{tbl:mca-ompi-lamd-mca-params}
\end{table}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \rpi{sysv} Module (Shared Memory Using System V
  Semaphores)}
\label{sec:mca-ompi-sysv}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt sysv} \\
  {\bf Kind:} & \kind{rpi} \\
  {\bf Default MCA priority:} & 30 \\
  {\bf Checkpoint / restart:} & no \\
  \hline
\end{tabular}
\vspace{11pt}

The \rpi{sysv} RPI is the one of two combination shared-memory/TCP
message passing modules.  Shared memory is used for passing messages
to processes on the same node; TCP sockets are used for passing
messages to processes on other nodes.  System V semaphores are used
for synchronization of the shared memory pool.

\changebegin{7.0.3}

Be sure to read Section~\ref{sec:mca-ompi-shmem}
(page~\pageref{sec:mca-ompi-shmem}) on the difference between this
module and the \rpi{usysv} module.

\changeend{7.0.3}

%%%%%

\subsubsection{Overview}

Processes located on the same node communicate via shared memory.  One
System V shared segment is shared by all processes on the same node.
This segment is logically divided into three areas.  The total size of
the shared segment (in bytes) allocated on each node is:

\[ 
(2 \times C) + (N \times (N-1) \times (S + C)) + P
\]

where $C$ is the cache line size, $N$ is the number of processes on
the node, $S$ is the maximum size of short messages, and $P$ is the
size of the pool for large messages,

The first area (of size $(2 \times C)$) is for the global pool lock.
The \rpi{sysv} module allocates a semaphore set (of size six) for each
process pair communicating via shared memory.  On some systems, the
operating system may need to be reconfigured to allow for more
semaphore sets if running tasks with many processes communicating via
shared memory.

The second area is for ``postboxes,'' or short message passing.  A
postbox is used for communication one-way between two processes.  Each
postbox is the size of a short message plus the length of a cache
line.  There is enough space allocated for $(N \times (N-1))$
postboxes.  The maximum size of a short message is configurable with
the \issiparam{rpi\_\-ssi\_\-sysv\_\-short} MCA parameter.

% JMS: Someday, cache line should be an MCA parameter.

% \const{CACHELINESIZE} must be the size of a cache line or a multiple
% thereof.  The default setting is 64 bytes.  You shouldn't need to
% change it.  \const{CACHELINESIZE} bytes in the postbox are used for a
% cache-line sized synchronization location.

The final area in the shared memory area (of size $P$) is used as a
global pool from which space for long message transfers is allocated.
Allocation from this pool is locked.  The default lock mechanism is a
System V semaphore but can be changed to a process-shared pthread
mutex lock.  The size of this pool is configurable with the
\issiparam{rpi\_\-ssi\_\-sysv\_\-shmpoolsize} MCA parameter.  Open MPI will
try to determine $P$ at configuration time if none is explicitly
specified.  Larger values should improve performance (especially when
an application passes large messages) but will also increase the
system resources used by each task.

%%%%%

\subsubsection{Use of the Global Pool}
  
When a message larger than ($2S$) is sent, the transport sends $S$
bytes with the first packet.  When the acknowledgment is received, it
allocates (${\rm message length} - S$) bytes from the global pool to
transfer the rest of the message.

To prevent a single large message transfer from monopolizing the
global pool, allocations from the pool are actually restricted to a
maximum of \issiparam{rpi\_\-ssi\_\-sysv\_\-shmmaxalloc} bytes.  Even
with this restriction, it is possible for the global pool to
temporarily become exhausted.  In this case, the transport will fall
back to using the postbox area to transfer the message.  Performance
will be degraded, but the application will progress.

%%%%%

\subsubsection{Tunable Parameters}

Table~\ref{tbl:mca-ompi-sysv-mca-params} shows the MCA parameters that
may be changed at run-time.  Each of these parameters were discussed
in the previous sections.

\begin{table}[htbp]
  \begin{ssiparamtb}
%
  \ssiparamentry{rpi\_\-sysv\_\-priority}{30}{Default priority level.}
%
  \ssiparamentry{rpi\_\-sysv\_\-pollyield}{1}{Whether or not to force
    the use of \func{yield()} to yield the processor.}
%
  \ssiparamentry{rpi\_\-sysv\_\-shmmaxalloc}{From configure}{Maximum
    size of a large message atomic transfer.  The default value is
    calculated when Open MPI is configured.}
%
  \ssiparamentry{rpi\_\-sysv\_\-shmpoolsize}{From configure}{Size of
    the shared memory pool for large messages.  The default value is
    calculated when Open MPI is configured.}
%
  \ssiparamentry{rpi\_\-sysv\_\-short}{8192}{Maximum length (in bytes)
    of a ``short'' message for sending via shared memory (i.e.,
    on-node).  Directly affects the size of the allocated ``postbox''
    shared memory area.}
%
  \ssiparamentry{rpi\_\-tcp\_\-short}{65535}{Maximum length
    (in bytes) of a ``short'' message for sending via TCP sockets
    (i.e., off-node).}
%
  \ssiparamentry{rpi\_\-tcp\_\-sockbuf}{-1}{Socket buffering in the OS
    kernel (-1 means use the short message size).}
  \end{ssiparamtb}
  \caption{MCA parameters for the \rpi{sysv} RPI module.}
  \label{tbl:mca-ompi-sysv-mca-params}
\end{table}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \rpi{tcp} Module (TCP Communication)}
\label{sec:mca-ompi-tcp}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt tcp} \\
  {\bf Kind:} & \kind{rpi} \\
  {\bf Default MCA priority:} & 20 \\
  {\bf Checkpoint / restart:} & no \\
  \hline
\end{tabular}
\vspace{11pt}

The \rpi{tcp} RPI module uses TCP sockets for MPI point-to-point
communication.  

%%%%%

\subsubsection{Tunable Parameters}
    
Two different protocols are used to pass messages between processes:
short and long.  Short messages are sent eagerly and will not block
unless the operating system blocks.  Long messages use a rendezvous
protocol; the body of the message is not sent until a matching MPI
receive is posted.  The crossover point between the short and long
protocol defaults to 64KB, but can be changed with the
\issiparam{rpi\_\-tcp\_\-short} MCA parameter, an integer specifying
the maximum size (in bytes) of a short message.
%
\changebegin{7.1}
%
Additionally, the amount of socket buffering requested of the kernel
defaults to the size of short messages.  It can be altered with the
\issiparam{rpi\_\-tcp\_\-sockbuf} parameter.  When this value is -1,
the value of the \issiparam{rpi\_\-tcp\_\-short} parameter is used.
Otherwise, its value is passed to the \func{setsockopt(2)} system call
to set the amount of operating system buffering on every socket that
is used for MPI communication.

\changeend{7.1}

\begin{table}[htbp]
  \begin{ssiparamtb}
%
    \ssiparamentry{rpi\_\-tcp\_\-priority}{20}{Default priority level.}
%
    \ssiparamentry{rpi\_\-tcp\_\-short}{65535}{Maximum length
      (in bytes) of a ``short'' message.}
%
    \ssiparamentry{rpi\_\-tcp\_\-sockbuf}{-1}{Socket buffering in the OS
      kernel (-1 means use the short message size).}
  \end{ssiparamtb}
  \caption{MCA parameters for the \rpi{tcp} RPI module.}
  \label{tbl:mca-ompi-tcp-mca-params}
\end{table}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \rpi{usysv} Module (Shared Memory Using Spin Locks)}
\label{sec:mca-ompi-usysv}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt usysv} \\
  {\bf Kind:} & \kind{rpi} \\
  {\bf Default MCA priority:} & 40 \\
  {\bf Checkpoint / restart:} & no \\
  \hline
\end{tabular}
\vspace{11pt}

The \rpi{usysv} RPI is the one of two combination shared-memory/TCP
message passing modules.  Shared memory is used for passing messages
to processes on the same node; TCP sockets are used for passing
messages to processes on other nodes.  Spin locks with back-off are
used for synchronization of the shared memory pool (a System V
semaphore or pthread mutex is also used for access to the per-node
shared memory pool).

\changebegin{7.0.3}

The nature of spin locks means that the \rpi{usysv} RPI will perform
poorly when there are more processes than processors (particularly in
blocking MPI communication calls).  If no higher priority RPI modules
are available (e.g., Myrinet/\rpi{gm}) and the user does not select a
specific RPI module through the \ssiparam{rpi} MCA parameter,
\rpi{usysv} may be selected as the default -- even if there are more
processes than processors.  Users should keep this in mind; in such
circumstances, it is probably better to manually select the \rpi{sysv}
or \rpi{tcp} RPI modules.

\changeend{7.0.3}

%%%%%

\subsubsection{Overview}

Aside from synchronization, the \rpi{usysv} RPI module is almost
identical to the \rpi{sysv} module.
%
The \rpi{usysv} module uses spin locks with back-off.  When a process
backs off, it attempts to yield the processor.  If the configure
script found a system-provided yield function,\footnote{Such as
  \func{yield()} or \func{sched\_\-yield()}.} it is used. If no such
function is found, then \func{select()} on \const{NULL} file
descriptor sets with a timeout of 10us is used.

%%%%%

\subsubsection{Tunable Parameters}

Table~\ref{tbl:mca-ompi-usysv-mca-params} shows the MCA parameters that
may be changed at run-time.  Many of these parameters are identical to
their \rpi{sysv} counterparts and are not re-described here.

\begin{table}[htbp]
  \begin{ssiparamtb}
%
    \ssiparamentry{rpi\_\-tcp\_\-short}{65535}{Maximum length
      (in bytes) of a ``short'' message for sending via TCP sockets
      (i.e., off-node).}
%
    \ssiparamentry{rpi\_\-tcp\_\-sockbuf}{-1}{Socket buffering in the OS
      kernel (-1 means use the short message size).}
%
    \ssiparamentry{rpi\_\-usysv\_\-pollyield}{1}{Same as \rpi{sysv}
    counterpart.}
%
    \ssiparamentry{rpi\_\-usysv\_\-priority}{40}{Default priority level.}
%
    \ssiparamentry{rpi\_\-usysv\_\-readlockpoll}{10,000}{Number of
    iterations to spin before yielding the processing while waiting to
    read.}
%
    \ssiparamentry{rpi\_\-usysv\_\-shmmaxalloc}{From configure}{Same as
    \rpi{sysv} counterpart.}
%
    \ssiparamentry{rpi\_\-usysv\_\-shmpoolsize}{From configure}{Same as
    \rpi{sysv} counterpart.}
%
    \ssiparamentry{rpi\_\-usysv\_\-short}{8192}{Same as \rpi{sysv}
    counterpart.}
%
    \ssiparamentry{rpi\_\-usysv\_\-writelockpoll}{10}{Number of
    iterations to spin before yielding the processing while waiting to
    write.}
  \end{ssiparamtb}
  \caption{MCA parameters for the \rpi{usysv} RPI module.}
  \label{tbl:mca-ompi-usysv-mca-params}
\end{table}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{MPI Collective Communication}
\label{sec:mca-ompi-coll}
\index{collective MCA modules|(}
\index{MPI collective modules|see {collective MCA modules}}
\index{MCA collective modules|see {collective MCA modules}}

MPI collective communication functions have their basic functionality
outlined in the MPI standard.  However, the implementation of this
functionality can be optimized and/or implemented in different ways.
As such, Open MPI provides modules for implementing the MPI collective
routines that are targeted for different environments.

\begin{itemize}
\item Basic algorithms
\item SMP-optimized algorithms
\item Shared Memory algorithms
\end{itemize}

These modules are discussed in detail below.  Note that the sections
below each assume that support for these modules have been compiled
into Open MPI.  The \icmd{laminfo} command can be used to determine
exactly which modules are supported in your installation (see
Section~\ref{sec:commands-laminfo},
page~\pageref{sec:commands-laminfo}).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Selecting a \kind{coll} Module}
\label{sec:mca-ompi-coll-select}
\index{collective MCA modules!selection process}

\kind{coll} modules are selected on a per-communicator basis.  Most
users will not need to override the \kind{coll} selection mechanisms;
the \kind{coll} modules currently included in Open MPI usually select
the best module for each communicator.  However, mechanisms are
provided to override which \kind{coll} module will be selected on a
given communicator.

When each communicator is created (including \mcw\ and \mcs), all
available \kind{coll} modules are queried to see if they want to be
selected.  A \kind{coll} module may therefore be in use by zero or
more communicators at any given time.  The final selection of which
module will be used for a given communicator is based on priority; the
module with the highest priority from the set of available modules
will be used for all collective calls on that communicator.

Since the selection of which module to use is inherently dynamic and
potentially different for each communicator, there are two levels of
parameters specifying which modules should be used.  The first level
specifies the overall set of \kind{coll} modules that will be
available to {\em all} communicators; the second level is a
per-communicator parameter indicating which specific module should be
used.

The first level is provided with the \issiparam{coll} MCA parameter.
Its value is a comma-separated list of \kind{coll} module names.  If
this parameter is supplied, only these modules will be queried at run
time, effectively determining the set of modules available for
selection on all communicators.  If this parameter is not supplied,
all \kind{coll} modules will be queried.

The second level is provided with the MPI attribute
\mpiattr{Open MPI\_\-MPI\_\-MCA\_\-COLL}.  This attribute can be set to
the string name of a specific \kind{coll} module on a parent
communicator before a new communicator is created.  If set, the
attribute's value indicates the {\em only} module that will be
queried.  If this attribute is not set, all available modules are
queried.

Note that no coordination is done between the MCA frameworks in each
MPI process to ensure that the same modules are available and/or are
selected for each communicator.  Although \cmd{mpirun} allows
different environment variables to be exported to each MPI process,
and the value of an MPI attribute is local to each process, Open MPI's
behavior is undefined if the same MCA parameters are not available in
all MPI processes.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{\kind{coll} MCA Parameters}

There are three parameters that apply to all \kind{coll} modules.
Depending on when their values are checked, they may be set by
environment variables, command line switches, or attributes on MPI
communicators.

\begin{itemize}
\item \issiparam{coll\_\-base\_\-associative}: The MPI standard defines
  whether reduction operations are commutative or not, but makes no
  provisions for whether an operator is associative or not.  This
  parameter, if defined to 1, asserts that all reduction operations on
  a communicator are assumed to be associative.  If undefined or
  defined to 0, all reduction operations are assumed to be
  non-associative.  
  
  This parameter is examined during every reduction operation.  See
  {\bf Commutative and Associative Reduction Operators}, below.
  
\item \issiparam{coll\_\-crossover}: If set, define the maximum number
  of processes that will be used with a linear algorithm.  More than
  this number of processes may use some other kind of algorithm.

  This parameter is only examined during \mpifunc{MPI\_\-INIT}.
  
\item \issiparam{coll\_\-reduce\_\-crossover}: For reduction
  operations, the determination as to whether an algorithm should be
  linear or not is not based on the number of process, but rather by
  the number of bytes to be transferred by each process.  If this
  parameter is set, it defines the maximum number of bytes transferred
  by a single process with a linear algorithm.  More than this number
  of bytes may result in some other kind of algorithm.

  This parameter is only examined during \mpifunc{MPI\_\-INIT}.
\end{itemize}

%%%%%

\subsubsection{Commutative and Associative Reduction Operators}

MPI-1 defines that all built-in reduction operators are commutative.
User-defined reduction operators can specify whether they are
commutative or not.  The MPI standard makes no provisions for whether
a reduction operation is associative or not.
%
For some operators and datatypes, this distinction is largely
irrelevant (e.g., find the maximum in a set of integers).  However,
for operations involving the combination of floating point numbers,
associativity and commutativity matter.  An {\em Advice to
  Implementors} note in MPI-1, section 4.9.1, 114:20, states:

\begin{quote}
  It is strongly recommended that \mpifunc{MPI\_\-REDUCE} be
  implemented so that the same result be obtained whenever the
  function is applied on the same arguments, appearing in the same
  order.  Note that this may prevent optimizations that take advantage
  of the physical location of processors.
\end{quote}

Some implementations of the reduction operations may specifically take
advantage of data locality, and therefore assume that the reduction
operator is associative.
%
As such, Open MPI will always take the conservative approach to reduction
operations and fall back to non-associative algorithms (e.g.,
\coll{lam\_\-basic}) for the reduction operations unless specifically
told to use associative (SMP-optimized) algorithms by setting the MCA
parameter \issiparam{coll\_\-base\_\-associative} to 1.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \coll{lam\_\-basic} Module}
\index{collective MCA modules!lam\_basic@\coll{lam\_\-basic}}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt lam\_\-basic} \\
  {\bf Kind:} & \kind{coll} \\
  {\bf Default MCA priority:} & 0 \\
  {\bf Checkpoint / restart:} & yes \\
  \hline
\end{tabular}
\vspace{11pt}

The \coll{lam\_\-basic} module provides simplistic algorithms for each
of the MPI collectives that are layered on top of point-to-point
functionality.\footnote{The basic algorithms are the same that have
  been included in Open MPI since at least version 6.2.}  It can be
used in any environment.  Its priority is sufficiently low that it
will be chosen if no other \kind{coll} module is available.

Many of the algorithms are twofold: for $N$ or less processes, linear
algorithms are used.  For more than $N$ processes, binomial algorithms
are used.  No attempt is made to determine the locality of processes,
however -- the \coll{lam\_\-basic} module effectively assumes that
there is equal latency between all processes.  All reduction
operations are performed in a strictly-defined order; associativity is
not assumed.

\subsubsection{Collectives for Intercommunicators}

As of now, only \coll{lam\_\-basic} module supports intercommunicator
collectives according to the MPI-2 standard. These algorithms are
built over point-to-point layer and they also make use of an
intra-communicator collectives with the help of intra-communicator
corresponding to the local group. Mapping among the intercommunicator
and corresponding local-intracommunicator is separately managed in the
\coll{lam\_\-basic} module.  

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \coll{smp} Module}
\index{collective MCA modules!smp@\coll{smp}}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt smp} \\
  {\bf Kind:} & \kind{coll} \\
  {\bf Default MCA priority:} & 50 \\
  {\bf Checkpoint / restart:} & yes \\
  \hline
\end{tabular}
\vspace{11pt}

The \coll{smp} module is geared towards SMP nodes in a LAN.  Heavily
inspired by the MagPIe
algorithms~\cite{kielmann++:00:magpie_bandwidth}, the \coll{smp}
module determines the locality of processes before setting up a
dynamic structure in which to perform the collective function.
Although all communication is still layered on MPI point-to-point
functions, the algorithms attempt to maximize the use of on-node
communication before communicating with off-node processes.  This
results in lower overall latency for the collective operation.  

The \coll{smp} module assumes that there are only two levels of
latency between all processes.  As such, it will only allow itself to
be available for selection when there are at least two nodes in a
communicator and there are at least two processes on the same
node.\footnote{As a direct result, \coll{smp} will never be selected
  for \mcs.}

Only some of the collectives have been optimized for SMP environments.
Table~\ref{tbl:mca-ompi-coll-smp-algorithms} shows which collective
functions have been optimized, which were already optimal (from the
\coll{lam\_\-basic} module), and which will eventually be optimized.

\def\lbid{Identical to \coll{lam\_\-basic} algorithm; already
  optimized for SMP environments.}
\def\smpopt{Optimized for SMP environments.}
\def\smpnoopt{Not yet optimized for SMP environments; uses
  \coll{lam\_\-basic} algorithm instead.}

\begin{table}[htbp]
  \centering
  \begin{tabular}{|l|p{3.7in}|}
    \hline
    \multicolumn{1}{|c|}{MPI function} &
    \multicolumn{1}{|c|}{Status} \\
    \hline
    \hline
    \mpifunc{MPI\_\-ALLGATHER} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-ALLGATHERV} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-ALLREDUCE} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-ALLTOALL} & \lbid \\
    \hline
    \mpifunc{MPI\_\-ALLTOALLV} & \lbid \\
    \hline
    \mpifunc{MPI\_\-ALLTOALLW} & lbid. \\
    \hline
    \mpifunc{MPI\_\-BARRIER} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-BCAST} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-EXSCAN} & lbid. \\
    \hline
    \mpifunc{MPI\_\-GATHER} & \lbid \\
    \hline
    \mpifunc{MPI\_\-GATHERV} & \lbid \\
    \hline
    \mpifunc{MPI\_\-REDUCE} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-REDUCE\_\-SCATTER} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-SCAN} & \smpopt \\
    \hline
    \mpifunc{MPI\_\-SCATTER} & \lbid \\
    \hline
    \mpifunc{MPI\_\-SCATTERV} & \lbid \\
    \hline
  \end{tabular}
  \caption{Listing of MPI collective functions indicating which have
    been optimized for SMP environments.}
  \label{tbl:mca-ompi-coll-smp-algorithms}
\end{table}

%%%%%

\subsubsection{Special Notes}

Since the goal of the SMP-optimized algorithms attempt to take
advantage of data locality, it is strongly recommended to maximize the
proximity of \mcw\ rank neighbors on each node.  The \cmdarg{C}
nomenclature to \cmd{mpirun} can ensure this automatically.

Also, as a result of the data-locality exploitation, the
\issiparam{coll\_\-base\_\-associative} parameter is highly relevant -- if it
is not set to 1, the \coll{smp} module will fall back to the
\coll{lam\_\-basic} reduction algorithms.

\index{collective MCA modules|)}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\changebegin{7.1}

\subsection{The \coll{shmem} Module}
\index{collective MCA modules!shmem@\coll{shmem}}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt shmem} \\
  {\bf Kind:} & \kind{coll} \\
  {\bf Default MCA priority:} & 50 \\
  {\bf Checkpoint / restart:} & yes \\
  \hline
\end{tabular}
\vspace{11pt}

The \coll{shmem} module is developed to facilitate fast collective
communication among processes on a single node.  Processes on a N-way
SMP node can take advantage of the shared memory for message
passing.  The module will be selected only if the communicator spans
over a single node and the all the processes in the communicator can
successfully attach the shared memory region to their address space. 

The shared memory region consists two disjoint sections.  First section
of the shared memory is used for synchronization among the processes
while the second section is used for message passing (Copying data
into and from shared memory). 

The second section is known as \const{MESSAGE\_POOL} and is divided
into N equal segments.  Default value of $N$ is 8 and is configurable
with the \issiparam{coll\_base\_shmem\_num\_segments} MCA
parameter.  The size of the \const{MESSAGE\_POOL} can be also configured
with the \issiparam{coll\_base\_shmem\_message\_pool\_size} MCA
parameter.  Default size of the \const{MESSAGE\_POOL} is $(16384 \times
8)$.

The first section is known as \const{CONTROL\_SECTION} and it is
logicallu divided into $(2 \times N + 2)$ segments.  $N$ is the number
of segments in the \const{MESSAGE\_POOL} section.  Total size of this
section is:

\[
((2 \times N) + 2) \times C \times S 
\]

Where $C$ is the cache line size, $S$ is the size of the communicator.
Shared variabled for synchronization are placed in different
\const{CACHELINE} for each processes to prevent trashing due to cache
invalidation.  

%%%%%

\subsubsection{General Logic behind Shared Memory Management}

Each segment in the \const{MESSAGE\_POOL} corresponds to {\em TWO}
segments in the \const{CONTROL\_SECTION}.  Whenever a particular segment
in \const{MESSAGE\_POOL} is active, its corresponding segments in the
\const{CONTROL\_SECTION} are used for synchronization.  Processes can
operate on one segment (Copy the messages), set appropriate
synchronizattion variables and can continue with the next message
segment.  This approach improves performance of the collective
algorithms. All the process need to complete a \mpifunc{MPI\_BARRIER}
 at the last (Default 8th) segment to prevent race conditions.  The
 extra 2 segments in the \const{CONTROL\_SECTION} are used exclusively
 for explicit \mpifunc{MPI\_BARRIER}. 

Only some of the collectives have been optimized for SMP environments.
Table~\ref{tbl:mca-ompi-coll-shmem-algorithms} shows which collective
functions have been optimized, which were already optimal (from the
\coll{lam\_\-basic} module), and which will eventually be optimized.

%%%%%

\subsubsection{List of Algorithms}

Only some of the collectives have been implemented using shared memory
Table~\ref{tbl:mca-ompi-coll-shmem-algorithms} shows which collective
functions have been implemented and which uses \coll{lam\_\-basic}
module)

\def\shmemopt{Implemented using shared memory.}
\def\shmemnoopt{Uses \coll{lam\_\-basic} algorithm.}

\begin{table}[htbp]
  \centering
  \begin{tabular}{|l|p{3.7in}|}
    \hline
    \multicolumn{1}{|c|}{MPI function} &
    \multicolumn{1}{|c|}{Status} \\
    \hline
    \hline
    \mpifunc{MPI\_\-ALLGATHER} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-ALLGATHERV} & \shmemnoopt \\
    \hline
    \mpifunc{MPI\_\-ALLREDUCE} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-ALLTOALL} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-ALLTOALLV} & \shmemnoopt \\
    \hline
    \mpifunc{MPI\_\-ALLTOALLW} & \shmemnoopt \\
    \hline
    \mpifunc{MPI\_\-BARRIER} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-BCAST} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-EXSCAN} & \shmemnoopt \\
    \hline
    \mpifunc{MPI\_\-GATHER} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-GATHERV} & \shmemnoopt \\
    \hline
    \mpifunc{MPI\_\-REDUCE} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-REDUCE\_\-SCATTER} & \shmemnoopt \\
    \hline
    \mpifunc{MPI\_\-SCAN} & \shmemnoopt \\
    \hline
    \mpifunc{MPI\_\-SCATTER} & \shmemopt \\
    \hline
    \mpifunc{MPI\_\-SCATTERV} & \shmemnoopt \\
    \hline
  \end{tabular}
  \caption{Listing of MPI collective functions indicating which have
    been implemented using Shared Memory}
  \label{tbl:mca-ompi-coll-shmem-algorithms}
\end{table}  

%%%%%

\subsubsection{Tunable Parameters}

Table~\ref{tbl:mca-ompi-shmem-mca-params} shows the MCA parameters that
may be changed at run-time.  Each of these parameters were discussed
in the previous sections.

\begin{table}[htbp]
  \begin{ssiparamtb}
%
    \ssiparamentry{coll\_\-base\_\-shmem\_\-message\_\-pool\_\-size}{$16384
      \times 8$}{Size of the shared memory pool for the messages.}
%
    \ssiparamentry{coll\_\-base\_\-shmem\_\-num\_\-segments}{8}{Number
      of segments in the message pool section.}
  \end{ssiparamtb}
  \caption{MCA parameters for the \coll{shmem} \kind{coll} module.}
  \label{tbl:mca-ompi-shmem-mca-params}
\end{table}

%%%%%

\subsubsection{Special Notes}

Open MPI provides \rpi{sysv} and \rpi{usysv} RPI for the intra\-node
communication.  In this case, the collective communication also
happens through the shared memory but indirectly in terms of Sends and
Recvs.  Shared Memory Collective algorithms avoid all the overhead
associated with the indirection and provide a minimum blocking way for
the collective operations.

The shared memory is created by only one process in the communicator
and rest of the processes simply attach the shared memory region to
their address space.  The process which finalizes last, hands back the
shared memory region to the kernel while processes leaving before
simply detach the shared memory region from their address space. 

\index{collective MCA modules|)}

\changeend{7.1}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Checkpoint/Restart of MPI Jobs}
\label{sec:mca-ompi-cr}
\index{checkpoint/restart MCA modules|(}

Open MPI supports the ability to involuntarily checkpoint and restart
parallel MPI jobs.  Due to the asynchronous nature of the
checkpoint/restart design, such jobs must run with a thread level of
at least \mpiconst{MPI\_\-THREAD\_\-SERIALIZED}.  This allows the
checkpoint/restart framework to interrupt the user's job for a
checkpoint regardless of whether it is performing message passing
functions or not in the MPI communications layer.

Open MPI does not provide checkpoint/restart functionality itself;
\kind{cr} MCA modules are used to invoke back-end systems that save
and restore checkpoints.  The following notes apply to checkpointing
parallel MPI jobs:

\begin{itemize}
\item No special code is required in MPI applications to take
  advantage of Open MPI's checkpoint/restart functionality, although
  some limitations may be imposed (depending on the back-end
  checkpointing system that is used).  
  
\item Open MPI's checkpoint/restart functionality {\em only} involves MPI
  processes; the Open MPI universe is not checkpointed.  A Open MPI universe
  must be independently established before an MPI job can be restored.

\item Open MPI does not yet support checkpointing/restarting MPI-2
  applications.  In particular, Open MPI's behavior is undefined when
  checkpointing MPI processes that invoke any non-local MPI-2
  functionality (including dynamic functions and IO).  
  
\item Migration of restarted processes is available on a limited
  basis; the \rpi{crtcp} RPI will start up properly regardless of what
  nodes the MPI processes are re-started on, but other system-level
  resources may or may not be restarted properly (e.g., open files,
  shared memory, etc.).

\changebegin{7.1}
\item Checkpoint files are saved using a two-phase commit protocol that is
  coordinated by \cmd{mpirun}.  \cmd{mpirun} initiates a checkpoint request
  for each process in the MPI job by supplying a temporary context filename.
  If all the checkpoint requests completed successfully, the saved context
  files are renamed to their respective target filenames; otherwise, the
  checkpoint files are discarded.
\changeend{7.1}

\item Checkpoints can only be performed after all processes have
  invoked \mpifunc{MPI\_\-INIT} and before any process has invoked
  \mpifunc{MPI\_\-FINALIZE}.
\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{Selecting a \kind{cr} Module}
\index{checkpoint/restart MCA modules!selection process}

The \kind{cr} framework coordinates with all other MCA modules to
ensure that the entire MPI application is ready to be checkpointed
before the back-end system is invoked.  Specifically, for a parallel
job to be able to checkpoint and restart, all the MCA modules that it
uses must support checkpoint/restart capabilities.

All \kind{coll} modules in the Open MPI distribution currently support
checkpoint/restart capability because they are layered on MPI
point-to-point functionality -- as long as the RPI module being used
supports checkpoint/restart, so do the \kind{coll} modules.
%
However, only one RPI module currently supports checkpoint/restart:
\rpi{crtcp}.  Attempting to checkpoint an MPI job when using any other
\kind{rpi} module will result in undefined behavior.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{\kind{cr} MCA Parameters}

The \issiparam{cr} MCA parameter can be used to specify which
\kind{cr} module should be used for an MPI job.  An error will occur
if a \kind{cr} module is requested and an \kind{rpi} or \kind{coll}
module cannot be found that supports checkpoint/restart functionality.

Additionally, the \issiparam{cr\_\-base\_\-dir} MCA parameter can be
used to specify the directory where checkpoint file(s) will be saved.
If it is not set, and no default value was provided when Open MPI was
configured (with the \confflag{with-cr-file-dir} flag) the user's home
directory is used.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\subsection{The \crssi{blcr} Module}
\index{Berkeley Lab Checkpoint/Restart single-node checkpointer}
\index{blcr checkpoint/restart MCA module@\crssi{blcr} checkpoint/restart MCA module}
\index{checkpoint/restart MCA modules!blcr@\crssi{blcr}}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt blcr} \\
  {\bf Kind:} & \kind{cr} \\
  {\bf Default MCA priority:} & 50 \\
  {\bf Checkpoint / restart:} & yes \\
  \hline
\end{tabular}
\vspace{11pt}

Berkeley Lab's Checkpoint/Restart (BLCR)~\cite{BLCR02} single-node
checkpointer provides the capability for checkpointing and restarting
processes under Linux.  The \crssi{blcr} module, when used with
checkpoint/restart MCA modules, will invoke the BLCR system to save
and restore checkpoints.

%%%%%

\subsubsection{Overview}

The \crssi{blcr} module will only automatically be selected when the
thread level is \mpiconst{MPI\_\-THREAD\_\-SERIALIZED} and all
selected MCA modules support checkpoint/restart functionality (see the
MCA module selection algorithm,
Section~\ref{sec:mca-ompi-component-selection},
page~\pageref{sec:mca-ompi-component-selection}).  The \crssi{blcr} module
can be specifically selected by setting the \ssiparam{cr} MCA
parameter to the value \issivalue{cr}{blcr}.  Manually selecting the
\crssi{blcr} module will force the MPI thread level to be at least
\mpiconst{MPI\_\-THREAD\_\-SERIALIZED}.

%%%%%

\subsubsection{Running a Checkpoint/Restart-Capable MPI Job}

There are multiple ways to run a job with checkpoint/restart support:

\begin{itemize}
\item Use the \rpi{crtcp} RPI, and invoke
  \mpifunc{MPI\_\-INIT\_\-THREAD} with a requested thread level of
  \mpiconst{MPI\_\-THREAD\_\-SERIALIZED}.  This will automatically
  make the \crssi{blcr} module available.

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell$ mpirun C -ssi rpi crtcp my_mpi_program
\end{lstlisting}
  % stupid emacs mode: $
  
\item Use the \rpi{crtcp} RPI and manually select the \crssi{blcr}
  module:

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell$ mpirun C -ssi rpi crtcp -ssi cr blcr my_mpi_program
\end{lstlisting}
% stupid emacs mode: $
\end{itemize}

\changebegin{7.0.5}

Depending on the location of the BLCR shared library, it may be
necessary to use the \ienvvar{LD\_\-LIBRARY\_\-PATH} environment
variable to specify where it can be found.  Specifically, if the BLCR
library is not in the default path searched by the linker, errors will
occur at run time because it cannot be found.  In such cases, adding
the directory where the \file{libcr.so*} file(s) can be found to the
\ienvvar{LD\_\-LIBRARY\_\-PATH} environment variable {\em on all nodes
  where the MPI application will execute} will solve the problem.
%
Note that this may entail editing user's ``dot'' files to augment the
\ienvvar{LD\_\-LIBRARY\_\-PATH} variable.\footnote{Ensure to see
  Section~\ref{sec:getting-started-path} for details about which
  shell startup files should be edited.  Also note that 
  shell startup files are {\em only} read when starting the Open MPI
  universe.  Hence, if you change values in shell startup files, you
  will likely need to re-invoke the \icmd{lamboot} command to put your
  changes into effect.}  For example:

\lstset{style=lam-cmdline}
\begin{lstlisting}
# ...edit user's shell startup file to augment LD_LIBRARY_PATH...
shell$ lamboot hostfile
shell$ mpirun C -ssi rpi crtcp -ssi cr blcr my_mpi_program
\end{lstlisting}

Alternatively, the ``\cmd{-x}'' option to \icmd{mpirun} can be used to
export the \ienvvar{LD\_\-LIBRARY\_\-PATH} environment variable to all
MPI processes.  For example (Bourne shell and derrivates):

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell$ LD_LIBRARY_PATH=/location/of/blcr/lib:$LD_LIBRARY_PATH
shell$ export LD_LIBRARY_PATH
shell$ mpirun C -ssi rpi crtcp -ssi cr blcr -x LD_LIBRARY_PATH my_mpi_program
\end{lstlisting}
% stupid emacs mode: $

For C shell and derivates:

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell% setenv LD_LIBRARY_PATH /location/of/blcr/lib:$LD_LIBRARY_PATH
shell% mpirun C -ssi rpi crtcp -ssi cr blcr -x LD_LIBRARY_PATH my_mpi_program
\end{lstlisting}

\changeend{7.0.5}

%%%%%
 
\subsubsection{Checkpointing and Restarting}

Once a checkpoint-capable job is running, the BLCR command
\icmd{cr\_\-checkpoint} can be used to invoke a checkpoint.  Running
\cmd{cr\_\-checkpoint} with the PID of \cmd{mpirun} will cause a
context file to be created for \cmd{mpirun} as well as a context file
for each running MPI process.  Before it is checkpointed, \cmd{mpirun}
will also create an application schema file to assist in restoring the
MPI job.  These files will all be created in the directory specified
by Open MPI's configured default, the \issiparam{cr\_\-base\_\-dir}, or
the user's home directory if no default is specified.

The BLCR \icmd{cr\_\-restart} command can then be invoked with the PID
and context file generated from \cmd{mpirun}, which will restore the
entire MPI job.

%%%%%

\subsubsection{Tunable Parameters}

There are no tunable parameters to the \crssi{blcr} \kind{cr} module.

%%%%%
 
\subsubsection{Known Issues}

\begin{itemize}
\item BLCR has its own limitations (e.g., BLCR does not yet support
  saving and restoring file descriptors); see the documentation
  included in BLCR for further information.  Check the project's main
  web site\footnote{\url{http://ftg.lbl.gov/}} to find out more about
  BLCR.

\changebegin{7.1} 
\item Since a checkpoint request is initiated by invoking
  \cmd{cr\_checkpoint} with the PID of \cmd{mpirun}, it is not
  possible to checkpoint MPI jobs that were started using the
  \cmdarg{-nw} option to \cmd{mpirun}, or directly from the
  command-line without using \cmd{mpirun}.
   
\item While the two-phase commit protocol that is used to save
  checkpoints provides a reasonable guarantee of consistency of saved
  global state, there is at least one case in which this guarantee
  fails.  For example, the renaming of checkpoint files by
  \cmd{mpirun} is not atomic; if a failure occurs when \cmd{mpirun} is
  in the process of renaming the checkpoint files, the collection of
  checkpoint files might result in an inconsistent global state.
  
\item If the BLCR module(s) are compiled dynamically, the
  \ienvvar{LD\_\-PRELOAD} environment variable must include the
  location of the \ifile{libcr.so} library.  This is to ensure that
  \ifile{libcr.so} is loaded before the PThreads library.
\changeend{7.1}

\end{itemize}


\changebegin{7.1} 
\subsection{The \crssi{self} Module}

\begin{tabular}{rl}
  \multicolumn{2}{c}{Module Summary} \\
  \hline
  {\bf Name:} & {\tt blcr} \\
  {\bf Kind:} & \kind{cr} \\
  {\bf Default MCA priority:} & 25 \\
  {\bf Checkpoint / restart:} & yes \\
  \hline
\end{tabular}
\vspace{11pt}

The \crssi{self} module, when used with checkpoint/restart MCA modules, will 
invoke the user-defined functions to save and restore checkpoints.

%%%%%

\subsubsection{Overview}

The \crssi{self} module can be specifically selected by setting the 
\ssiparam{cr} MCA parameter to the value \issivalue{cr}{self}.  Manually 
selecting the \crssi{self} module will force the MPI thread level to be at 
least \mpiconst{MPI\_\-THREAD\_\-SERIALIZED}.

%%%%%

\subsubsection{Running a Checkpoint/Restart-Capable MPI Job}

Use the \rpi{crtcp} RPI and manually select the \crssi{self} module:

\lstset{style=lam-cmdline}
\begin{lstlisting}
shell$ mpirun C -ssi rpi crtcp -ssi cr self my_mpi_program
\end{lstlisting}
% stupid emacs mode: $

%%%%%
 
\subsubsection{Checkpointing and Restarting}

The names of the Checkpoint, Restart and Continue functions can be specified 
in one of the following ways:

\begin{itemize}
  \item Use the \ssiparam{cr\_\-self\_\-user\_\-prefix} to specify a prefix.  This will 
    cause Open MPI to assume that the Checkpoint, Restart and Continue functions 
    are prefix\_checkpoint, prefix\_restart and prefix\_continue respectively, 
    where prefix is the value of the \ssiparam{cr\_\-self\_\-user\_\-prefix} MCA parameter.

  \item To specify the names of the Checkpoint, Restart and Continue functions 
    separately, use the \ssiparam{cr\_\-self\_\-user\_\-checkpoint}, 
    \ssiparam{cr\_\-ssi\_\-user\_\-restart} and the 
    \ssiparam{cr\_\-self\_\-user\_\-continue} MCA parameters respectively.  In 
    case both the \ssiparam{cr\_\-ssi\_\-user\_\-prefix} and any of these 
    above three parameters are specified, these parameters are given higher preference. 


\end{itemize}

%%%%%

In case none of the above four parameters are supplied, and the \crssi{self} 
module is selected, \cmd{mpirun} aborts with the error message indicating 
that symbol-lookup failed.  \cmd{mpirun} also aborts in case any of the 
Checkpoint, Restart or Continue functions is not found in the MPI application.

Once a checkpoint-capable job is running, the Open MPI command
\cmd{lamcheckpoint} can be used to invoke a checkpoint.  Running
\cmd{lamcheckpoint} with the PID of \cmd{mpirun} will cause the user-defined 
Checkpoint function to be invoked.  Before it is checkpointed, \cmd{mpirun}
will also create an application schema file to assist in restoring the
MPI job.  These files will all be created in the directory specified
by Open MPI's configured default, the \issiparam{cr\_\-base\_\-dir}, or
the user's home directory if no default is specified.

\cmd{lamboot} can be used to restart an MPI application.  In case the 
\crssi{self} module is selected the second argument to \cmd{lamboot} is the 
set of arguments to be passed to the new \cmd{mpirun}.    
%%%%%

\subsubsection{Tunable Parameters}

There are no tunable parameters to the \crssi{self} \kind{cr} module.

%%%%%
 
\subsubsection{Known Issues}

\begin{itemize}

\item Since a checkpoint request is initiated by invoking
  \cmd{lamcheckpoint} with the PID of \cmd{mpirun}, it is not possible to
  checkpoint MPI jobs that were started using the \cmdarg{-nw} option to
  \cmd{mpirun}, or directly from the command-line without using \cmd{mpirun}. 

\end{itemize}
\changeend{7.1}

\index{checkpoint/restart MCA modules|)}
\index{checkpoint/restart MCA modules|)}
