% -*- 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{Supported MPI Functionality} \label{sec:mpi-functionality} This chapter discusses the exact levels of MPI functionality that is supported by Open MPI. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{MPI-1 Support} Open MPI \ompiversion\ has support for all MPI-1 functionality. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Language Bindings} \label{sec:mpi-details-mpi1-language} Open MPI provides C, C++, Fortran 77, and Fortran 90 bindings for all MPI-1 functions, types, and constants. % Profiling support is available in all four languages (if Open MPI was configured and compiled with profiling support). The \icmd{ompi\_info} command can be used to see if profiling support was included in Open MPI. {\Huge JMS needs massive overhauling} Support for optional Fortran types has now been added. Table~\ref{tbl:mpi-details-optional-fortran-dtypes} lists the new datatypes. Note that \mpidatatype{MPI\_\-INTEGER8} and \mpidatatype{MPI\_\-REAL16} are listed even though they are not defined by the MPI standard. Support for these types is included per request from Open MPI users. \begin{table}[htbp] \centering \begin{tabular}{|ll|} \hline \multicolumn{2}{|c|}{Supported Datatypes} \\ \hline \hline \mpidatatype{MPI\_\-INTEGER1} & \mpidatatype{MPI\_\-INTEGER2} \\ % \mpidatatype{MPI\_\-INTEGER4} & \mpidatatype{MPI\_\-INTEGER8} \\ % \mpidatatype{MPI\_\-REAL4} & \mpidatatype{MPI\_\-REAL8} \\ % \mpidatatype{MPI\_\-REAL16} & ~ \\ \hline \end{tabular} \caption{Supported optional fortran datatypes.} \label{tbl:mpi-details-optional-fortran-dtypes} \end{table} \changeend{7.1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{\mpifunc{MPI\_\-CANCEL}} \mpifunc{MPI\_\-CANCEL} works properly for receives, but will almost never work on sends. \mpifunc{MPI\_\-CANCEL} is most frequently used with unmatched \mpifunc{MPI\_\-IRECV}'s that were made ``in case'' a matching message arrived. This simply entails removing the receive request from the local queue, and is fairly straightforward to implement. Actually canceling a send operation is much more difficult because some meta information about a message is usually sent immediately. As such, the message is usually at least partially sent before an \mpifunc{MPI\_\-CANCEL} is issued. Trying to chase down all the particular cases is a nightmare, to say the least. As such, the Open MPI Team decided not to implement \mpifunc{MPI\_\-CANCEL} on sends, and instead concentrate on other features. But in true MPI Forum tradition, we would be happy to discuss any code that someone would like to submit that fully implements \mpifunc{MPI\_\-CANCEL}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{MPI-2 Support} Open MPI \lamversion\ has support for many MPI-2 features. The main chapters of the MPI-2 standard are listed below, along with a summary of the support provided for each chapter. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Miscellany} %%%%% \paragraph{Portable MPI Process Startup.} The \icmd{mpiexec} command is now supported. Common examples include: \lstset{style=lam-shell} \begin{lstlisting} # Runs 4 copes of the MPI program my_mpi_program shell$ mpiexec -n 4 my_mpi_program # Runs my_linux_program on all available Linux machines, and runs # my_solaris_program on all available Solaris machines shell$ mpiexec -arch linux my_linux_program : -arch solaris my_solaris_program # Boot the Open MPI run-time environment, run my_mpi_program on all # available CPUs, and then shut down the Open MPI run-time environment. shell$ mpiexec -machinefile hostfile my_mpi_program \end{lstlisting} % stupid emacs mode: $ See the \file{mpiexec(1)} man page for more details on supported options as well as more examples. %%%%% \paragraph{Passing \const{NULL} to \mpifunc{MPI\_\-INIT}.} Passing \const{NULL} as both arguments to \mpifunc{MPI\_\-INIT} is fully supported. %%%%% \paragraph{Version Number.} Open MPI \lamversion\ reports its MPI version as 1.2 through the function \mpifunc{MPI\_\-GET\_\-VERSION}. %%%%% \paragraph{Datatype Constructor \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-INDEXED\_\-BLOCK}.} The MPI function \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-INDEXED\_\-BLOCK} is not supported by Open MPI. %%%%% \paragraph{Treatment of \mpitype{MPI\_\-Status}.} Although Open MPI supports the constants \mpiconst{MPI\_\-STATUS\_\-IGNORE} and \mpiconst{MPI\_\-STATUSES\_\-IGNORE}, the function \mpifunc{MPI\_\-REQUEST\_\-GET\_\-STATUS} is not provided. %%%%% \paragraph{Error class for invalid keyval.} The error class for invalid keyvals, \mpiconst{MPI\_\-ERR\_\-KEYVAL}, is fully supported. %%%%% \paragraph{Committing committed datatype.} Committing a committed datatype is fully supported; its end effect is a no-op. %%%%% \paragraph{Allowing user functions at process termination.} Attaching attributes to \mpiconst{MPI\_\-COMM\_\-SELF} that have user-specified delete functions will now trigger these functions to be invoked as the first phase of \mpifunc{MPI\_\-FINALIZE}. When these functions are run, MPI is still otherwise fully functional. %%%%% \paragraph{Determining whether MPI has finished.} The function \mpifunc{MPI\_\-FINALIZED} is fully supported. %%%%% \paragraph{The {\sf Info} object.} Full support for \mpitype{MPI\_\-Info} objects is provided. See Table~\ref{tbl:mpi-details-info-functions}. \begin{table}[htbp] \centering \begin{tabular}{|lll|} \hline \multicolumn{3}{|c|}{Supported Functions} \\ \hline \hline \mpifunc{MPI\_\-INFO\_\-CREATE} & \mpifunc{MPI\_\-INFO\_\-FREE} & \mpifunc{MPI\_\-INFO\_\-GET\_\-NTHKEY} \\ % \mpifunc{MPI\_\-INFO\_\-DELETE} & \mpifunc{MPI\_\-INFO\_\-GET} & \mpifunc{MPI\_\-INFO\_\-GET\_\-VALUELEN} \\ % \mpifunc{MPI\_\-INFO\_\-DUP} & \mpifunc{MPI\_\-INFO\_\-GET\_\-NKEYS} & \mpifunc{MPI\_\-INFO\_\-SET} \\ \hline \end{tabular} \caption{Supported MPI-2 info functions.} \label{tbl:mpi-details-info-functions} \end{table} %%%%% \paragraph{Memory allocation.} The \mpifunc{MPI\_\-ALLOC\_\-MEM} and \mpifunc{MPI\_\-FREE\_\-MEM} functions will return ``special'' memory that enable fast memory passing in RPIs that support it. % These functions are simply wrappers to \func{malloc()} and \func{free()} (respectively) in RPI modules that do not take advantage of ``special'' memory. % These functions can be used portably for potential performance gains. %%%%% \paragraph{Language interoperability.} Inter-language interoperability is supported. It is possible to initialize Open MPI from either C or Fortran and mix MPI calls from both languages. Handle conversions for inter-language interoperability are fully supported. See Table~\ref{tbl:mpi-details-handle-conversion-functions}. \begin{table}[htbp] \centering \begin{tabular}{|ll|} \hline \multicolumn{2}{|c|}{Supported Functions} \\ \hline \hline \mpifunc{MPI\_\-COMM\_\-F2C} & \mpifunc{MPI\_\-COMM\_\-C2F} \\ % \mpifunc{MPI\_\-GROUP\_\-F2C} & \mpifunc{MPI\_\-GROUP\_\-C2F} \\ % \mpifunc{MPI\_\-TYPE\_\-F2C} & \mpifunc{MPI\_\-TYPE\_\-C2F} \\ % \mpifunc{MPI\_\-REQUEST\_\-F2C} & \mpifunc{MPI\_\-REQUEST\_\-C2F} \\ % \mpifunc{MPI\_\-INFO\_\-F2C} & \mpifunc{MPI\_\-INFO\_\-C2F} \\ % \mpifunc{MPI\_\-WIN\_\-F2C} & \mpifunc{MPI\_\-WIN\_\-C2F} \\ % \mpifunc{MPI\_\-STATUS\_\-F2C} & \mpifunc{MPI\_\-STATUS\_\-C2F} \\ \hline \end{tabular} \caption{Supported MPI-2 handle conversion functions.} \label{tbl:mpi-details-handle-conversion-functions} \end{table} %%%%% \paragraph{Error handlers.} Communicator and window error handler functions are fully supported; this functionality is not yet supported for \mpitype{MPI\_\-File} handles. See Table~\ref{tbl:mpi-details-err-handler-functions} \begin{table}[htbp] \centering \begin{tabular}{|ll|} \hline \multicolumn{2}{|c|}{Supported Functions} \\ \hline \hline \mpifunc{MPI\_\-COMM\_\-CREATE\_\-ERRHANDLER} & \mpifunc{MPI\_\-WIN\_\-CREATE\_\-ERRHANDLER} \\ % \mpifunc{MPI\_\-COMM\_\-GET\_\-ERRHANDLER} & \mpifunc{MPI\_\-WIN\_\-GET\_\-ERRHANDLER} \\ % \mpifunc{MPI\_\-COMM\_\-SET\_\-ERRHANDLER} & \mpifunc{MPI\_\-WIN\_\-SET\_\-ERRHANDLER} \\ \hline \end{tabular} \caption{Supported MPI-2 error handler functions.} \label{tbl:mpi-details-err-handler-functions} \end{table} %%%%% \paragraph{New datatype manipulation functions.} Several new datatype manipulation functions are provided. Table~\ref{tbl:mpi-details-new-dtype-manip-functions} lists the new functions. \begin{table}[htbp] \centering \begin{tabular}{|ll|} \hline \multicolumn{2}{|c|}{Supported Functions} \\ \hline \hline \mpifunc{MPI\_\-GET\_\-ADDRESS} & \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-SUBARRAY} \\ % \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-DARRAY} & \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-STRUCT} \\ % \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-HINDEXED} & \mpifunc{MPI\_\-TYPE\_\-GET\_\-EXTENT} \\ % \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-HVECTOR} & \mpifunc{MPI\_\-TYPE\_\-GET\_\-TRUE\_\-EXTENT} \\ % \mpifunc{MPI\_\-TYPE\_\-CREATE\_\-RESIZED} & ~ \\ \hline \end{tabular} \caption{Supported MPI-2 new datatype manipulation functions.} \label{tbl:mpi-details-new-dtype-manip-functions} \end{table} %%%%% \paragraph{New predefined datatypes.} Support has been added for the \mpidatatype{MPI\_\-LONG\_\-LONG\_\-INT}, \mpidatatype{MPI\_\-UNSIGNED\_\-LONG\_\-LONG} and \mpidatatype{MPI\_\-WCHAR} basic datatypes. %%%%% \paragraph{Canonical \mpifunc{MPI\_\-PACK}, \mpifunc{MPI\_\-UNPACK}.} Support is not provided for \mpifunc{MPI\_\-PACK\_\-EXTERNAL}, \mpifunc{MPI\_\-UNPACK\_\-EXTERNAL}, or \mpifunc{MPI\_\-PACK\_\-EXTERNAL\_\-SIZE}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Process Creation and Management} Open MPI supports all MPI-2 dynamic process management. Table~\ref{tbl:mpi-details-dynamic-functions} lists all the supported functions. \begin{table}[htbp] \centering \begin{tabular}{|lll|} \hline \multicolumn{3}{|c|}{Supported Functions} \\ \hline \hline \mpifunc{MPI\_\-CLOSE\_\-PORT} & \mpifunc{MPI\_\-COMM\_\-GET\_\-PARENT} & \mpifunc{MPI\_\-LOOKUP\_\-NAME} \\ % \mpifunc{MPI\_\-COMM\_\-ACCEPT} & \mpifunc{MPI\_\-COMM\_\-JOIN} & \mpifunc{MPI\_\-OPEN\_\-PORT} \\ % \mpifunc{MPI\_\-COMM\_\-SPAWN} & \mpifunc{MPI\_\-COMM\_\-CONNECT} & \mpifunc{MPI\_\-PUBLISH\_\-NAME} \\ % \mpifunc{MPI\_\-COMM\_\-DISCONNECT} & \mpifunc{MPI\_\-COMM\_\-SPAWN\_\-MULTIPLE} & \mpifunc{MPI\_\-UNPUBLISH\_\-NAME} \\ \hline \end{tabular} \caption{Supported MPI-2 dynamic functions.} \label{tbl:mpi-details-dynamic-functions} \end{table} As requested by Open MPI users, \mpifunc{MPI\_\-COMM\_\-SPAWN} and \mpifunc{MPI\_\-COMM\_\-SPAWN\_\-MULTIPLE} supports some \mpitype{MPI\_\-Info} keys for spawning MPMD applications and for more fine-grained control about where children processes are spawned. See the \file{MPI\_\-Comm\_\-spawn(3)} man page for more details. These functions supersede the \mpifunc{MPIL\_\-COMM\_\-SPAWN} function that Open MPI introduced in version 6.2b. Hence, \mpifunc{MPIL\_\-COMM\_\-SPAWN} is no longer available. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{One-Sided Communication} Support is provided for get/put/accumulate data transfer operations and for the post/wait/start/complete and fence synchronization operations. No support is provided for window locking. The datatypes used in the get/put/accumulate operations are restricted to being basic datatypes or single level contiguous/vectors of basic datatypes. The implementation of the one-sided operations is layered on top of the point-to-point functions, and will thus perform no better than them. Nevertheless it is hoped that providing this support will aid developers in developing and debugging codes using one-sided communication. Table~\ref{tbl:mpi-details-one-sided-functions} lists the functions related to one-sided communication that have been implemented. \begin{table}[htbp] \centering \begin{tabular}{|lll|} \hline \multicolumn{3}{|c|}{Supported Functions} \\ \hline \hline \mpifunc{MPI\_\-ACCUMULATE} & \mpifunc{MPI\_\-WIN\_\-CREATE} & \mpifunc{MPI\_\-WIN\_\-POST} \\ % \mpifunc{MPI\_\-GET} & \mpifunc{MPI\_\-WIN\_\-FENCE} & \mpifunc{MPI\_\-WIN\_\-START} \\ % \mpifunc{MPI\_\-PUT} & \mpifunc{MPI\_\-WIN\_\-FREE} & \mpifunc{MPI\_\-WIN\_\-WAIT} \\ % \mpifunc{MPI\_\-WIN\_\-COMPLETE} & \mpifunc{MPI\_\-WIN\_\-GET\_\-GROUP} & ~ \\ \hline \end{tabular} \caption{Supported MPI-2 one-sided functions.} \label{tbl:mpi-details-one-sided-functions} \end{table} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Extended Collective Operations} \label{sec:mpi:extended-collectives} \changebegin{7.1} Open MPI implements the new MPI-2 collective functions \mpifunc{MPI\_\-EXSCAN} and \mpifunc{MPI\_\-ALLTOALLW} for intracommunicators. Intercommunicator collectives are implemented for all the functions listed in Table~\ref{tbl:mpi-details-intercomm-collective-functions}. Notably, intercommunicator collectives are {\em not} defined for \mpifunc{MPI\_\-SCAN} (because the MPI standard does not define it), \mpifunc{MPI\_\-ALLGATHERV}, and \mpifunc{MPI\_\-EXSCAN}.\footnote{These two functions were unfortunately overlooked and forgotten about when Open MPI v7.1 was frozen for release.} \begin{table}[htbp] \centering \begin{tabular}{|lll|} \hline \multicolumn{3}{|c|}{Supported Functions} \\ \hline \hline \mpifunc{MPI\_\-ALLGATHER} & \mpifunc{MPI\_\-ALLGATHERV} & \mpifunc{MPI\_\-ALLTOALL} \\ % \mpifunc{MPI\_\-ALLTOALLV} & \mpifunc{MPI\_\-ALLTOALLW} & \mpifunc{MPI\_\-ALLREDUCE} \\ % \mpifunc{MPI\_\-REDUCE\_\-SCATTER} & \mpifunc{MPI\_\-GATHER} & \mpifunc{MPI\_\-GATHERV} \\ % \mpifunc{MPI\_\-REDUCE} & \mpifunc{MPI\_\-BCAST} & \mpifunc{MPI\_\-SCATTER} \\ % \mpifunc{MPI\_\-SCATTERV} & \mpifunc{MPI\_\-BARRIER} & ~ \\ \hline \end{tabular} \caption{Supported MPI-2 intercommunicator collective functions.} \label{tbl:mpi-details-intercomm-collective-functions} \end{table} \changeend{7.1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{External Interfaces} The external interfaces chapter lists several different major topics. Open MPI's support for these topics is summarized in Table~\ref{tbl:mpi-details-ext-int-summary}, and the exact list of functions that are supported is listed in~\ref{tbl:mpi-details-ext-int-functions}. \begin{table}[htbp] \centering \begin{tabular}{|c|p{3in}|} \hline \multicolumn{1}{|c|}{Supported} & \multicolumn{1}{|c|}{Description} \\ \hline \hline % \supportno & Generalized requests \\ % \supportno & Associating information with \mpitype{MPI\_\-Status} \\ % \supportyes & Naming objects \\ % \supportno & Error classes \\ \supportno & Error codes \\ \supportyes & Error handlers \\ % \supportyes & Decoding a datatype \\ % \supportyes & MPI and threads \\ % \supportyes & New attribute caching functions \\ % \supportyes & Duplicating a datatype \\ \hline \end{tabular} \caption{Major topics in the MPI-2 chapter ``External Interfaces'', and Open MPI's level of support.} \label{tbl:mpi-details-ext-int-summary} \end{table} \begin{table}[htbp] \centering \begin{tabular*}{\textwidth}{llllll|} \hline \multicolumn{6}{|c|}{Supported Functions} \\ \hline \hline \multicolumn{2}{|l|}{\mpifunc{MPI\_\-COMM\_\-SET\_\-NAME}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-TYPE\_\-SET\_\-NAME}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-WIN\_\-SET\_\-NAME}} \\ % \multicolumn{2}{|l|}{\mpifunc{MPI\_\-COMM\_\-GET\_\-NAME}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-TYPE\_\-GET\_\-NAME}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-WIN\_\-GET\_\-NAME}} \\ % \hline % \hline \multicolumn{3}{|l|}{\mpifunc{MPI\_\-COMM\_\-CREATE\_\-ERRHANDLER}} & \multicolumn{3}{|l|}{\mpifunc{MPI\_\-WIN\_\-CREATE\_\-ERRHANDLER}} \\ % \multicolumn{3}{|l|}{\mpifunc{MPI\_\-COMM\_\-GET\_\-ERRHANDLER}} & \multicolumn{3}{|l|}{\mpifunc{MPI\_\-WIN\_\-GET\_\-ERRHANDLER}} \\ % \multicolumn{3}{|l|}{\mpifunc{MPI\_\-COMM\_\-SET\_\-ERRHANDLER}} & \multicolumn{3}{|l|}{\mpifunc{MPI\_\-WIN\_\-SET\_\-ERRHANDLER}} \\ % \hline % \hline \multicolumn{3}{|l|}{\mpifunc{MPI\_\-TYPE\_\-GET\_\-CONTENTS}} & \multicolumn{3}{|l|}{\mpifunc{MPI\_\-INIT\_\-THREAD}} \\ % \multicolumn{3}{|l|}{\mpifunc{MPI\_\-TYPE\_\-GET\_\-ENVELOPE}} & \multicolumn{3}{|l|}{\mpifunc{MPI\_\-QUERY\_\-THREAD}} \\ % \multicolumn{3}{|l|}{\mpifunc{MPI\_\-TYPE\_\-GET\_\-EXTENT}} & \multicolumn{3}{|l|}{\mpifunc{MPI\_\-IS\_\-THREAD\_\-MAIN}} \\ % \multicolumn{3}{|l|}{\mpifunc{MPI\_\-TYPE\_\-GET\_\-TRUE\_\-EXTENT}} & \multicolumn{3}{|l|}{\mpifunc{MPI\_\-TYPE\_\-DUP}} \\ % \hline % \hline \multicolumn{2}{|l|}{\mpifunc{MPI\_\-COMM\_\-CREATE\_\-KEYVAL}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-TYPE\_\-CREATE\_\-KEYVAL}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-WIN\_\-CREATE\_\-KEYVAL}} \\ % \multicolumn{2}{|l|}{\mpifunc{MPI\_\-COMM\_\-FREE\_\-KEYVAL}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-TYPE\_\-FREE\_\-KEYVAL}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-WIN\_\-FREE\_\-KEYVAL}} \\ % \multicolumn{2}{|l|}{\mpifunc{MPI\_\-COMM\_\-DELETE\_\-ATTR}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-TYPE\_\-DELETE\_\-ATTR}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-WIN\_\-DELETE\_\-ATTR}} \\ % \multicolumn{2}{|l|}{\mpifunc{MPI\_\-COMM\_\-GET\_\-ATTR}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-TYPE\_\-GET\_\-ATTR}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-WIN\_\-GET\_\-ATTR}} \\ % \multicolumn{2}{|l|}{\mpifunc{MPI\_\-COMM\_\-SET\_\-ATTR}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-TYPE\_\-SET\_\-ATTR}} & \multicolumn{2}{|l|}{\mpifunc{MPI\_\-WIN\_\-SET\_\-ATTR}} \\ % \hline \end{tabular*} \caption{Supported MPI-2 external interface functions, grouped by function.} \label{tbl:mpi-details-ext-int-functions} \end{table} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{I/O} MPI-IO support is provided by including the ROMIO package from Argonne National Labs,\footnote{\url{http://www.mcs.anl.gov/romio/}} version 1.2.5.1. % The Open MPI wrapper compilers (\icmd{mpicc}, \icmd{mpiCC}/\icmd{mpic++}, and \icmd{mpif77}) will automatically provide all the necessary flags to compile and link programs that use ROMIO function calls. Although the ROMIO group at Argonne has included support for Open MPI in their package, there are still a small number of things that the Open MPI Team had to do to make ROMIO compile and install properly with Open MPI. As such, if you try to install the ROMIO package manually with Open MPI, you will experience some difficulties. There are some important limitations to ROMIO that are discussed in the \file{romio/README} file. % One limitation that is not currently listed in the ROMIO README file is that atomic file access will not work with AFS. This is because of file locking problems with AFS (i.e., AFS iteself does not support file locking). The ROMIO test program \cmd{atomicity} will fail if you specify an output file on AFS. Additionally, ROMIO does not support the following Open MPI functionality: \begin{itemize} \item Open MPI MPI-2 datatypes cannot be used with ROMIO; ROMIO makes the fundamental assumption that MPI-2 datatypes are built upon MPI-1 datatypes. Open MPI builds MPI-2 datatypes natively -- ROMIO cannot presently handle this case. This will hopefully be fixed in some future release of ROMIO. The ROMIO test programs \cmd{coll\_\-test}, \cmd{fcoll\_\-test}, \cmd{large\_\-array}, and \cmd{coll\_\-perf} will fail because they use the MPI-2 datatype \mpidatatype{MPI\_\-DARRAY}. \end{itemize} Please see the sections ``ROMIO Users Mailing List'' and ``Reporting Bugs'' in \file{romio/README} for how to submit questions and bug reports about ROMIO (that do not specifically pertain to Open MPI). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{Language Bindings} Open MPI provides C, C++, and Fortran 77 bindings for all supported MPI-2 functions, types, and constants. Open MPI does not provide a Fortran 90 module. % However, it is possible to use the Fortran 77 bindings with a Fortran 90 compiler by specifying the F90 compiler as your Fortran compiler when configuring/compiling Open MPI. See the Open MPI Installation Guide~\cite{lamteam03:_lam_mpi_install_guide} for more details. The C++ bindings include support for the C++ only \mpitype{MPI::BOOL}, \mpitype{MPI::COMPLEX}, \mpitype{MPI::DOUBLE\_\-COMPLEX}, and \mpitype{MPI::LONG\_\-DOUBLE\_\-COMPLEX} datatypes. Note that there are some issues with using MPI and Fortran 90 together. See the F90 / C++ chapter in the MPI-2 standard~\cite{geist96:_mpi2_lyon} for more information on using MPI with Fortran 90. As mentioned in Section~\ref{sec:mpi-details-mpi1-language}, profiling support is available in all three languages (if Open MPI was compiled with profiling support). The \icmd{ompi\_info} command can be used to see if profiling support was included in Open MPI.