update mpich linux

This commit is contained in:
Bassem Girgis
2019-08-10 18:46:24 -05:00
parent fd76cc3a51
commit 9b1ac8cf33
867 changed files with 11634 additions and 13950 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
#! /bin/bash
#! /usr/bin/bash
#
# (C) 2006 by Argonne National Laboratory.
# See COPYRIGHT in top-level directory.
@@ -27,17 +27,17 @@
#
# Directory locations: Fixed for any MPI implementation.
# Set from the directory arguments to configure (e.g., --prefix=/usr/local)
prefix=/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install
exec_prefix=/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install
sysconfdir=/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install/etc
includedir=/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install/include
libdir=/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install/lib64
prefix=/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1
exec_prefix=/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1
sysconfdir=/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1/etc
includedir=/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1/include
libdir=/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1/lib64
# Default settings for compiler, flags, and libraries.
# Determined by a combination of environment variables and tests within
# configure (e.g., determining whehter -lsocket is needee)
CC="gcc"
MPICH_VERSION="3.2.1"
MPICH_VERSION="3.3.1"
enable_wrapper_rpath="yes"
@@ -117,6 +117,7 @@ linking=yes
allargs=("$@")
argno=0
interlib_deps=yes
static_mpi=no
for arg in "$@" ; do
# Set addarg to no if this arg should be ignored by the C compiler
addarg=yes
@@ -133,6 +134,11 @@ for arg in "$@" ; do
-static)
interlib_deps=no
;;
-static-mpi)
interlib_deps=no
static_mpi=yes
addarg=no
;;
-echo)
addarg=no
set -x
@@ -244,7 +250,7 @@ final_ldflags=" "
final_libs=""
if test "yes" = "no" -o "${interlib_deps}" = "no" ; then
final_ldflags="${final_ldflags} "
final_libs="${final_libs} -lpthread -lrt -lpthread "
final_libs="${final_libs} -lm -lpthread -lrt "
fi
# -----------------------------------------------------------------------
@@ -275,7 +281,20 @@ if [ "$linking" = yes ] ; then
$Show $CC ${final_cppflags} $PROFILE_INCPATHS ${final_cflags} ${final_ldflags} "${allargs[@]}" -I$includedir
rc=$?
else
if [ "$static_mpi" = no ] ; then
$Show $CC ${final_cppflags} $PROFILE_INCPATHS ${final_cflags} ${final_ldflags} "${allargs[@]}" -I$includedir -L$libdir $PROFILE_PRELIB $PROFILE_FOO $rpath_flags -lmpi $PROFILE_POSTLIB ${final_libs}
else
fabric_dep=""
if [ "" = yes ] ; then
fabric_dep=`pkg-config --static --libs $libdir/pkgconfig/libfabric.pc`
fabric_dep=`echo $fabric_dep | sed 's/-lfabric//'`
elif [ -f /lib/pkgconfig/libfabric.pc ] ; then
fabric_dep=`pkg-config --static --libs /lib/pkgconfig/libfabric.pc`
else
fabric_dep=`pkg-config --static --libs libfabric`
fi
$Show $CC ${final_cppflags} $PROFILE_INCPATHS ${final_cflags} ${final_ldflags} "${allargs[@]}" -I$includedir -L$libdir $PROFILE_PRELIB $PROFILE_FOO $rpath_flags $libdir/libmpi.a $PROFILE_POSTLIB ${final_libs} ${fabric_dep}
fi
rc=$?
fi
else

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -12,6 +12,12 @@
#include "mpi.h"
#if defined(HAVE_VISIBILITY)
#define ROMIO_API_PUBLIC __attribute__((visibility ("default")))
#else
#define ROMIO_API_PUBLIC
#endif
#if defined(__cplusplus)
extern "C" {
#endif
@@ -24,7 +30,9 @@ extern "C" {
typedef struct ADIOI_FileD *MPI_File;
#endif
/* *INDENT-OFF* */
#define HAVE_MPI_GREQUEST 1
/* *INDENT-ON* */
#ifndef HAVE_MPI_GREQUEST
typedef struct ADIOI_RequestD *MPIO_Request;
#else
@@ -39,7 +47,9 @@ typedef struct ADIOI_RequestD *MPIO_Request;
#define MPIO_REQUEST_DEFINED
#ifndef HAVE_MPI_OFFSET
/* *INDENT-OFF* */
typedef long long MPI_Offset;
/* *INDENT-ON* */
/* If we needed to define MPI_Offset, then we also need to make
this definition. */
#ifndef HAVE_MPI_DATAREP_FUNCTIONS
@@ -52,14 +62,18 @@ typedef int (MPI_Datarep_extent_function)(MPI_Datatype datatype, MPI_Aint *,
#endif
#ifndef NEEDS_MPI_FINT
/* *INDENT-OFF* */
/* *INDENT-ON* */
#endif
#ifdef NEEDS_MPI_FINT
typedef int MPI_Fint;
#endif
#ifndef HAVE_MPI_INFO
/* *INDENT-OFF* */
#define HAVE_MPI_INFO
/* *INDENT-ON* */
#endif
#ifndef HAVE_MPI_INFO
typedef struct MPIR_Info *MPI_Info;
@@ -99,7 +113,9 @@ typedef int MPI_Fint;
#endif
#ifndef HAVE_MPI_DARRAY_SUBARRAY
/* *INDENT-OFF* */
#define HAVE_MPI_DARRAY_SUBARRAY
/* *INDENT-ON* */
#endif
#ifndef HAVE_MPI_DARRAY_SUBARRAY
# define MPI_ORDER_C 56
@@ -120,150 +136,150 @@ typedef int MPI_Fint;
/* Section 9.2 */
/* Begin Prototypes */
int MPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info, MPI_File *fh);
int MPI_File_close(MPI_File *fh);
int MPI_File_delete(const char *filename, MPI_Info info);
int MPI_File_set_size(MPI_File fh, MPI_Offset size);
int MPI_File_preallocate(MPI_File fh, MPI_Offset size);
int MPI_File_get_size(MPI_File fh, MPI_Offset *size);
int MPI_File_get_group(MPI_File fh, MPI_Group *group);
int MPI_File_get_amode(MPI_File fh, int *amode);
int MPI_File_set_info(MPI_File fh, MPI_Info info);
int MPI_File_get_info(MPI_File fh, MPI_Info *info_used);
int MPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info, MPI_File *fh) ROMIO_API_PUBLIC;
int MPI_File_close(MPI_File *fh) ROMIO_API_PUBLIC;
int MPI_File_delete(const char *filename, MPI_Info info) ROMIO_API_PUBLIC;
int MPI_File_set_size(MPI_File fh, MPI_Offset size) ROMIO_API_PUBLIC;
int MPI_File_preallocate(MPI_File fh, MPI_Offset size) ROMIO_API_PUBLIC;
int MPI_File_get_size(MPI_File fh, MPI_Offset *size) ROMIO_API_PUBLIC;
int MPI_File_get_group(MPI_File fh, MPI_Group *group) ROMIO_API_PUBLIC;
int MPI_File_get_amode(MPI_File fh, int *amode) ROMIO_API_PUBLIC;
int MPI_File_set_info(MPI_File fh, MPI_Info info) ROMIO_API_PUBLIC;
int MPI_File_get_info(MPI_File fh, MPI_Info *info_used) ROMIO_API_PUBLIC;
/* Section 9.3 */
int MPI_File_set_view(MPI_File fh, MPI_Offset disp, MPI_Datatype etype, MPI_Datatype filetype,
const char *datarep, MPI_Info info);
const char *datarep, MPI_Info info) ROMIO_API_PUBLIC;
int MPI_File_get_view(MPI_File fh, MPI_Offset *disp, MPI_Datatype *etype, MPI_Datatype *filetype,
char *datarep);
char *datarep) ROMIO_API_PUBLIC;
/* Section 9.4.2 */
int MPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void * buf, int count,
MPI_Datatype datatype, MPI_Status *status)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_write_at(MPI_File fh, MPI_Offset offset, const void * buf, int count,
MPI_Datatype datatype, MPI_Status *status)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_write_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,
MPI_Datatype datatype, MPI_Status *status)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
/* nonblocking calls currently use MPIO_Request, because generalized
requests not yet implemented. For the same reason, MPIO_Test and
MPIO_Wait are used to test and wait on nonblocking I/O requests */
int MPI_File_iread_at(MPI_File fh, MPI_Offset offset, void *buf, int count, MPI_Datatype datatype,
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_iwrite_at(MPI_File fh, MPI_Offset offset, const void *buf, int count,
MPI_Datatype datatype, MPIO_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
/* Section 9.4.3 */
int MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_read_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPI_Status *status)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_write(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_write_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
/* nonblocking calls currently use MPIO_Request, because generalized
requests not yet implemented. For the same reason, MPIO_Test and
MPIO_Wait are used to test and wait on nonblocking I/O requests */
int MPI_File_iread(MPI_File fh, void *buf, int count, MPI_Datatype datatype, MPIO_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_iwrite(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_seek(MPI_File fh, MPI_Offset offset, int whence);
int MPI_File_get_position(MPI_File fh, MPI_Offset *offset);
int MPI_File_get_byte_offset(MPI_File fh, MPI_Offset offset, MPI_Offset *disp);
int MPI_File_seek(MPI_File fh, MPI_Offset offset, int whence) ROMIO_API_PUBLIC;
int MPI_File_get_position(MPI_File fh, MPI_Offset *offset) ROMIO_API_PUBLIC;
int MPI_File_get_byte_offset(MPI_File fh, MPI_Offset offset, MPI_Offset *disp) ROMIO_API_PUBLIC;
/* Section 9.4.4 */
int MPI_File_read_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_write_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_iread_shared(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_iwrite_shared(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPIO_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_read_ordered(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_write_ordered(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int MPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence);
int MPI_File_get_position_shared(MPI_File fh, MPI_Offset *offset);
MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence) ROMIO_API_PUBLIC;
int MPI_File_get_position_shared(MPI_File fh, MPI_Offset *offset) ROMIO_API_PUBLIC;
/* Section 9.4.5 */
int MPI_File_read_at_all_begin(MPI_File fh, MPI_Offset offset, void *buf, int count,
MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
int MPI_File_read_at_all_end(MPI_File fh, void *buf, MPI_Status *status);
MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_read_at_all_end(MPI_File fh, void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
int MPI_File_write_at_all_begin(MPI_File fh, MPI_Offset offset, const void *buf, int count,
MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
int MPI_File_write_at_all_end(MPI_File fh, const void *buf, MPI_Status *status);
MPI_Datatype datatype) MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_write_at_all_end(MPI_File fh, const void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
int MPI_File_read_all_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int MPI_File_read_all_end(MPI_File fh, void *buf, MPI_Status *status);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_read_all_end(MPI_File fh, void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
int MPI_File_write_all_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int MPI_File_write_all_end(MPI_File fh, const void *buf, MPI_Status *status);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_write_all_end(MPI_File fh, const void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
int MPI_File_read_ordered_begin(MPI_File fh, void *buf, int count, MPI_Datatype datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int MPI_File_read_ordered_end(MPI_File fh, void *buf, MPI_Status *status);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_read_ordered_end(MPI_File fh, void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
int MPI_File_write_ordered_begin(MPI_File fh, const void *buf, int count, MPI_Datatype datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int MPI_File_write_ordered_end(MPI_File fh, const void *buf, MPI_Status *status);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_write_ordered_end(MPI_File fh, const void *buf, MPI_Status *status) ROMIO_API_PUBLIC;
/* Section 9.5.1 */
int MPI_File_get_type_extent(MPI_File fh, MPI_Datatype datatype, MPI_Aint *extent);
int MPI_File_get_type_extent(MPI_File fh, MPI_Datatype datatype, MPI_Aint *extent) ROMIO_API_PUBLIC;
/* Section 9.5.3 */
int MPI_Register_datarep(const char *datarep, MPI_Datarep_conversion_function *read_conversion_fn,
MPI_Datarep_conversion_function *write_conversion_fn,
MPI_Datarep_extent_function *dtype_file_extent_fn, void *extra_state);
MPI_Datarep_extent_function *dtype_file_extent_fn, void *extra_state) ROMIO_API_PUBLIC;
/* Section 9.6.1 */
int MPI_File_set_atomicity(MPI_File fh, int flag);
int MPI_File_get_atomicity(MPI_File fh, int *flag);
int MPI_File_sync(MPI_File fh);
int MPI_File_set_atomicity(MPI_File fh, int flag) ROMIO_API_PUBLIC;
int MPI_File_get_atomicity(MPI_File fh, int *flag) ROMIO_API_PUBLIC;
int MPI_File_sync(MPI_File fh) ROMIO_API_PUBLIC;
/* Section 4.13.3 */
#ifndef MPICH
/* MPICH provides these definitions */
int MPI_File_set_errhandler(MPI_File file, MPI_Errhandler errhandler);
int MPI_File_get_errhandler(MPI_File file, MPI_Errhandler *errhandler);
int MPI_File_set_errhandler(MPI_File file, MPI_Errhandler errhandler) ROMIO_API_PUBLIC;
int MPI_File_get_errhandler(MPI_File file, MPI_Errhandler *errhandler) ROMIO_API_PUBLIC;
#endif
/* For MPI 3.1 */
int MPI_File_iread_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,
MPI_Datatype datatype, MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_iwrite_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,
MPI_Datatype datatype, MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int MPI_File_iread_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int MPI_File_iwrite_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
/* End Prototypes */
#ifndef HAVE_MPI_DARRAY_SUBARRAY
/* Section 4.14.4 */
int MPI_Type_create_subarray(int ndims, const int array_of_sizes[], const int array_of_subsizes[],
const int array_of_starts[], int order, MPI_Datatype oldtype,
MPI_Datatype *newtype);
MPI_Datatype *newtype) ROMIO_API_PUBLIC;
/* Section 4.14.5 */
int MPI_Type_create_darray(int size, int rank, int ndims, const int array_of_gsizes[],
const int array_of_distribs[], const int array_of_dargs[],
const int array_of_psizes, int order, MPI_Datatype oldtype,
MPI_Datatype *newtype);
MPI_Datatype *newtype) ROMIO_API_PUBLIC;
#endif
/* The globus2 device has to rename MPI_ symbols in order to use the vendor
@@ -279,43 +295,43 @@ int MPI_Type_create_darray(int size, int rank, int ndims, const int array_of_gsi
#endif
#endif
/* above needed for some versions of mpi.h in MPICH!! */
MPI_File MPI_File_f2c(MPI_Fint file);
MPI_Fint MPI_File_c2f(MPI_File file);
MPI_File MPI_File_f2c(MPI_Fint file) ROMIO_API_PUBLIC;
MPI_Fint MPI_File_c2f(MPI_File file) ROMIO_API_PUBLIC;
#ifndef HAVE_MPI_GREQUEST
/* The following functions are required if generalized requests are not
available, because in that case, an MPIO_Request object
is currently used for nonblocking I/O. */
int MPIO_Test(MPIO_Request *request, int *flag, MPI_Status *status);
int MPIO_Wait(MPIO_Request *request, MPI_Status *status);
int MPIO_Test(MPIO_Request *request, int *flag, MPI_Status *status) ROMIO_API_PUBLIC;
int MPIO_Wait(MPIO_Request *request, MPI_Status *status) ROMIO_API_PUBLIC;
int MPIO_Testall(int count, MPIO_Request array_of_requests[], int *flag,
MPI_Status array_of_statuses[]);
int MPIO_Waitall(int count, MPIO_Request array_of_requests[], MPI_Status array_of_statuses[]);
MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
int MPIO_Waitall(int count, MPIO_Request array_of_requests[], MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
int MPIO_Testany(int count, MPIO_Request array_of_requests[], int *indx, int *flag,
MPI_Status *status);
int MPIO_Waitany(int count, MPIO_Request array_of_requests[], int *indx, MPI_Status *status);
MPI_Status *status) ROMIO_API_PUBLIC;
int MPIO_Waitany(int count, MPIO_Request array_of_requests[], int *indx, MPI_Status *status) ROMIO_API_PUBLIC;
int MPIO_Waitsome(int incount, MPIO_Request array_of_requests[], int *outcount,
int array_of_indices[], MPI_Status array_of_statuses[]);
int array_of_indices[], MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
int MPIO_Testsome(int incount, MPIO_Request array_of_requests[], int *outcount,
int array_of_indices[], MPI_Status array_of_statuses[]);
int array_of_indices[], MPI_Status array_of_statuses[]) ROMIO_API_PUBLIC;
MPI_Fint MPIO_Request_c2f(MPIO_Request request);
MPIO_Request MPIO_Request_f2c(MPI_Fint request);
MPI_Fint MPIO_Request_c2f(MPIO_Request request) ROMIO_API_PUBLIC;
MPIO_Request MPIO_Request_f2c(MPI_Fint request) ROMIO_API_PUBLIC;
#endif /* HAVE_MPI_GREQUEST */
/* info functions if not defined in the MPI implementation */
#ifndef HAVE_MPI_INFO
int MPI_Info_create(MPI_Info *info);
int MPI_Info_set(MPI_Info info, const char *key, const char *value);
int MPI_Info_delete(MPI_Info info, const char *key);
int MPI_Info_get(MPI_Info info, const char *key, int valuelen, char *value, int *flag);
int MPI_Info_get_valuelen(MPI_Info info, const char *key, int *valuelen, int *flag);
int MPI_Info_get_nkeys(MPI_Info info, int *nkeys);
int MPI_Info_get_nthkey(MPI_Info info, int n, char *key);
int MPI_Info_dup(MPI_Info info, MPI_Info *newinfo);
int MPI_Info_free(MPI_Info *info);
int MPI_Info_create(MPI_Info *info) ROMIO_API_PUBLIC;
int MPI_Info_set(MPI_Info info, const char *key, const char *value) ROMIO_API_PUBLIC;
int MPI_Info_delete(MPI_Info info, const char *key) ROMIO_API_PUBLIC;
int MPI_Info_get(MPI_Info info, const char *key, int valuelen, char *value, int *flag) ROMIO_API_PUBLIC;
int MPI_Info_get_valuelen(MPI_Info info, const char *key, int *valuelen, int *flag) ROMIO_API_PUBLIC;
int MPI_Info_get_nkeys(MPI_Info info, int *nkeys) ROMIO_API_PUBLIC;
int MPI_Info_get_nthkey(MPI_Info info, int n, char *key) ROMIO_API_PUBLIC;
int MPI_Info_dup(MPI_Info info, MPI_Info *newinfo) ROMIO_API_PUBLIC;
int MPI_Info_free(MPI_Info *info) ROMIO_API_PUBLIC;
/* The globus2 device has to rename MPI_ symbols in order to use the vendor
MPI as one of its transport mechanisms. Therefore, the following undefines
@@ -329,8 +345,8 @@ int MPI_Info_free(MPI_Info *info);
#endif
#endif
/* above needed for some versions of mpi.h in MPICH!! */
MPI_Fint MPI_Info_c2f(MPI_Info info);
MPI_Info MPI_Info_f2c(MPI_Fint info);
MPI_Fint MPI_Info_c2f(MPI_Info info) ROMIO_API_PUBLIC;
MPI_Info MPI_Info_f2c(MPI_Fint info) ROMIO_API_PUBLIC;
#endif
#endif /* HAVE_PRAGMA_HP_SEC_DEF */
@@ -340,36 +356,36 @@ MPI_Info MPI_Info_f2c(MPI_Fint info);
/* Section 9.2 */
int PMPI_File_open(MPI_Comm, const char *, int, MPI_Info, MPI_File *);
int PMPI_File_close(MPI_File *);
int PMPI_File_delete(const char *, MPI_Info);
int PMPI_File_set_size(MPI_File, MPI_Offset);
int PMPI_File_preallocate(MPI_File, MPI_Offset);
int PMPI_File_get_size(MPI_File, MPI_Offset *);
int PMPI_File_get_group(MPI_File, MPI_Group *);
int PMPI_File_get_amode(MPI_File, int *);
int PMPI_File_set_info(MPI_File, MPI_Info);
int PMPI_File_get_info(MPI_File, MPI_Info *);
int PMPI_File_open(MPI_Comm, const char *, int, MPI_Info, MPI_File *) ROMIO_API_PUBLIC;
int PMPI_File_close(MPI_File *) ROMIO_API_PUBLIC;
int PMPI_File_delete(const char *, MPI_Info) ROMIO_API_PUBLIC;
int PMPI_File_set_size(MPI_File, MPI_Offset) ROMIO_API_PUBLIC;
int PMPI_File_preallocate(MPI_File, MPI_Offset) ROMIO_API_PUBLIC;
int PMPI_File_get_size(MPI_File, MPI_Offset *) ROMIO_API_PUBLIC;
int PMPI_File_get_group(MPI_File, MPI_Group *) ROMIO_API_PUBLIC;
int PMPI_File_get_amode(MPI_File, int *) ROMIO_API_PUBLIC;
int PMPI_File_set_info(MPI_File, MPI_Info) ROMIO_API_PUBLIC;
int PMPI_File_get_info(MPI_File, MPI_Info *) ROMIO_API_PUBLIC;
/* Section 9.3 */
int PMPI_File_set_view(MPI_File, MPI_Offset,
MPI_Datatype, MPI_Datatype, const char *, MPI_Info);
MPI_Datatype, MPI_Datatype, const char *, MPI_Info) ROMIO_API_PUBLIC;
int PMPI_File_get_view(MPI_File, MPI_Offset *,
MPI_Datatype *, MPI_Datatype *, char *);
MPI_Datatype *, MPI_Datatype *, char *) ROMIO_API_PUBLIC;
/* Section 9.4.2 */
int PMPI_File_read_at(MPI_File, MPI_Offset, void *,
int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_read_at_all(MPI_File, MPI_Offset, void *,
int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_write_at(MPI_File, MPI_Offset, const void *,
int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_write_at_all(MPI_File, MPI_Offset, const void *,
int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
/* nonblocking calls currently use MPIO_Request, because generalized
requests not yet implemented. For the same reason, MPIO_Test and
@@ -377,155 +393,155 @@ int PMPI_File_write_at_all(MPI_File, MPI_Offset, const void *,
int PMPI_File_iread_at(MPI_File, MPI_Offset, void *,
int, MPI_Datatype, MPIO_Request *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_iwrite_at(MPI_File, MPI_Offset, const void *,
int, MPI_Datatype, MPIO_Request *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
/* Section 9.4.3 */
int PMPI_File_read(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_read_all(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_write(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_write_all(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
/* nonblocking calls currently use MPIO_Request, because generalized
requests not yet implemented. For the same reason, MPIO_Test and
MPIO_Wait are used to test and wait on nonblocking I/O requests */
int PMPI_File_iread(MPI_File, void *, int, MPI_Datatype, MPIO_Request *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_iwrite(MPI_File, const void *, int, MPI_Datatype, MPIO_Request *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_seek(MPI_File, MPI_Offset, int);
int PMPI_File_get_position(MPI_File, MPI_Offset *);
int PMPI_File_get_byte_offset(MPI_File, MPI_Offset, MPI_Offset *);
int PMPI_File_seek(MPI_File, MPI_Offset, int) ROMIO_API_PUBLIC;
int PMPI_File_get_position(MPI_File, MPI_Offset *) ROMIO_API_PUBLIC;
int PMPI_File_get_byte_offset(MPI_File, MPI_Offset, MPI_Offset *) ROMIO_API_PUBLIC;
/* Section 9.4.4 */
int PMPI_File_read_shared(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_write_shared(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_iread_shared(MPI_File, void *, int,
MPI_Datatype, MPIO_Request *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_iwrite_shared(MPI_File, const void *, int,
MPI_Datatype, MPIO_Request *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_read_ordered(MPI_File, void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_write_ordered(MPI_File, const void *, int, MPI_Datatype, MPI_Status *)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int PMPI_File_seek_shared(MPI_File, MPI_Offset, int);
int PMPI_File_get_position_shared(MPI_File, MPI_Offset *);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_seek_shared(MPI_File, MPI_Offset, int) ROMIO_API_PUBLIC;
int PMPI_File_get_position_shared(MPI_File, MPI_Offset *) ROMIO_API_PUBLIC;
/* Section 9.4.5 */
int PMPI_File_read_at_all_begin(MPI_File, MPI_Offset, void *,
int, MPI_Datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
int PMPI_File_read_at_all_end(MPI_File, void *, MPI_Status *);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_read_at_all_end(MPI_File, void *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPI_File_write_at_all_begin(MPI_File, MPI_Offset, const void *,
int, MPI_Datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
int PMPI_File_write_at_all_end(MPI_File, const void *, MPI_Status *);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_write_at_all_end(MPI_File, const void *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPI_File_read_all_begin(MPI_File, void *, int, MPI_Datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int PMPI_File_read_all_end(MPI_File, void *, MPI_Status *);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_read_all_end(MPI_File, void *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPI_File_write_all_begin(MPI_File, const void *, int, MPI_Datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int PMPI_File_write_all_end(MPI_File, const void *, MPI_Status *);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_write_all_end(MPI_File, const void *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPI_File_read_ordered_begin(MPI_File, void *, int, MPI_Datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int PMPI_File_read_ordered_end(MPI_File, void *, MPI_Status *);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_read_ordered_end(MPI_File, void *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPI_File_write_ordered_begin(MPI_File, const void *, int, MPI_Datatype)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
int PMPI_File_write_ordered_end(MPI_File, const void *, MPI_Status *);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_write_ordered_end(MPI_File, const void *, MPI_Status *) ROMIO_API_PUBLIC;
/* Section 9.5.1 */
int PMPI_File_get_type_extent(MPI_File, MPI_Datatype, MPI_Aint *);
int PMPI_File_get_type_extent(MPI_File, MPI_Datatype, MPI_Aint *) ROMIO_API_PUBLIC;
/* Section 9.5.3 */
int PMPI_Register_datarep(const char *,
MPI_Datarep_conversion_function *,
MPI_Datarep_conversion_function *,
MPI_Datarep_extent_function *,
void *);
void *) ROMIO_API_PUBLIC;
/* Section 9.6.1 */
int PMPI_File_set_atomicity(MPI_File, int);
int PMPI_File_get_atomicity(MPI_File, int *);
int PMPI_File_sync(MPI_File);
int PMPI_File_set_atomicity(MPI_File, int) ROMIO_API_PUBLIC;
int PMPI_File_get_atomicity(MPI_File, int *) ROMIO_API_PUBLIC;
int PMPI_File_sync(MPI_File) ROMIO_API_PUBLIC;
/* Section 4.13.3 */
#ifndef MPICH
/* MPICH provides these definitions */
int PMPI_File_set_errhandler( MPI_File, MPI_Errhandler );
int PMPI_File_get_errhandler( MPI_File, MPI_Errhandler * );
int PMPI_File_set_errhandler( MPI_File, MPI_Errhandler ) ROMIO_API_PUBLIC;
int PMPI_File_get_errhandler( MPI_File, MPI_Errhandler * ) ROMIO_API_PUBLIC;
#endif
/* For MPI 3.1 */
int PMPI_File_iread_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,
MPI_Datatype datatype, MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_iwrite_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,
MPI_Datatype datatype, MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,5) ROMIO_API_PUBLIC;
int PMPI_File_iread_all(MPI_File fh, void *buf, int count, MPI_Datatype datatype,
MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
int PMPI_File_iwrite_all(MPI_File fh, const void *buf, int count, MPI_Datatype datatype,
MPI_Request *request)
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4) ROMIO_API_PUBLIC;
#ifndef HAVE_MPI_DARRAY_SUBARRAY
/* Section 4.14.4 */
int PMPI_Type_create_subarray(int, int *, int *, int *, int,
MPI_Datatype, MPI_Datatype *);
MPI_Datatype, MPI_Datatype *) ROMIO_API_PUBLIC;
/* Section 4.14.5 */
int PMPI_Type_create_darray(int, int, int, int *, int *,
int *, int *, int, MPI_Datatype, MPI_Datatype *);
int *, int *, int, MPI_Datatype, MPI_Datatype *) ROMIO_API_PUBLIC;
#endif
/* Section 4.12.4 */
MPI_File PMPI_File_f2c(MPI_Fint);
MPI_Fint PMPI_File_c2f(MPI_File);
MPI_File PMPI_File_f2c(MPI_Fint) ROMIO_API_PUBLIC;
MPI_Fint PMPI_File_c2f(MPI_File) ROMIO_API_PUBLIC;
#ifndef HAVE_MPI_GREQUEST
/* The following functions are required if generalized requests are not
available, because in that case, an MPIO_Request object
is currently used for nonblocking I/O. */
int PMPIO_Test(MPIO_Request *, int *, MPI_Status *);
int PMPIO_Wait(MPIO_Request *, MPI_Status *);
int PMPIO_Testall(int, MPIO_Request *, int *, MPI_Status *);
int PMPIO_Waitall(int, MPIO_Request *, MPI_Status *);
int PMPIO_Testany(int, MPIO_Request *, int *, int *, MPI_Status *);
int PMPIO_Waitany(int, MPIO_Request *, int *, MPI_Status *);
int PMPIO_Waitsome(int, MPIO_Request *, int *, int *, MPI_Status *);
int PMPIO_Testsome(int, MPIO_Request *, int *, int *, MPI_Status *);
MPI_Fint PMPIO_Request_c2f(MPIO_Request);
MPIO_Request PMPIO_Request_f2c(MPI_Fint);
int PMPIO_Test(MPIO_Request *, int *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPIO_Wait(MPIO_Request *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPIO_Testall(int, MPIO_Request *, int *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPIO_Waitall(int, MPIO_Request *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPIO_Testany(int, MPIO_Request *, int *, int *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPIO_Waitany(int, MPIO_Request *, int *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPIO_Waitsome(int, MPIO_Request *, int *, int *, MPI_Status *) ROMIO_API_PUBLIC;
int PMPIO_Testsome(int, MPIO_Request *, int *, int *, MPI_Status *) ROMIO_API_PUBLIC;
MPI_Fint PMPIO_Request_c2f(MPIO_Request) ROMIO_API_PUBLIC;
MPIO_Request PMPIO_Request_f2c(MPI_Fint) ROMIO_API_PUBLIC;
#endif /* HAVE_MPI_GREQUEST */
/* info functions if not defined in the MPI implementation */
#ifndef HAVE_MPI_INFO
int PMPI_Info_create(MPI_Info *);
int PMPI_Info_set(MPI_Info, char *, char *);
int PMPI_Info_delete(MPI_Info, char *);
int PMPI_Info_get(MPI_Info, char *, int, char *, int *);
int PMPI_Info_get_valuelen(MPI_Info, char *, int *, int *);
int PMPI_Info_get_nkeys(MPI_Info, int *);
int PMPI_Info_get_nthkey(MPI_Info, int, char *);
int PMPI_Info_dup(MPI_Info, MPI_Info *);
int PMPI_Info_free(MPI_Info *);
int PMPI_Info_create(MPI_Info *) ROMIO_API_PUBLIC;
int PMPI_Info_set(MPI_Info, char *, char *) ROMIO_API_PUBLIC;
int PMPI_Info_delete(MPI_Info, char *) ROMIO_API_PUBLIC;
int PMPI_Info_get(MPI_Info, char *, int, char *, int *) ROMIO_API_PUBLIC;
int PMPI_Info_get_valuelen(MPI_Info, char *, int *, int *) ROMIO_API_PUBLIC;
int PMPI_Info_get_nkeys(MPI_Info, int *) ROMIO_API_PUBLIC;
int PMPI_Info_get_nthkey(MPI_Info, int, char *) ROMIO_API_PUBLIC;
int PMPI_Info_dup(MPI_Info, MPI_Info *) ROMIO_API_PUBLIC;
int PMPI_Info_free(MPI_Info *) ROMIO_API_PUBLIC;
MPI_Fint PMPI_Info_c2f(MPI_Info);
MPI_Info PMPI_Info_f2c(MPI_Fint);
MPI_Fint PMPI_Info_c2f(MPI_Info) ROMIO_API_PUBLIC;
MPI_Info PMPI_Info_f2c(MPI_Fint) ROMIO_API_PUBLIC;
#endif
#if defined(__cplusplus)

View File

@@ -1,241 +0,0 @@
#ifndef _SRC_OPA_CONFIG_H
#define _SRC_OPA_CONFIG_H 1
/* src/opa_config.h. Generated automatically at end of configure. */
/* src/config.h. Generated from config.h.in by configure. */
/* src/config.h.in. Generated from configure.ac by autoheader. */
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* define if lock-based emulation was explicitly requested at configure time
via --with-atomic-primitives=no */
/* #undef EXPLICIT_EMULATION */
/* Define to 1 if you have the <atomic.h> header file. */
/* #undef HAVE_ATOMIC_H */
/* Define to 1 if you have the <dlfcn.h> header file. */
#ifndef OPA_HAVE_DLFCN_H
#define OPA_HAVE_DLFCN_H 1
#endif
/* define to 1 if we have support for gcc ARM atomics */
/* #undef HAVE_GCC_AND_ARM_ASM */
/* define to 1 if we have support for gcc ia64 primitives */
/* #undef HAVE_GCC_AND_IA64_ASM */
/* define to 1 if we have support for gcc PowerPC atomics */
/* #undef HAVE_GCC_AND_POWERPC_ASM */
/* define to 1 if we have support for gcc SiCortex atomics */
/* #undef HAVE_GCC_AND_SICORTEX_ASM */
/* Define if GNU __attribute__ is supported */
#ifndef OPA_HAVE_GCC_ATTRIBUTE
#define OPA_HAVE_GCC_ATTRIBUTE 1
#endif
/* define to 1 if we have support for gcc atomic intrinsics */
#ifndef OPA_HAVE_GCC_INTRINSIC_ATOMICS
#define OPA_HAVE_GCC_INTRINSIC_ATOMICS 1
#endif
/* define to 1 if we have support for gcc x86/x86_64 primitives */
#ifndef OPA_HAVE_GCC_X86_32_64
#define OPA_HAVE_GCC_X86_32_64 1
#endif
/* define to 1 if we have support for gcc x86 primitives for pre-Pentium 4 */
#ifndef OPA_HAVE_GCC_X86_32_64_P3
#define OPA_HAVE_GCC_X86_32_64_P3 1
#endif
/* Define to 1 if you have the <intrin.h> header file. */
/* #undef HAVE_INTRIN_H */
/* Define to 1 if you have the <inttypes.h> header file. */
#ifndef OPA_HAVE_INTTYPES_H
#define OPA_HAVE_INTTYPES_H 1
#endif
/* Define to 1 if you have the `pthread' library (-lpthread). */
#ifndef OPA_HAVE_LIBPTHREAD
#define OPA_HAVE_LIBPTHREAD 1
#endif
/* Define to 1 if you have the <memory.h> header file. */
#ifndef OPA_HAVE_MEMORY_H
#define OPA_HAVE_MEMORY_H 1
#endif
/* define to 1 if we have support for Windows NT atomic intrinsics */
/* #undef HAVE_NT_INTRINSICS */
/* Define to 1 if you have the <pthread.h> header file. */
#ifndef OPA_HAVE_PTHREAD_H
#define OPA_HAVE_PTHREAD_H 1
#endif
/* Define to 1 if you have the `pthread_yield' function. */
#ifndef OPA_HAVE_PTHREAD_YIELD
#define OPA_HAVE_PTHREAD_YIELD 1
#endif
/* Define to 1 if you have the `sched_yield' function. */
/* #undef HAVE_SCHED_YIELD */
/* Define to 1 if you have the <stddef.h> header file. */
#ifndef OPA_HAVE_STDDEF_H
#define OPA_HAVE_STDDEF_H 1
#endif
/* Define to 1 if you have the <stdint.h> header file. */
#ifndef OPA_HAVE_STDINT_H
#define OPA_HAVE_STDINT_H 1
#endif
/* Define to 1 if you have the <stdlib.h> header file. */
#ifndef OPA_HAVE_STDLIB_H
#define OPA_HAVE_STDLIB_H 1
#endif
/* Define if strict checking of atomic operation fairness is desired */
/* #undef HAVE_STRICT_FAIRNESS_CHECKS */
/* Define to 1 if you have the <strings.h> header file. */
#ifndef OPA_HAVE_STRINGS_H
#define OPA_HAVE_STRINGS_H 1
#endif
/* Define to 1 if you have the <string.h> header file. */
#ifndef OPA_HAVE_STRING_H
#define OPA_HAVE_STRING_H 1
#endif
/* define to 1 if we have support for Sun atomic operations library */
/* #undef HAVE_SUN_ATOMIC_OPS */
/* Define to 1 if you have the <sys/stat.h> header file. */
#ifndef OPA_HAVE_SYS_STAT_H
#define OPA_HAVE_SYS_STAT_H 1
#endif
/* Define to 1 if you have the <sys/types.h> header file. */
#ifndef OPA_HAVE_SYS_TYPES_H
#define OPA_HAVE_SYS_TYPES_H 1
#endif
/* Define to 1 if you have the <unistd.h> header file. */
#ifndef OPA_HAVE_UNISTD_H
#define OPA_HAVE_UNISTD_H 1
#endif
/* Define to the sub-directory where libtool stores uninstalled libraries. */
#ifndef OPA_LT_OBJDIR
#define OPA_LT_OBJDIR ".libs/"
#endif
/* define to the maximum number of simultaneous threads */
#ifndef OPA_MAX_NTHREADS
#define OPA_MAX_NTHREADS 100
#endif
/* Define to 1 if assertions should be disabled. */
/* #undef NDEBUG */
/* Name of package */
#ifndef OPA_PACKAGE
#define OPA_PACKAGE "openpa"
#endif
/* Define to the address where bug reports for this package should be sent. */
#ifndef OPA_PACKAGE_BUGREPORT
#define OPA_PACKAGE_BUGREPORT "https://trac.mcs.anl.gov/projects/openpa/newticket"
#endif
/* Define to the full name of this package. */
#ifndef OPA_PACKAGE_NAME
#define OPA_PACKAGE_NAME "OpenPA"
#endif
/* Define to the full name and version of this package. */
#ifndef OPA_PACKAGE_STRING
#define OPA_PACKAGE_STRING "OpenPA 1.0.3"
#endif
/* Define to the one symbol short name of this package. */
#ifndef OPA_PACKAGE_TARNAME
#define OPA_PACKAGE_TARNAME "openpa"
#endif
/* Define to the home page for this package. */
#ifndef OPA_PACKAGE_URL
#define OPA_PACKAGE_URL ""
#endif
/* Define to the version of this package. */
#ifndef OPA_PACKAGE_VERSION
#define OPA_PACKAGE_VERSION "1.0.3"
#endif
/* The size of `int', as computed by sizeof. */
#ifndef OPA_SIZEOF_INT
#define OPA_SIZEOF_INT 4
#endif
/* The size of `void *', as computed by sizeof. */
#ifndef OPA_SIZEOF_VOID_P
#define OPA_SIZEOF_VOID_P 8
#endif
/* Define to 1 if you have the ANSI C header files. */
#ifndef OPA_STDC_HEADERS
#define OPA_STDC_HEADERS 1
#endif
/* define to 1 to force using lock-based atomic primitives */
/* #undef USE_LOCK_BASED_PRIMITIVES */
/* define to 1 if unsafe (non-atomic) primitives should be used */
/* #undef USE_UNSAFE_PRIMITIVES */
/* Version number of package */
#ifndef OPA_VERSION
#define OPA_VERSION "1.0.3"
#endif
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
/* Define to the equivalent of the C99 'restrict' keyword, or to
nothing if this is not supported. Do not define if restrict is
supported directly. */
#ifndef _opa_restrict
#define _opa_restrict __restrict
#endif
/* Work around a bug in Sun C++: it does not support _Restrict or
__restrict__, even though the corresponding Sun C compiler ends up with
"#define restrict _Restrict" or "#define restrict __restrict__" in the
previous line. Perhaps some future version of Sun C++ will work with
restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
#if defined __SUNPRO_CC && !defined __RESTRICT
# define _Restrict
# define __restrict__
#endif
/* once: _SRC_OPA_CONFIG_H */
#endif

View File

@@ -1,160 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_PRIMITIVES_H_INCLUDED
#define OPA_PRIMITIVES_H_INCLUDED
#include "opa_config.h"
#include "opa_util.h"
/* Clean up some of the opa_config.h definitions. This is a consequence
of using the AX_PREFIX_CONFIG_H macro. Autoconf won't define inline
or _opa_inline when a real "inline" works. Since we are
unconditionally using _opa_inline we must define it ourselves in this
case. */
#ifndef _opa_inline
#define _opa_inline inline
#endif
#ifndef _opa_restrict
#define _opa_restrict restrict
#endif
#ifndef _opa_const
#define _opa_const const
#endif
/*
Primitive atomic functions
--------------------------
The included file is responsible for defining the types of OPA_int_t and
OPA_ptr_t as well as a set of functions for operating on these
types. If you have the following declaration:
OPA_int_t atomic_var;
Then in order for the emulation functions to compile, the underlying value of
atomic_var should be accessible via:
atomic_var.v;
The same goes for OPA_ptr_t.
The atomic functions that must be ported for each architecture:
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr);
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val);
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr);
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val);
static _opa_inline void OPA_add_int(OPA_int_t *ptr, int val);
static _opa_inline void OPA_incr_int(OPA_int_t *ptr);
static _opa_inline void OPA_decr_int(OPA_int_t *ptr);
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr);
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val);
static _opa_inline int OPA_fetch_and_incr_int(OPA_int_t *ptr);
static _opa_inline int OPA_fetch_and_decr_int(OPA_int_t *ptr);
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, void *oldv, void *newv);
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv);
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val);
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val);
// (the memory barriers may be macros instead of inline functions)
static _opa_inline void OPA_write_barrier();
static _opa_inline void OPA_read_barrier();
static _opa_inline void OPA_read_write_barrier();
// Loads and stores with memory ordering guarantees (also may be macros):
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr);
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val);
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr);
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val);
// Compiler barrier, only preventing compiler reordering, *not* CPU
// reordering (may be a macro):
static _opa_inline void OPA_compiler_barrier();
// The following need to be ported only for architectures supporting LL/SC:
static _opa_inline int OPA_LL_int(OPA_int_t *ptr);
static _opa_inline int OPA_SC_int(OPA_int_t *ptr, int val);
static _opa_inline void *OPA_LL_ptr(OPA_ptr_t *ptr);
static _opa_inline int OPA_SC_ptr(OPA_ptr_t *ptr, void *val);
// Additionally, the following initializer macros must be defined:
#define OPA_INT_T_INITIALIZER(val_) ...
#define OPA_PTR_T_INITIALIZER(val_) ...
// They should be useable as C89 static initializers like so:
struct { int x; OPA_int_t y; OPA_ptr_t z; } foo = { 35, OPA_INT_T_INITIALIZER(1), OPA_PTR_T_INITIALIZER(NULL) };
*/
/* Include the appropriate header for the architecture */
#if defined(OPA_USE_UNSAFE_PRIMITIVES)
/* comes first to permit user overrides in the style of NDEBUG */
#include "primitives/opa_unsafe.h"
#elif defined(OPA_HAVE_GCC_AND_POWERPC_ASM)
#include "primitives/opa_gcc_ppc.h"
#elif defined(OPA_HAVE_GCC_AND_ARM_ASM)
#include "primitives/opa_gcc_arm.h"
#elif defined(OPA_HAVE_GCC_X86_32_64)
#include "primitives/opa_gcc_intel_32_64.h"
#elif defined(OPA_HAVE_GCC_X86_32_64_P3)
#include "primitives/opa_gcc_intel_32_64_p3.h"
#elif defined(OPA_HAVE_GCC_AND_IA64_ASM)
#include "primitives/opa_gcc_ia64.h"
#elif defined(OPA_HAVE_GCC_AND_SICORTEX_ASM)
#include "primitives/opa_gcc_sicortex.h"
#elif defined(OPA_HAVE_GCC_INTRINSIC_ATOMICS)
#include "primitives/opa_gcc_intrinsics.h"
#elif defined(OPA_HAVE_SUN_ATOMIC_OPS)
#include "primitives/opa_sun_atomic_ops.h"
#elif defined(OPA_HAVE_NT_INTRINSICS)
#include "primitives/opa_nt_intrinsics.h"
#elif defined(OPA_USE_LOCK_BASED_PRIMITIVES)
#include "primitives/opa_by_lock.h"
#else
#error no primitives implementation specified
#endif
/*
This routine is needed because the MPIU_THREAD_XXX_CS_{ENTER,EXIT} macros do
not provide synchronization across multiple processes, only across multiple
threads within a process. In order to safely emulate atomic operations on a
shared memory region, we need a shared memory backed lock mechanism.
This routine must be called by any subsystem that intends to use the atomic
abstractions if the cpp directive OPA_USE_LOCK_BASED_PRIMITIVES is defined. It must
be called exactly once by _all_ processes, not just a single leader. This
function will initialize the contents of the lock variable if the caller
specifies (isLeader==true). Note that multiple initialization is forbidden
by several lock implementations, especially pthreads.
Inputs:
shm_lock - A pointer to an allocated piece of shared memory that can hold
a mutex (e.g., pthread_mutex_t). This is not portable to
non-pthreads systems at this time.
isLeader - This boolean value should be set to true for exactly one
thread/process of the group that calls this function.
*/
#if defined(OPA_HAVE_PTHREAD_H)
# include <pthread.h>
typedef pthread_mutex_t OPA_emulation_ipl_t;
int OPA_Interprocess_lock_init(OPA_emulation_ipl_t *shm_lock, int isLeader);
#endif
/* FIXME This should probably be pushed down into the platform-specific headers. */
#if defined(OPA_HAVE_SCHED_YIELD)
# include <sched.h>
# define OPA_busy_wait() sched_yield()
#else
# define OPA_busy_wait() do { } while (0)
#endif
#endif /* defined(OPA_PRIMITIVES_H_INCLUDED) */

View File

@@ -1,286 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* Implements a fast, lockfree, multi-producer, single-consumer queue. It's
* important to note the *single-consumer* piece of this, since multithreaded
* consumption will surely lead to data corruption and/or other problems. */
#ifndef OPA_QUEUE_H_INCLUDED
#define OPA_QUEUE_H_INCLUDED
#include "opa_primitives.h"
#ifdef OPA_HAVE_STDDEF_H
#include <stddef.h>
#endif /* OPA_HAVE_STDDEF_H */
/* This value is used to indicate NULL in the OPA_Shm_asymm_base_addr
variable. It is non-zero because one of the likely base addresses is zero
(indicating memory is actually symmetrically mapped). The value 64 was used
because it is unlikely that mmap will choose an address this low for a
mapping. */
/* XXX DJG TODO put some conditionally compiled error checking in that uses this */
#define OPA_SHM_ASYMM_NULL_VAL 64
extern char *OPA_Shm_asymm_base_addr;
/* Used to initialize the base address for relative pointers. This interface
assumes that there is only one shared memory segment. If this turns out to
not be the case in the future, we should probably add support for multiple
shm segments.
This function will return an error if it has already been called. */
int OPA_Shm_asymm_init(char *base);
/* Relative addressing macros. These are for manipulating addresses relative
to the start of a shared memory region. */
#define OPA_SHM_REL_NULL (0x0)
#define OPA_SHM_IS_REL_NULL(rel_ptr) (OPA_load_ptr(&(rel_ptr).offset) == OPA_SHM_REL_NULL)
#define OPA_SHM_SET_REL_NULL(rel_ptr) (OPA_store_ptr(&(rel_ptr).offset, OPA_SHM_REL_NULL))
#define OPA_SHM_REL_ARE_EQUAL(rel_ptr1, rel_ptr2) \
(OPA_load_ptr(&(rel_ptr1).offset) == OPA_load_ptr(&(rel_ptr2).offset))
/* This structure exists such that it is possible to expand the expressiveness
of a relative address at some point in the future. It also provides a
modicum of type safety to help prevent certain flavors of errors.
For example, instead of referencing an offset from a global base address, it
might make sense for there to be multiple base addresses. These base
addresses could correspond to the start of a segment or region of shared
memory. This structure could store the segment number that is used to lookup
a base address in a non-shared table. Note that you would have to be very
careful about all of this because if you add the segment number as a separate
field you can no longer (compare and) swap a relative address atomically. So
you'll either have to shave bits from the pointer or make some sort of
requirement that relative addresses can only be swapped within the same
segment. */
typedef struct OPA_Shm_rel_addr_t {
OPA_ptr_t offset;
} OPA_Shm_rel_addr_t;
/* converts a relative pointer to an absolute pointer */
static _opa_inline
void *OPA_Shm_rel_to_abs(OPA_Shm_rel_addr_t r)
{
void *offset = OPA_load_ptr(&r.offset);
OPA_assert((size_t)OPA_Shm_asymm_base_addr != OPA_SHM_ASYMM_NULL_VAL);
return (void*)(OPA_Shm_asymm_base_addr + (size_t)offset);
}
/* converts an absolute pointer to a relative pointer */
static _opa_inline
OPA_Shm_rel_addr_t OPA_Shm_abs_to_rel(void *a)
{
OPA_Shm_rel_addr_t ret;
OPA_assert((size_t)OPA_Shm_asymm_base_addr != OPA_SHM_ASYMM_NULL_VAL);
OPA_store_ptr(&ret.offset, (void*)((size_t)a - (size_t)OPA_Shm_asymm_base_addr));
return ret;
}
static _opa_inline
OPA_Shm_rel_addr_t OPA_Shm_swap_rel(OPA_Shm_rel_addr_t *addr, OPA_Shm_rel_addr_t newv) {
OPA_Shm_rel_addr_t oldv;
OPA_store_ptr(&oldv.offset, OPA_swap_ptr(&addr->offset, OPA_load_ptr(&newv.offset)));
return oldv;
}
/* Compare the relative pointer to (relative) null and swap if equal. Prevents
the guts of the _rel_addr_t abstraction from bleeding up into the
enqueue/dequeue operations. */
static _opa_inline
OPA_Shm_rel_addr_t OPA_Shm_cas_rel_null(OPA_Shm_rel_addr_t *addr, OPA_Shm_rel_addr_t oldv) {
OPA_Shm_rel_addr_t prev;
OPA_store_ptr(&prev.offset, OPA_cas_ptr(&(addr->offset), OPA_load_ptr(&oldv.offset), (void*)OPA_SHM_REL_NULL));
return prev;
}
/* The shadow head pointer makes this queue implementation perform much better
than a standard queue. Unfortunately, it also makes it a bit non-intuitive
when read the code. The following is an excerpt from "Design and Evaluation
of Nemesis, a Scalable, Low-Latency, Message-Passing Communication
Subsystem" by D. Buntinas, G. Mercier, and W. Gropp that gives an
explanation:
A process must access both the head and tail of the queue when it is
enqueuing an element on an empty queue or when it is dequeuing an element
that is the last element in the queue. In these cases, if the head and
tail were in the same cache line, only one L2 cache miss would be
encountered. If the queue has more elements in it, however, then the
enqueuer only needs to access the tail, and the dequeuer only needs to
access the head. If the head and tail were in the same cache line, then
there would be L2 misses encountered as a result of false sharing each
time a process enqueues an element after another has been dequeued from
the same queue, and vice versa. In this case it would be better if the
head and tail were in separate cache lines.
Our solution is to put the head and tail in the same cache line and have a
shadow head pointer in a separate cache line. The shadow head is
initialized to NULL. The dequeuer uses the shadow head in place of the
real head except when the shadow head is NULL, meaning that the queue has
become empty. If the shadow head is NULL when the dequeuer tries to
dequeue, it checks the value of the real head. If the real head is not
NULL, meaning that an element has been enqueued on the queue since the
last time the queue became empty, the dequeuer initializes its shadow head
to the value of the real head and sets the real head to NULL. In this way,
only one L2 cache miss is encountered when enqueuing onto an empty queue
or dequeuing from a queue with one element. And because the tail and
shadow head are in separate cache lines, there are no L2 cache misses from
false sharing.
We found that using a shadow head pointer reduced one-way latency by about
200 ns on a dual 2 GHz Xeon node.
*/
/* Pick an arbitrary cacheline size for now, we can setup a mechanism to detect
it at build time later on. This should work well on most intel systems at
the very least. */
#define OPA_QUEUE_CACHELINE_PADDING 128
/* All absolute and relative pointers point to the start of the enclosing element. */
typedef struct OPA_Queue_info_t {
OPA_Shm_rel_addr_t head; /* holds the offset pointer, not the abs ptr */
OPA_Shm_rel_addr_t tail; /* holds the offset pointer, not the abs ptr */
char padding1[OPA_QUEUE_CACHELINE_PADDING-2*sizeof(OPA_Shm_rel_addr_t)];
OPA_Shm_rel_addr_t shadow_head; /* holds the offset pointer, not the abs ptr */
char padding2[OPA_QUEUE_CACHELINE_PADDING-sizeof(OPA_Shm_rel_addr_t)];
} OPA_Queue_info_t;
/* Using this header struct even though it's just one element gives us the
opportunity to vary the implementation more easily in the future without
updating all callers. */
typedef struct OPA_Queue_element_hdr_t {
OPA_Shm_rel_addr_t next; /* holds the offset pointer, not the abs ptr */
} OPA_Queue_element_hdr_t;
/* Used to initialize a queue structure. */
void OPA_Queue_init(OPA_Queue_info_t *qhead);
/* Used to initialize a queue element header. */
void OPA_Queue_header_init(OPA_Queue_element_hdr_t *hdr);
static _opa_inline
int OPA_Queue_is_empty(OPA_Queue_info_t *qhead)
{
int __ret = 0;
if (OPA_SHM_IS_REL_NULL (qhead->shadow_head)) {
if (OPA_SHM_IS_REL_NULL(qhead->head)) {
__ret = 1;
}
else {
qhead->shadow_head = qhead->head;
OPA_SHM_SET_REL_NULL(qhead->head); /* reset it for next time */
}
}
return __ret;
}
/* Returns a pointer to the element at the head of the queue. The current
implementation of these queue algorithms imposes several notable
restrictions on the use of this function:
- The caller must currently hold the critical section, just as if you were
calling OPA_Queue_dequeue. Failure to do could easily produce incorrect
results.
- OPA_Queue_is_empty must be called on this queue prior to calling this
function. Furthermore, there must be no intervening calls to any
OPA_Queue_* functions (for this queue) between _is_empty and _peek_head.
Failure to do so will produce incorrect results.
This operation is effectively the same as the dequeue operation (insofar as
it shares the same calling restrictions) but it does not disturb the actual
contents of the queue. */
static _opa_inline
void *OPA_Queue_peek_head(OPA_Queue_info_t *qhead_ptr)
{
OPA_assert(qhead_ptr != NULL);
if (OPA_SHM_IS_REL_NULL(qhead_ptr->shadow_head)) {
return NULL;
}
return OPA_Shm_rel_to_abs(qhead_ptr->shadow_head);
}
/* This macro atomically enqueues an element (elt for short) into the queue
indicated by qhead_ptr. You need to pass several arguments:
qhead_ptr - a pointer to a OPA_Queue_info_t structure to which the
element should be enqueued
elt_ptr - a pointer to an element structure type that is to be enqueued
elt_type - The base type of elt_ptr. That is, if elt_ptr is a
'(struct example_t *)' then elt_type is 'struct example_t'.
elt_hdr_field - This is the member name of elt_type that is a
OPA_Queue_element_hdr_t.
This queue implementation is loosely modeled after the linked lists used in
the linux kernel. You put the list header structure inside of the client
structure, rather than the other way around.
*/
#define OPA_Queue_enqueue(qhead_ptr, elt_ptr, elt_type, elt_hdr_field) \
do { \
OPA_Shm_rel_addr_t r_prev; \
OPA_Shm_rel_addr_t r_elt = OPA_Shm_abs_to_rel(elt_ptr); \
\
OPA_SHM_SET_REL_NULL((elt_ptr)->elt_hdr_field.next); \
\
OPA_write_barrier(); \
\
r_prev = OPA_Shm_swap_rel(&((qhead_ptr)->tail), r_elt); \
\
if (OPA_SHM_IS_REL_NULL(r_prev)) { \
(qhead_ptr)->head = r_elt; \
} \
else { \
elt_type *abs_prev = (elt_type *)OPA_Shm_rel_to_abs(r_prev); \
abs_prev->elt_hdr_field.next = r_elt; \
} \
} while (0)
/* This macro atomically dequeues an element (elt for short) from the queue
indicated by qhead_ptr. You need to pass several arguments:
qhead_ptr - a pointer to a OPA_Queue_info_t structure to which the
element should be dequeued
elt_ptr - A pointer to an element structure type that should be populated
with the dequeued value. Must be an lvalue.
elt_type - The base type of elt_ptr. That is, if elt_ptr is a
'(struct example_t *)' then elt_type is 'struct example_t'.
elt_hdr_field - This is the member name of elt_type that is a
OPA_Queue_element_hdr_t.
This queue implementation is loosely modeled after the linked lists used in
the linux kernel. You put the list header structure inside of the client
structure, rather than the other way around.
NOTE: you must *always* call _is_empty() prior to this function */
#define OPA_Queue_dequeue(qhead_ptr, elt_ptr, elt_type, elt_hdr_field) \
do { \
elt_type *_e; \
OPA_Shm_rel_addr_t _r_e; \
\
_r_e = (qhead_ptr)->shadow_head; \
_e = OPA_Shm_rel_to_abs(_r_e); \
\
if (!OPA_SHM_IS_REL_NULL(_e->elt_hdr_field.next)) { \
(qhead_ptr)->shadow_head = _e->elt_hdr_field.next; \
} \
else { \
OPA_Shm_rel_addr_t old_tail; \
\
OPA_SHM_SET_REL_NULL((qhead_ptr)->shadow_head); \
\
old_tail = OPA_Shm_cas_rel_null(&((qhead_ptr)->tail), _r_e); \
\
if (!OPA_SHM_REL_ARE_EQUAL(old_tail, _r_e)) { \
while (OPA_SHM_IS_REL_NULL(_e->elt_hdr_field.next)) { \
OPA_busy_wait(); \
} \
(qhead_ptr)->shadow_head = _e->elt_hdr_field.next; \
} \
} \
OPA_SHM_SET_REL_NULL(_e->elt_hdr_field.next); \
OPA_read_barrier(); \
elt_ptr = _e; \
} while (0)
#endif /* OPA_QUEUE_H_INCLUDED */

View File

@@ -1,27 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_UTIL_H_INCLUDED
#define OPA_UTIL_H_INCLUDED
#define OPA_QUOTE(x_) OPA_QUOTE2(x_)
#define OPA_QUOTE2(x_) #x_
#if defined(OPA_HAVE_GCC_ATTRIBUTE)
# define OPA_ATTRIBUTE(x_) __attribute__ (x_)
#else
# define OPA_ATTRIBUTE(x_)
#endif
/* FIXME this just needs a total rework in general with an OPA_NDEBUG or similar. */
#define OPA_assert(expr_) do {} while (0)
#define OPA_assertp(expr_) do { if (!(expr_)) ++((int *)NULL) } while (0) /* SEGV intentionally */
/* A compile-time assertion macro. It should cause a compilation error if (expr_) is false. */
#define OPA_COMPILE_TIME_ASSERT(expr_) \
do { switch(0) { case 0: case (expr_): default: break; } } while (0)
#endif /* OPA_UTIL_H_INCLUDED */

View File

@@ -1,205 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_BY_LOCK_H_INCLUDED
#define OPA_BY_LOCK_H_INCLUDED
/* FIXME For now we rely on pthreads for our IPC locks. This is fairly
portable, although it is obviously not 100% portable. Some day when we
refactor the OPA_Process_locks code we should be able to use that again. */
#if defined(OPA_HAVE_PTHREAD_H)
#include <pthread.h>
/* defined in opa_primitives.c */
extern pthread_mutex_t *OPA_emulation_lock;
/* FIXME these make less sense now that OPA is not inside of MPICH. Is there a
simpler name/scheme that could be used here instead? [goodell@ 2009-02-19] */
#define OPA_IPC_SINGLE_CS_ENTER(msg) \
do { \
OPA_assert(OPA_emulation_lock); \
pthread_mutex_lock(OPA_emulation_lock); \
} while (0)
#define OPA_IPC_SINGLE_CS_EXIT(msg) \
do { \
OPA_assert(OPA_emulation_lock); \
pthread_mutex_unlock(OPA_emulation_lock); \
} while (0)
typedef struct { volatile int v; } OPA_int_t;
typedef struct { int * volatile v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
/*
Emulated atomic primitives
--------------------------
These are versions of the atomic primitives that emulate the proper behavior
via the use of an inter-process lock. For more information on their
individual behavior, please see the comment on the corresponding top level
function.
In general, these emulated primitives should _not_ be used. Most algorithms
can be more efficiently implemented by putting most or all of the algorithm
inside of a single critical section. These emulated primitives exist to
ensure that there is always a fallback if no machine-dependent version of a
particular operation has been defined. They also serve as a very readable
reference for the exact semantics of our OPA_* ops.
*/
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
int retval;
OPA_IPC_SINGLE_CS_ENTER("atomic_add");
retval = ptr->v;
OPA_IPC_SINGLE_CS_EXIT("atomic_add");
return retval;
}
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
OPA_IPC_SINGLE_CS_ENTER("atomic_add");
ptr->v = val;
OPA_IPC_SINGLE_CS_EXIT("atomic_add");
}
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
int *retval;
OPA_IPC_SINGLE_CS_ENTER("atomic_add");
retval = ptr->v;
OPA_IPC_SINGLE_CS_EXIT("atomic_add");
return retval;
}
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
OPA_IPC_SINGLE_CS_ENTER("atomic_add");
ptr->v = val;
OPA_IPC_SINGLE_CS_EXIT("atomic_add");
}
/* normal loads/stores are fully ordered, so just use them */
#define OPA_load_acquire_int(ptr_) OPA_load_int((ptr_))
#define OPA_store_release_int(ptr_,val_) OPA_store_int((ptr_),(val_))
#define OPA_load_acquire_ptr(ptr_) OPA_load_ptr((ptr_))
#define OPA_store_release_ptr(ptr_,val_) OPA_store_ptr((ptr_),(val_))
static _opa_inline void OPA_add_int(OPA_int_t *ptr, int val)
{
OPA_IPC_SINGLE_CS_ENTER("atomic_add");
ptr->v += val;
OPA_IPC_SINGLE_CS_EXIT("atomic_add");
}
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, int *oldv, int *newv)
{
int *prev;
OPA_IPC_SINGLE_CS_ENTER("atomic_cas");
prev = ptr->v;
if (prev == oldv) {
ptr->v = newv;
}
OPA_IPC_SINGLE_CS_EXIT("atomic_cas");
return prev;
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
int prev;
OPA_IPC_SINGLE_CS_ENTER("atomic_cas");
prev = ptr->v;
if (prev == oldv) {
ptr->v = newv;
}
OPA_IPC_SINGLE_CS_EXIT("atomic_cas");
return prev;
}
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
int new_val;
OPA_IPC_SINGLE_CS_ENTER("atomic_decr_and_test");
new_val = --(ptr->v);
OPA_IPC_SINGLE_CS_EXIT("atomic_decr_and_test");
return (0 == new_val);
}
static _opa_inline void OPA_decr_int(OPA_int_t *ptr)
{
OPA_IPC_SINGLE_CS_ENTER("atomic_decr");
--(ptr->v);
OPA_IPC_SINGLE_CS_EXIT("atomic_decr");
}
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
int prev;
OPA_IPC_SINGLE_CS_ENTER("atomic_fetch_and_add");
prev = ptr->v;
ptr->v += val;
OPA_IPC_SINGLE_CS_EXIT("atomic_fetch_and_add");
return prev;
}
static _opa_inline int OPA_fetch_and_decr_int(OPA_int_t *ptr)
{
int prev;
OPA_IPC_SINGLE_CS_ENTER("atomic_fetch_and_decr");
prev = ptr->v;
--(ptr->v);
OPA_IPC_SINGLE_CS_EXIT("atomic_fetch_and_decr");
return prev;
}
static _opa_inline int OPA_fetch_and_incr_int(OPA_int_t *ptr)
{
int prev;
OPA_IPC_SINGLE_CS_ENTER("atomic_fetch_and_incr");
prev = ptr->v;
++(ptr->v);
OPA_IPC_SINGLE_CS_EXIT("atomic_fetch_and_incr");
return prev;
}
static _opa_inline void OPA_incr_int(OPA_int_t *ptr)
{
OPA_IPC_SINGLE_CS_ENTER("atomic_incr");
++(ptr->v);
OPA_IPC_SINGLE_CS_EXIT("atomic_incr");
}
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val)
{
int *prev;
OPA_IPC_SINGLE_CS_ENTER("atomic_swap_ptr");
prev = ptr->v;
ptr->v = val;
OPA_IPC_SINGLE_CS_EXIT("atomic_swap_ptr");
return prev;
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
int prev;
OPA_IPC_SINGLE_CS_ENTER("atomic_swap_int");
prev = ptr->v;
ptr->v = val;
OPA_IPC_SINGLE_CS_EXIT("atomic_swap_int");
return (int)prev;
}
/* lock/unlock provides barrier */
#define OPA_write_barrier() do {} while (0)
#define OPA_read_barrier() do {} while (0)
#define OPA_read_write_barrier() do {} while (0)
#endif /* defined(OPA_HAVE_PTHREAD_H) */
#endif /* !defined(OPA_BY_LOCK_H_INCLUDED) */

View File

@@ -1,192 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_EMULATED_H_INCLUDED
#define OPA_EMULATED_H_INCLUDED
/* Functions emulated using other atomics
This header should be included at the bottom of any atomic
primitives header that needs to implement an atomic op in terms of
another atomic.
*/
/* Emulating using LL/SC */
#if defined(OPA_LL_SC_SUPPORTED)
static _opa_inline int OPA_fetch_and_add_int_by_llsc(OPA_int_t *ptr, int val)
{
int prev;
do {
prev = OPA_LL_int(ptr);
} while (!OPA_SC_int(ptr, prev + val));
return prev;
}
static _opa_inline void OPA_add_int_by_llsc(OPA_int_t *ptr, int val)
{
OPA_fetch_and_add_int_by_llsc(ptr, val);
}
static _opa_inline void OPA_incr_int_by_llsc(OPA_int_t *ptr)
{
OPA_add_int_by_llsc(ptr, 1);
}
static _opa_inline void OPA_decr_int_by_llsc(OPA_int_t *ptr)
{
OPA_add_int_by_llsc(ptr, -1);
}
static _opa_inline int OPA_fetch_and_decr_int_by_llsc(OPA_int_t *ptr)
{
return OPA_fetch_and_add_int_by_llsc(ptr, -1);
}
static _opa_inline int OPA_fetch_and_incr_int_by_llsc(OPA_int_t *ptr)
{
return OPA_fetch_and_add_int_by_llsc(ptr, 1);
}
static _opa_inline int OPA_decr_and_test_int_by_llsc(OPA_int_t *ptr)
{
int prev = OPA_fetch_and_decr_int_by_llsc(ptr);
return prev == 1;
}
static _opa_inline void *OPA_cas_ptr_by_llsc(OPA_ptr_t *ptr, void *oldv, void *newv)
{
void *prev;
do {
prev = OPA_LL_ptr(ptr);
} while (prev == oldv && !OPA_SC_ptr(ptr, newv));
return prev;
}
static _opa_inline int OPA_cas_int_by_llsc(OPA_int_t *ptr, int oldv, int newv)
{
int prev;
do {
prev = OPA_LL_int(ptr);
} while (prev == oldv && !OPA_SC_int(ptr, newv));
return prev;
}
static _opa_inline void *OPA_swap_ptr_by_llsc(OPA_ptr_t *ptr, void *val)
{
void *prev;
do {
prev = OPA_LL_ptr(ptr);
} while (!OPA_SC_ptr(ptr, val));
return prev;
}
static _opa_inline int OPA_swap_int_by_llsc(OPA_int_t *ptr, int val)
{
int prev;
do {
prev = OPA_LL_int(ptr);
} while (!OPA_SC_int(ptr, val));
return prev;
}
#endif /* OPA_LL_SC_SUPPORTED */
static _opa_inline int OPA_fetch_and_add_int_by_cas(OPA_int_t *ptr, int val)
{
int cmp;
int prev = OPA_load_int(ptr);
do {
cmp = prev;
prev = OPA_cas_int(ptr, cmp, prev + val);
} while (prev != cmp);
return prev;
}
static _opa_inline int OPA_fetch_and_incr_int_by_faa(OPA_int_t *ptr)
{
return OPA_fetch_and_add_int(ptr, 1);
}
static _opa_inline int OPA_fetch_and_decr_int_by_faa(OPA_int_t *ptr)
{
return OPA_fetch_and_add_int(ptr, -1);
}
static _opa_inline int OPA_decr_and_test_int_by_fad(OPA_int_t *ptr)
{
return OPA_fetch_and_decr_int(ptr) == 1;
}
static _opa_inline void OPA_add_int_by_faa(OPA_int_t *ptr, int val)
{
OPA_fetch_and_add_int(ptr, val);
}
static _opa_inline int OPA_incr_int_by_faa(OPA_int_t *ptr)
{
return OPA_fetch_and_add_int(ptr, 1);
}
static _opa_inline void OPA_incr_int_by_add(OPA_int_t *ptr)
{
OPA_add_int(ptr, 1);
}
static _opa_inline void OPA_incr_int_by_fai(OPA_int_t *ptr)
{
OPA_fetch_and_incr_int(ptr);
}
static _opa_inline int OPA_decr_int_by_faa(OPA_int_t *ptr)
{
return OPA_fetch_and_add_int(ptr, -1);
}
static _opa_inline void OPA_decr_int_by_add(OPA_int_t *ptr)
{
OPA_add_int(ptr, -1);
}
static _opa_inline void OPA_decr_int_by_fad(OPA_int_t *ptr)
{
OPA_fetch_and_decr_int(ptr);
}
/* Swap using CAS */
static _opa_inline void *OPA_swap_ptr_by_cas(OPA_ptr_t *ptr, void *val)
{
void *cmp;
void *prev = OPA_load_ptr(ptr);
do {
cmp = prev;
prev = OPA_cas_ptr(ptr, cmp, val);
} while (prev != cmp);
return prev;
}
static _opa_inline int OPA_swap_int_by_cas(OPA_int_t *ptr, int val)
{
int cmp;
int prev = OPA_load_int(ptr);
do {
cmp = prev;
prev = OPA_cas_int(ptr, cmp, val);
} while (prev != cmp);
return prev;
}
#endif /* OPA_EMULATED_H_INCLUDED */

View File

@@ -1,216 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* NOTE: We (@ANL) do not have easy access to any ia64 hosts, so it is difficult
* to develop and test updates to this file. Any help in this regard is greatly
* appreciated. */
#ifndef OPA_GCC_IA64_H_INCLUDED
#define OPA_GCC_IA64_H_INCLUDED
/* FIXME do we need to align these? */
typedef struct { volatile int v; } OPA_int_t;
typedef struct { void * volatile v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
/* Aligned loads and stores are atomic on ia64. */
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic on ia64. */
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = val;
}
/* Aligned loads and stores are atomic on ia64. */
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic on ia64. */
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
/* NOTE-IA64-1 ia64 suports half-fence suffixes to ld/st instructions. It seems
* that compilers also treat any C-language load/store from/to a volatile
* variable as acquire/release and append the corresponding suffix accordingly.
* But we don't have extensive testing to back this up, so we'll explicitly
* force these instructions for now. When using the C-level approach, it's not
* clear what instructions the compiler is allowed to reorder. */
#if 0
/* acquire means operations after the acquire will see any memory opeations
* performed before the corresponding paired release operation */
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr)
{
int tmp;
__asm__ __volatile__ ("ld.acq %0=[%1]"
: "=r" (tmp)
: "r" (ptr->v)
: "memory");
return tmp;
}
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val)
{
__asm__ __volatile__ ("st.rel [%0]=%1"
: "=m" (ptr->v)
: "r" (val)
: "memory");
}
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr)
{
int tmp;
__asm__ __volatile__ ("ld.acq %0=[%1]"
: "=r" (tmp)
: "r" (ptr->v)
: "memory");
return tmp;
}
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val)
{
__asm__ __volatile__ ("st.rel [%0]=%1"
: "=m" (ptr->v)
: "r" (val)
: "memory");
}
#else
/* FIXME because we can't test these implementations, they are currently
* disabled. The above impls are rough starting points, but probably won't
* compile/assemble correctly as-is. Patches are welcome :) */
#define OPA_load_acquire_int(ptr_) ::"choke me"
#define OPA_store_release_int(ptr_,val_) ::"choke me"
#define OPA_load_acquire_ptr(ptr_) ::"choke me"
#define OPA_store_release_ptr(ptr_,val_) ::"choke me"
#endif
#define OPA_add_int_by_faa OPA_add_int
#define OPA_incr_int_by_faa OPA_incr_int
#define OPA_decr_int_by_faa OPA_decr_int
#define OPA_fetch_and_decr_int_by_faa OPA_fetch_and_decr_int
#define OPA_fetch_and_incr_int_by_faa OPA_fetch_and_incr_int
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
int val;
__asm__ __volatile__ ("fetchadd4.rel %0=[%2],%3"
: "=r"(val), "=m"(ptr->v)
: "r"(&ptr->v), "i"(-1));
return val == 1;
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
int prev;
#if OPA_SIZEOF_INT == 8
__asm__ __volatile__ ("mov ar.ccv=%1;;"
"cmpxchg8.rel %0=[%3],%4,ar.ccv"
: "=r"(prev), "=m"(ptr->v)
: "rO"(oldv), "r"(&ptr->v), "r"(newv)
: "memory");
break;
#elif OPA_SIZEOF_INT == 4
__asm__ __volatile__ ("zxt4 %1=%1;;" /* don't want oldv sign-extended to 64 bits */
"mov ar.ccv=%1;;"
"cmpxchg4.rel %0=[%3],%4,ar.ccv"
: "=r"(prev), "=m"(ptr->v)
: "r0"(oldv), "r"(&ptr->v), "r"(newv)
: "memory");
#else
#error OPA_SIZEOF_INT is not 4 or 8
#endif
return prev;
}
/* IA64 has a fetch-and-add instruction that only accepts immediate
values of -16, -8, -4, -1, 1, 4, 8, and 16. So we check for these
values before falling back to the CAS implementation. */
#define OPA_IA64_FAA_CASE_MACRO(ptr, val) case val: { \
int prev; \
__asm__ __volatile__ ("fetchadd4.rel %0=[%2],%3" \
: "=r"(prev), "=m"(ptr->v) \
: "r"(&ptr->v), "i"(val)); \
return prev; \
} \
break
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
switch (val)
{
OPA_IA64_FAA_CASE_MACRO(ptr, -16);
OPA_IA64_FAA_CASE_MACRO(ptr, -8);
OPA_IA64_FAA_CASE_MACRO(ptr, -4);
OPA_IA64_FAA_CASE_MACRO(ptr, -1);
OPA_IA64_FAA_CASE_MACRO(ptr, 1);
OPA_IA64_FAA_CASE_MACRO(ptr, 4);
OPA_IA64_FAA_CASE_MACRO(ptr, 8);
OPA_IA64_FAA_CASE_MACRO(ptr, 16);
default:
{
int cmp;
int prev = OPA_load_int(ptr);
do {
cmp = prev;
prev = OPA_cas_int(ptr, cmp, val);
} while (prev != cmp);
return prev;
}
}
}
#undef OPA_IA64_FAA_CASE_MACRO
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, void *oldv, void *newv)
{
void *prev;
__asm__ __volatile__ ("mov ar.ccv=%1;;"
"cmpxchg8.rel %0=[%3],%4,ar.ccv"
: "=r"(prev), "=m"(ptr->v)
: "rO"(oldv), "r"(&ptr->v), "r"(newv));
return prev;
}
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val)
{
__asm__ __volatile__ ("xchg8 %0=[%2],%3"
: "=r" (val), "=m" (ptr->v)
: "r" (&ptr->v), "0" (val));
return val;
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
__asm__ __volatile__ ("xchg8 %0=[%2],%3"
: "=r" (val), "=m" (ptr->v)
: "r" (&ptr->v), "0" (val));
return val;
}
#define OPA_write_barrier() __asm__ __volatile__ ("mf" ::: "memory" )
#define OPA_read_barrier() __asm__ __volatile__ ("mf" ::: "memory" )
#define OPA_read_write_barrier() __asm__ __volatile__ ("mf" ::: "memory" )
#define OPA_compiler_barrier() __asm__ __volatile__ ("" ::: "memory" )
#include "opa_emulated.h"
#endif /* OPA_GCC_IA64_H_INCLUDED */

View File

@@ -1,15 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_GCC_INTEL_32_64_H_INCLUDED
#define OPA_GCC_INTEL_32_64_H_INCLUDED
#include "opa_gcc_intel_32_64_barrier.h"
#include "opa_gcc_intel_32_64_ops.h"
#include "opa_emulated.h"
#endif /* OPA_GCC_INTEL_32_64_H_INCLUDED */

View File

@@ -1,25 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_GCC_INTEL_32_64_BARRIER_H_INCLUDED
#define OPA_GCC_INTEL_32_64_BARRIER_H_INCLUDED
#define OPA_compiler_barrier() __asm__ __volatile__ ( "" ::: "memory" )
/* For all regular memory (write-back cacheable, not driver/graphics
* memory), there is only one general ordering relaxation permitted by
* x86/x86_64 processors: earlier stores may be retired after later
* stores. The "clflush" and "movnt*" instructions also don't follow
* general ordering constraints, although any code using these
* instructions should be responsible for ensuring proper ordering
* itself. So our read and write barriers may be implemented as simple
* compiler barriers. */
#define OPA_write_barrier() OPA_compiler_barrier()
#define OPA_read_barrier() OPA_compiler_barrier()
#define OPA_read_write_barrier() __asm__ __volatile__ ( "mfence" ::: "memory" )
#endif /* OPA_GCC_INTEL_32_64_BARRIER_H_INCLUDED */

View File

@@ -1,173 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_GCC_INTEL_32_64_OPS_H_INCLUDED
#define OPA_GCC_INTEL_32_64_OPS_H_INCLUDED
#ifndef OPA_SIZEOF_INT
#error OPA_SIZEOF_INT is not defined
#endif
/* Set OPA_SS (Size Suffix) which is to be appended to asm ops for
specifying 4 or 8 byte operands */
#if OPA_SIZEOF_INT == 4
#define OPA_SS "l"
#elif OPA_SIZEOF_INT == 8
#define OPA_SS "q"
#else
#error OPA_SIZEOF_INT is not 4 or 8
#endif
/* XXX DJG FIXME do we need to align these? */
typedef struct { volatile int v; } OPA_int_t;
typedef struct { void * volatile v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
/* Aligned loads and stores are atomic on x86(-64). */
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic on x86(-64). */
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = val;
}
/* Aligned loads and stores are atomic on x86(-64). */
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic on x86(-64). */
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
/* NOTE-X86-1 x86 and x86_64 processors execute instructions such that their
* effects are visible in issue order, with one exception: earlier stores may
* pass later loads. Also, non-temporal stores (with the "movnt*" instructions)
* do not follow these ordering constraints. So all normal load/store
* instructions on x86(_64) already have acquire/release semantics. We just
* have to make sure that the compiler does not reorder the instructions. */
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr)
{
int tmp;
tmp = ptr->v;
OPA_compiler_barrier(); /* NOTE-X86-1 */
return tmp;
}
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val)
{
OPA_compiler_barrier(); /* NOTE-X86-1 */
ptr->v = val;
}
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr)
{
void *tmp;
tmp = ptr->v;
OPA_compiler_barrier(); /* NOTE-X86-1 */
return tmp;
}
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val)
{
OPA_compiler_barrier(); /* NOTE-X86-1 */
ptr->v = val;
}
static _opa_inline void OPA_add_int(OPA_int_t *ptr, int val)
{
__asm__ __volatile__ ("lock ; add"OPA_SS" %1,%0"
:"=m" (ptr->v)
:"ir" (val), "m" (ptr->v));
return;
}
static _opa_inline void OPA_incr_int(OPA_int_t *ptr)
{
__asm__ __volatile__ ("lock ; inc"OPA_SS" %0"
:"=m" (ptr->v)
:"m" (ptr->v));
return;
}
static _opa_inline void OPA_decr_int(OPA_int_t *ptr)
{
__asm__ __volatile__ ("lock ; dec"OPA_SS" %0"
:"=m" (ptr->v)
:"m" (ptr->v));
return;
}
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
char result;
__asm__ __volatile__ ("lock ; dec"OPA_SS" %0; setz %1"
:"=m" (ptr->v), "=q" (result)
:"m" (ptr->v));
return result;
}
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
__asm__ __volatile__ ("lock ; xadd %0,%1"
: "=r" (val), "=m" (ptr->v)
: "0" (val), "m" (ptr->v));
return val;
}
#define OPA_fetch_and_incr_int_by_faa OPA_fetch_and_incr_int
#define OPA_fetch_and_decr_int_by_faa OPA_fetch_and_decr_int
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, void *oldv, void *newv)
{
void *prev;
__asm__ __volatile__ ("lock ; cmpxchg %3,%4"
: "=a" (prev), "=m" (ptr->v)
: "0" (oldv), "q" (newv), "m" (ptr->v));
return prev;
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
int prev;
__asm__ __volatile__ ("lock ; cmpxchg %3,%4"
: "=a" (prev), "=m" (ptr->v)
: "0" (oldv), "q" (newv), "m" (ptr->v));
return prev;
}
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val)
{
__asm__ __volatile__ ("xchg %0,%1"
:"=r" (val), "=m" (ptr->v)
: "0" (val), "m" (ptr->v));
return val;
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
__asm__ __volatile__ ("xchg %0,%1"
:"=r" (val), "=m" (ptr->v)
: "0" (val), "m" (ptr->v));
return val;
}
#undef OPA_SS
#endif /* OPA_GCC_INTEL_32_64_OPS_H_INCLUDED */

View File

@@ -1,15 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_GCC_INTEL_32_64_P3_H_INCLUDED
#define OPA_GCC_INTEL_32_64_P3_H_INCLUDED
#include "opa_gcc_intel_32_64_p3barrier.h"
#include "opa_gcc_intel_32_64_ops.h"
#include "opa_emulated.h"
#endif /* OPA_GCC_INTEL_32_64_P3_H_INCLUDED */

View File

@@ -1,34 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_GCC_INTEL_32_64_P3BARRIER_H_INCLUDED
#define OPA_GCC_INTEL_32_64_P3BARRIER_H_INCLUDED
#define OPA_compiler_barrier() __asm__ __volatile__ ( "" ::: "memory" )
/* For all regular memory (write-back cacheable, not driver/graphics
* memory), there is only one general ordering relaxation permitted by
* x86/x86_64 processors: earlier stores may be retired after later
* stores. The "clflush" and "movnt*" instructions also don't follow
* general ordering constraints, although any code using these
* instructions should be responsible for ensuring proper ordering
* itself. So our read and write barriers may be implemented as simple
* compiler barriers. */
#define OPA_write_barrier() OPA_compiler_barrier()
#define OPA_read_barrier() OPA_compiler_barrier()
/* Some Pentium III and earlier processors have store barriers
(sfence), but no full barrier or load barriers. Some other very
recent x86-like processors don't seem to have sfence either. A
lock-prefixed atomic instruction (operating on any memory) behaves as
a full memory barrier, so we use that here. */
static inline void OPA_read_write_barrier(void)
{
int a = 0;
__asm__ __volatile__ ("lock orl $0, %0" : "+m" (a) : /*no outputs*/ : "memory");
}
#endif /* OPA_GCC_INTEL_32_64_P3BARRIER_H_INCLUDED */

View File

@@ -1,129 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* FIXME needs to be converted to new style functions with OPA_int_t/OPA_ptr_t-types */
#ifndef OPA_GCC_INTRINSICS_H_INCLUDED
#define OPA_GCC_INTRINSICS_H_INCLUDED
/* FIXME do we need to align these? */
typedef struct { volatile int v; } OPA_int_t;
typedef struct { void * volatile v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
/* Assume that loads/stores are atomic on the current platform, even though this
may not be true at all. */
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
return ptr->v;
}
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = val;
}
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
return ptr->v;
}
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr)
{
volatile int i = 0;
int tmp;
tmp = ptr->v;
__sync_lock_test_and_set(&i, 1); /* guarantees acquire semantics */
return tmp;
}
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val)
{
volatile int i = 1;
__sync_lock_release(&i); /* guarantees release semantics */
ptr->v = val;
}
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr)
{
volatile int i = 0;
void *tmp;
tmp = ptr->v;
__sync_lock_test_and_set(&i, 1); /* guarantees acquire semantics */
return tmp;
}
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val)
{
volatile int i = 1;
__sync_lock_release(&i); /* guarantees release semantics */
ptr->v = val;
}
/* gcc atomic intrinsics accept an optional list of variables to be
protected by a memory barrier. These variables are labeled
below by "protected variables :". */
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
return __sync_fetch_and_add(&ptr->v, val, /* protected variables: */ &ptr->v);
}
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
return __sync_sub_and_fetch(&ptr->v, 1, /* protected variables: */ &ptr->v) == 0;
}
#define OPA_fetch_and_incr_int_by_faa OPA_fetch_and_incr_int
#define OPA_fetch_and_decr_int_by_faa OPA_fetch_and_decr_int
#define OPA_add_int_by_faa OPA_add_int
#define OPA_incr_int_by_fai OPA_incr_int
#define OPA_decr_int_by_fad OPA_decr_int
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, void *oldv, void *newv)
{
return __sync_val_compare_and_swap(&ptr->v, oldv, newv, /* protected variables: */ &ptr->v);
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
return __sync_val_compare_and_swap(&ptr->v, oldv, newv, /* protected variables: */ &ptr->v);
}
#ifdef SYNC_LOCK_TEST_AND_SET_IS_SWAP
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val)
{
return __sync_lock_test_and_set(&ptr->v, val, /* protected variables: */ &ptr->v);
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
return __sync_lock_test_and_set(&ptr->v, val, /* protected variables: */ &ptr->v);
}
#else
#define OPA_swap_ptr_by_cas OPA_swap_ptr
#define OPA_swap_int_by_cas OPA_swap_int
#endif
#define OPA_write_barrier() __sync_synchronize()
#define OPA_read_barrier() __sync_synchronize()
#define OPA_read_write_barrier() __sync_synchronize()
#define OPA_compiler_barrier() __asm__ __volatile__ ( "" ::: "memory" )
#include"opa_emulated.h"
#endif /* OPA_GCC_INTRINSICS_H_INCLUDED */

View File

@@ -1,180 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_GCC_PPC_H_INCLUDED
#define OPA_GCC_PPC_H_INCLUDED
/* these need to be aligned on an 8-byte boundary to work on a BG/P */
typedef struct { volatile int v OPA_ATTRIBUTE((aligned (8))); } OPA_int_t;
typedef struct { void * volatile v OPA_ATTRIBUTE((aligned (8))); } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
/* Aligned loads and stores are atomic. */
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic. */
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = val;
}
/* Aligned loads and stores are atomic. */
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic. */
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
/* a useful link for PPC memory ordering issues:
* http://www.rdrop.com/users/paulmck/scalability/paper/N2745r.2009.02.22a.html
*
* lwsync: orders L-L, S-S, L-S, but *not* S-L (i.e. gives x86-ish ordering)
* eieio: orders S-S (but only for cacheable memory, not for MMIO)
* sync: totally orders memops
* isync: force all preceeding insns to appear complete before starting
* subsequent insns, but w/o cumulativity (very confusing)
*/
/* helper macros */
#define OPA_ppc_lwsync_() __asm__ __volatile__ ( "lwsync" ::: "memory" )
#define OPA_ppc_hwsync_() __asm__ __volatile__ ( "sync" ::: "memory" )
#define OPA_ppc_eieio_() __asm__ __volatile__ ( "eieio" ::: "memory" )
#define OPA_write_barrier() OPA_ppc_eieio_()
#define OPA_read_barrier() OPA_ppc_lwsync_()
#define OPA_read_write_barrier() OPA_ppc_hwsync_()
#define OPA_compiler_barrier() __asm__ __volatile__ ( "" ::: "memory" )
/* NOTE-PPC-1 we use lwsync, although I think we might be able to use
* conditional-branch+isync in some cases (load_acquire?) once we understand it
* better */
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr)
{
int tmp;
tmp = ptr->v;
OPA_ppc_lwsync_(); /* NOTE-PPC-1 */
return tmp;
}
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val)
{
OPA_ppc_lwsync_();
ptr->v = val;
}
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr)
{
void *tmp;
tmp = ptr->v;
OPA_ppc_lwsync_(); /* NOTE-PPC-1 */
return tmp;
}
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val)
{
OPA_ppc_lwsync_();
ptr->v = val;
}
/*
load-link/store-conditional (LL/SC) primitives. We LL/SC implement
these here, which are arch-specific, then use the generic
implementations from opa_emulated.h */
static _opa_inline int OPA_LL_int(OPA_int_t *ptr)
{
int val;
__asm__ __volatile__ ("lwarx %[val],0,%[ptr]"
: [val] "=r" (val)
: [ptr] "r" (&ptr->v)
: "cc");
return val;
}
/* Returns non-zero if the store was successful, zero otherwise. */
static _opa_inline int OPA_SC_int(OPA_int_t *ptr, int val)
{
int ret = 1; /* init to non-zero, will be reset to 0 if SC was unsuccessful */
__asm__ __volatile__ ("stwcx. %[val],0,%[ptr];\n"
"beq 1f;\n"
"li %[ret], 0;\n"
"1: ;\n"
: [ret] "=r" (ret)
: [ptr] "r" (&ptr->v), [val] "r" (val), "0" (ret)
: "cc", "memory");
return ret;
}
/* Pointer versions of LL/SC. */
/* Set OPA_SS (Size Suffix) which is used to choose between lwarx/stwcx and
* ldarx/stdcx when using 4 or 8 byte pointer operands */
#if OPA_SIZEOF_VOID_P == 4
#define OPA_SS "w"
#elif OPA_SIZEOF_VOID_P == 8
#define OPA_SS "d"
#else
#error OPA_SIZEOF_VOID_P is not 4 or 8
#endif
static _opa_inline void *OPA_LL_ptr(OPA_ptr_t *ptr)
{
void *val;
__asm__ __volatile__ ("l"OPA_SS"arx %[val],0,%[ptr]"
: [val] "=r" (val)
: [ptr] "r" (&ptr->v)
: "cc");
return val;
}
/* Returns non-zero if the store was successful, zero otherwise. */
static _opa_inline int OPA_SC_ptr(OPA_ptr_t *ptr, void *val)
{
int ret = 1; /* init to non-zero, will be reset to 0 if SC was unsuccessful */
__asm__ __volatile__ ("st"OPA_SS"cx. %[val],0,%[ptr];\n"
"beq 1f;\n"
"li %[ret], 0;\n"
"1: ;\n"
: [ret] "=r" (ret)
: [ptr] "r" (&ptr->v), [val] "r" (val), "0" (ret)
: "cc", "memory");
return ret;
}
#undef OPA_SS
/* necessary to enable LL/SC emulation support */
#define OPA_LL_SC_SUPPORTED 1
/* Implement all function using LL/SC */
#define OPA_add_int_by_llsc OPA_add_int
#define OPA_incr_int_by_llsc OPA_incr_int
#define OPA_decr_int_by_llsc OPA_decr_int
#define OPA_decr_and_test_int_by_llsc OPA_decr_and_test_int
#define OPA_fetch_and_add_int_by_llsc OPA_fetch_and_add_int
#define OPA_fetch_and_decr_int_by_llsc OPA_fetch_and_decr_int
#define OPA_fetch_and_incr_int_by_llsc OPA_fetch_and_incr_int
#define OPA_cas_ptr_by_llsc OPA_cas_ptr
#define OPA_cas_int_by_llsc OPA_cas_int
#define OPA_swap_ptr_by_llsc OPA_swap_ptr
#define OPA_swap_int_by_llsc OPA_swap_int
#include "opa_emulated.h"
#endif /* OPA_GCC_PPC_H_INCLUDED */

View File

@@ -1,443 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* Atomic primitives for SiCortex machines.
* Originally contributed by Lawrence Stewart at SiCortex.
*/
#ifndef OPA_GCC_SICORTEX_H
#define OPA_GCC_SICORTEX_H
/* FIXME do these need alignment? */
typedef struct { volatile int v; } OPA_int_t;
typedef struct { int * volatile v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
#define OPA_write_barrier() __asm__ __volatile__ ("sync" ::: "memory" )
#define OPA_read_barrier() __asm__ __volatile__ ("sync" ::: "memory" )
#define OPA_read_write_barrier() __asm__ __volatile__ ("sync" ::: "memory" )
#define OPA_compiler_barrier() __asm__ __volatile__ ( "" ::: "memory" )
/* Aligned loads and stores are atomic. */
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic. */
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = val;
}
/* Aligned loads and stores are atomic. */
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
return ptr->v;
}
/* Aligned loads and stores are atomic. */
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
/* NOTE: these acquire/release operations have not been optimized, I just threw
* down a full memory barrier. Spending much time working on the SiCortex platform
* doesn't really make a lot of sense since there are so few machines in
* existence and no more will ever be built. */
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr)
{
int tmp;
tmp = ptr->v;
OPA_read_write_barrier();
return tmp;
}
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val)
{
OPA_read_write_barrier();
ptr->v = val;
}
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr)
{
void *tmp;
tmp = ptr->v;
OPA_read_write_barrier();
return tmp;
}
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val)
{
OPA_read_write_barrier();
ptr->v = val;
}
#include <stdint.h>
/* ICE9 rev A1 chips have a low-frequency bug that causes LL to
fail. The workaround is to do the LL twice to make sure the data
is in L1
very few systems are affected
FIXME We should either remove the workaround entirely or make it
configurable/autodetected somehow. [goodell@ 2008/01/06]
*/
#define ICE9A_LLSC_WAR 0
/* For a description of the _opa_inline assembly constraints, see the MIPS section of:
http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Machine-Constraints.html#Machine-Constraints
relevant excerpt:
I - A signed 16-bit constant (for arithmetic instructions).
J - Integer zero.
Other _opa_inline asm knowledge worth remembering:
r - a general register operand is allowed
m - a memory address operand
& - earlyclobber; operand is modified before instruction is finished using the input operands
= - this operand is write-only
general format:
asm volatile ("instructions" : [outputs] : [inputs] : [clobbered_regs]);
"memory" should be included as a clobbered reg for most of these operations.
*/
/* Atomic increment of a 32 bit value, returning the old value */
static _opa_inline int OPA_shmemi_fetch_add_4(volatile int * v, int inc)
{
unsigned long result;
if (ICE9A_LLSC_WAR) {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: ll %0, %2 # fetch_add_4 \n"
" ll %0, %2 # fetch_add_4 \n"
" addu %1, %0, %3 \n"
" sc %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "Ir" (inc)
: "memory");
} else {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: ll %0, %2 # fetch_add_4 \n"
" addu %1, %0, %3 \n"
" sc %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "Ir" (inc)
: "memory");
}
return result;
}
/* Atomic increment of a 64 bit value, returning the old value */
static _opa_inline long int OPA_shmemi_fetch_add_8(volatile long int * v, long int inc)
{
unsigned long result;
if (ICE9A_LLSC_WAR) {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: lld %0, %2 # fetch_add_8 \n"
" lld %0, %2 # fetch_add_8 \n"
" daddu %1, %0, %3 \n"
" scd %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "Ir" (inc)
: "memory");
} else {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: lld %0, %2 # fetch_add_8 \n"
" daddu %1, %0, %3 \n"
" scd %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "Ir" (inc)
: "memory");
}
return result;
}
/* Atomic swap of a 32 bit value, returning the old contents */
static _opa_inline int OPA_shmemi_swap_4(volatile int * v, int val)
{
unsigned long result;
if (ICE9A_LLSC_WAR) {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: ll %0, %2 # swap_4 \n"
" ll %0, %2 # swap_4 \n"
" move %1, %3 \n"
" sc %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val)
: "memory");
} else {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: ll %0, %2 # swap_4 \n"
" move %1, %3 \n"
" sc %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val)
: "memory");
}
return result;
}
/* Atomic swap of a 64 bit value, returning the old contents */
static _opa_inline long int OPA_shmemi_swap_8(volatile long int * v, long int val)
{
unsigned long result;
if (ICE9A_LLSC_WAR) {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: lld %0, %2 # swap_8 \n"
" lld %0, %2 # swap_8 \n"
" move %1, %3 \n"
" scd %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val)
: "memory");
} else {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: lld %0, %2 # swap_8 \n"
" move %1, %3 \n"
" scd %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val)
: "memory");
}
return result;
}
/* Atomic compare and swap of a 32 bit value, returns the old value
* but only does the store of the val value if the old value == expect */
static _opa_inline int OPA_shmemi_cswap_4(volatile int * v, int expect, int val)
{
unsigned long result;
if (ICE9A_LLSC_WAR) {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: ll %0, %2 # cswap_4 \n"
" ll %0, %2 # cswap_4 \n"
" bne %0, %4, 1f \n"
" move %1, %3 \n"
" sc %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
"1: \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val), "Jr" (expect)
: "memory");
} else {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: ll %0, %2 # cswap_4 \n"
" bne %0, %4, 1f \n"
" move %1, %3 \n"
" sc %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
"1: \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val), "Jr" (expect)
: "memory");
}
return result;
}
/* Atomic compare and swap of a 64 bit value, returns the old value
* but only does the store of the val value if the old value == expect */
static _opa_inline long int OPA_shmemi_cswap_8(volatile long int * v, long int expect, long int val)
{
unsigned long result;
if (ICE9A_LLSC_WAR) {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: lld %0, %2 # cswap_8 \n"
" lld %0, %2 # cswap_8 \n"
" bne %0, %4, 1f \n"
" move %1, %3 \n"
" scd %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
"1: \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val), "Jr" (expect)
: "memory");
} else {
unsigned long temp;
__asm__ __volatile__(
" .set mips3 \n"
" .set noreorder \n"
"1: lld %0, %2 # cswap_8 \n"
" bne %0, %4, 1f \n"
" move %1, %3 \n"
" scd %1, %2 \n"
" beqz %1, 1b \n"
" nop \n"
" .set reorder \n"
"1: \n"
" .set mips0 \n"
: "=&r" (result), "=&r" (temp), "=m" (*v)
: "r" (val), "Jr" (expect)
: "memory");
}
return result;
}
static _opa_inline void OPA_add_int(OPA_int_t *ptr, int val)
{
OPA_shmemi_fetch_add_4(&ptr->v, val);
}
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, void *oldv, void *newv)
{
#if (OPA_SIZEOF_VOID_P == 8)
return((int *) OPA_shmemi_cswap_8((volatile long int *) &ptr->v, (uintptr_t) oldv, (uintptr_t) newv));
#elif (OPA_SIZEOF_VOID_P == 4)
return((int *) OPA_shmemi_cswap_4((volatile int *) &ptr->v, (uintptr_t) oldv, (uintptr_t) newv));
#else
#error "OPA_SIZEOF_VOID_P has an unexpected value :" OPA_QUOTE(OPA_SIZEOF_VOID_P);
#endif
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
return(OPA_shmemi_cswap_4(&ptr->v, oldv, newv));
}
static _opa_inline void OPA_decr_int(OPA_int_t *ptr)
{
OPA_shmemi_fetch_add_4(&ptr->v, -1);
}
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
int old = OPA_shmemi_fetch_add_4(&ptr->v, -1);
return (old == 1);
}
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
return(OPA_shmemi_fetch_add_4(&ptr->v, val));
}
static _opa_inline int OPA_fetch_and_decr_int(OPA_int_t *ptr)
{
return(OPA_shmemi_fetch_add_4(&ptr->v, -1));
}
static _opa_inline int OPA_fetch_and_incr_int(OPA_int_t *ptr)
{
return(OPA_shmemi_fetch_add_4(&ptr->v, 1));
}
static _opa_inline void OPA_incr_int(OPA_int_t *ptr)
{
OPA_shmemi_fetch_add_4(&ptr->v, 1);
}
static _opa_inline int *OPA_swap_ptr(OPA_ptr_t *ptr, int *val)
{
#if (OPA_SIZEOF_VOID_P == 8)
return((int *) OPA_shmemi_swap_8((volatile long int *) &ptr->v, (uintptr_t) val));
#elif (OPA_SIZEOF_VOID_P == 4)
return((int *) OPA_shmemi_swap_4((volatile int *) &ptr->v, (uintptr_t) val));
#else
#error "OPA_SIZEOF_VOID_P has an unexpected value :" OPA_QUOTE(OPA_SIZEOF_VOID_P);
#endif
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
return(OPA_shmemi_swap_4(&ptr->v, val));
}
#endif /* OPA_GCC_SICORTEX_H */

View File

@@ -1,154 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_NT_INTRINSICS_H_INCLUDED
#define OPA_NT_INTRINSICS_H_INCLUDED
#define WIN32_LEAN_AND_MEAN
#include<windows.h>
#include<intrin.h>
#include "mpi.h"
/* OPA_int_t uses a long because the compiler intrinsics operate on
* longs instead of ints. */
typedef struct { volatile long v; } OPA_int_t;
typedef struct { void * volatile v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
#define OPA_write_barrier() _WriteBarrier()
#define OPA_read_barrier() _ReadBarrier()
#define OPA_read_write_barrier() _ReadWriteBarrier()
/* FIXME there mut be a more efficient way to implement this. Is "asm {};"
* sufficient? */
#define OPA_compiler_barrier() _ReadWriteBarrier()
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
return ((int)ptr->v);
}
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = (long)val;
}
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
return ((void *)ptr->v);
}
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
/* NOTE: these acquire/release operations have not been optimized, I just threw
* down a full memory barrier. Someone with more Windows expertise should feel
* free to improve these (for Windows on x86/x86_64 these almost certainly only
* need to be compiler barriers). */
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr)
{
int tmp;
tmp = ptr->v;
OPA_read_write_barrier();
return tmp;
}
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val)
{
OPA_read_write_barrier();
ptr->v = val;
}
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr)
{
void *tmp;
tmp = ptr->v;
OPA_read_write_barrier();
return tmp;
}
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val)
{
OPA_read_write_barrier();
ptr->v = val;
}
static _opa_inline void OPA_add_int(OPA_int_t *ptr, int val)
{
_InterlockedExchangeAdd(&(ptr->v), val);
}
static _opa_inline void OPA_incr_int(OPA_int_t *ptr)
{
_InterlockedIncrement(&(ptr->v));
}
static _opa_inline void OPA_decr_int(OPA_int_t *ptr)
{
_InterlockedDecrement(&(ptr->v));
}
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
return (_InterlockedDecrement(&(ptr->v)) == 0);
}
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
return ((int)_InterlockedExchangeAdd(&(ptr->v), (long)val));
}
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, void *oldv, void *newv)
{
#if (OPA_SIZEOF_VOID_P == 4)
return ((void *)(LONG_PTR) _InterlockedCompareExchange((LONG volatile *)&(ptr->v),
(LONG)(LONG_PTR)newv,
(LONG)(LONG_PTR)oldv)
);
#elif (OPA_SIZEOF_VOID_P == 8)
return ((void *)(LONG_PTR)_InterlockedCompareExchange64((__int64 *)&(ptr->v),
(INT64)(LONG_PTR)newv,
(INT64)(LONG_PTR)oldv)
);
#else
#error "OPA_SIZEOF_VOID_P not valid"
#endif
}
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val)
{
#if (OPA_SIZEOF_VOID_P == 4)
return (void *)(LONG_PTR )_InterlockedExchange((LONG volatile *)&(ptr->v),
(LONG)(LONG_PTR)val);
#elif (OPA_SIZEOF_VOID_P == 8)
return (void *)(LONG_PTR)_InterlockedExchange64((LONG64 volatile *)&(ptr->v),
(INT64)(LONG_PTR)val);
#else
#error "OPA_SIZEOF_VOID_P not valid"
#endif
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
return _InterlockedCompareExchange((long *)&(ptr->v), newv, oldv);
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
return _InterlockedExchange(&(ptr->v), val);
}
/* Implement fetch_and_incr/decr using fetch_and_add (*_faa) */
#define OPA_fetch_and_incr_int_by_faa OPA_fetch_and_incr_int
#define OPA_fetch_and_decr_int_by_faa OPA_fetch_and_decr_int
#include "opa_emulated.h"
#endif /* defined(OPA_NT_INTRINSICS_H_INCLUDED) */

View File

@@ -1,135 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_SUN_ATOMIC_OPS_H_INCLUDED
#define OPA_SUN_ATOMIC_OPS_H_INCLUDED
#include <atomic.h>
typedef struct { volatile uint_t v; } OPA_int_t;
typedef struct { void * volatile v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
static _opa_inline int OPA_load_int(_opa_const OPA_int_t *ptr)
{
return (int)ptr->v;
}
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = (uint)val;
}
static _opa_inline void *OPA_load_ptr(_opa_const OPA_ptr_t *ptr)
{
return ptr->v;
}
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
static _opa_inline int OPA_load_acquire_int(_opa_const OPA_int_t *ptr)
{
int tmp;
tmp = ptr->v;
membar_enter();
return tmp;
}
static _opa_inline void OPA_store_release_int(OPA_int_t *ptr, int val)
{
membar_exit();
ptr->v = val;
}
static _opa_inline void *OPA_load_acquire_ptr(_opa_const OPA_ptr_t *ptr)
{
void *tmp;
tmp = ptr->v;
membar_enter();
return tmp;
}
static _opa_inline void OPA_store_release_ptr(OPA_ptr_t *ptr, void *val)
{
membar_exit();
ptr->v = val;
}
static _opa_inline void OPA_add_int(OPA_int_t *ptr, int val)
{
atomic_add_int(&ptr->v, val);
}
static _opa_inline void OPA_incr_int(OPA_int_t *ptr)
{
atomic_inc_uint(&ptr->v);
}
static _opa_inline void OPA_decr_int(OPA_int_t *ptr)
{
atomic_dec_uint(&ptr->v);
}
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
return atomic_dec_uint_nv(&ptr->v) == 0;
}
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
return (int)atomic_add_int_nv(&ptr->v, val) - val;
}
static _opa_inline int OPA_fetch_and_decr_int(OPA_int_t *ptr)
{
return (int)atomic_dec_uint_nv(&ptr->v) + 1;
}
static _opa_inline int OPA_fetch_and_incr_int(OPA_int_t *ptr)
{
return (int)atomic_inc_uint_nv(&ptr->v) - 1;
}
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, void *oldv, void *newv)
{
return atomic_cas_ptr(ptr, oldv, newv);
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
return (int)atomic_cas_uint(&ptr->v, (uint_t)oldv, (uint_t)newv);
}
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val)
{
return atomic_swap_ptr(ptr, val);
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
return (int)atomic_swap_uint(&ptr->v, (uint_t) val);
}
#define OPA_write_barrier() membar_producer()
#define OPA_read_barrier() membar_consumer()
#define OPA_read_write_barrier() do { membar_consumer(); membar_producer(); } while (0)
/* is this portable enough? */
#define OPA_compiler_barrier() __asm__ __volatile__ ( "" ::: "memory" )
#endif /* OPA_SUN_ATOMIC_OPS_H_INCLUDED */

View File

@@ -1,152 +0,0 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
/*
* (C) 2008 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
#ifndef OPA_UNSAFE_H_INCLUDED
#define OPA_UNSAFE_H_INCLUDED
/* NOTE: These types intentionally do not use volatile in order to provide even
* better performance. If a good use case for having unsafe operations with
* volatile types comes up, we can make two definitions that are conditional on
* something sort of like NDEBUG. [goodell@ 2009-08-18] */
typedef struct { int v; } OPA_int_t;
typedef struct { int *v; } OPA_ptr_t;
#define OPA_INT_T_INITIALIZER(val_) { (val_) }
#define OPA_PTR_T_INITIALIZER(val_) { (val_) }
/*
Unsafe Primitives
-----------------
These are versions of the atomic primitives that emulate the single-threaded
behavior of the primitives but do not attempt to provide any safety against
concurrent use. The primary use case for this implementation is to avoid
overhead without code changes in client libraries and applications that have
been compiled for single-threaded use only. They might also be useful for
testing (and testing of tests) in some cases.
Thanks to Josh Haberman for inspiring this primitives implementation.
*/
static _opa_inline int OPA_load_int(const OPA_int_t *ptr)
{
int retval;
retval = ptr->v;
return retval;
}
static _opa_inline void OPA_store_int(OPA_int_t *ptr, int val)
{
ptr->v = val;
}
static _opa_inline void *OPA_load_ptr(const OPA_ptr_t *ptr)
{
int *retval;
retval = ptr->v;
return retval;
}
static _opa_inline void OPA_store_ptr(OPA_ptr_t *ptr, void *val)
{
ptr->v = val;
}
/* no barrier needed, not even a compiler barrier */
#define OPA_load_acquire_int(ptr_) OPA_load_int((ptr_))
#define OPA_store_release_int(ptr_,val_) OPA_store_int((ptr_),(val_))
#define OPA_load_acquire_ptr(ptr_) OPA_load_ptr((ptr_))
#define OPA_store_release_ptr(ptr_,val_) OPA_store_ptr((ptr_),(val_))
static _opa_inline void OPA_add_int(OPA_int_t *ptr, int val)
{
ptr->v += val;
}
static _opa_inline void *OPA_cas_ptr(OPA_ptr_t *ptr, int *oldv, int *newv)
{
int *prev;
prev = ptr->v;
if (prev == oldv) {
ptr->v = newv;
}
return prev;
}
static _opa_inline int OPA_cas_int(OPA_int_t *ptr, int oldv, int newv)
{
int prev;
prev = ptr->v;
if (prev == oldv) {
ptr->v = newv;
}
return prev;
}
static _opa_inline int OPA_decr_and_test_int(OPA_int_t *ptr)
{
int new_val;
new_val = --(ptr->v);
return (0 == new_val);
}
static _opa_inline void OPA_decr_int(OPA_int_t *ptr)
{
--(ptr->v);
}
static _opa_inline int OPA_fetch_and_add_int(OPA_int_t *ptr, int val)
{
int prev;
prev = ptr->v;
ptr->v += val;
return prev;
}
static _opa_inline int OPA_fetch_and_decr_int(OPA_int_t *ptr)
{
int prev;
prev = ptr->v;
--(ptr->v);
return prev;
}
static _opa_inline int OPA_fetch_and_incr_int(OPA_int_t *ptr)
{
int prev;
prev = ptr->v;
++(ptr->v);
return prev;
}
static _opa_inline void OPA_incr_int(OPA_int_t *ptr)
{
++(ptr->v);
}
static _opa_inline void *OPA_swap_ptr(OPA_ptr_t *ptr, void *val)
{
int *prev;
prev = ptr->v;
ptr->v = val;
return prev;
}
static _opa_inline int OPA_swap_int(OPA_int_t *ptr, int val)
{
int prev;
prev = ptr->v;
ptr->v = val;
return (int)prev;
}
/* null barriers */
#define OPA_write_barrier() do {} while (0)
#define OPA_read_barrier() do {} while (0)
#define OPA_read_write_barrier() do {} while (0)
#define OPA_compiler_barrier() do {} while (0)
#endif /* !defined(OPA_UNSAFE_H_INCLUDED) */

Binary file not shown.

View File

@@ -1,5 +1,5 @@
# libmpi.la - a libtool library file
# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2
# Generated by libtool (GNU libtool) 2.4.6
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
@@ -8,7 +8,7 @@
dlname='libmpi.so.12'
# Names of this library.
library_names='libmpi.so.12.1.1 libmpi.so.12 libmpi.so'
library_names='libmpi.so.12.1.7 libmpi.so.12 libmpi.so'
# The name of the static archive.
old_library='libmpi.a'
@@ -17,7 +17,7 @@ old_library='libmpi.a'
inherited_linker_flags=''
# Libraries that this one depends upon.
dependency_libs=' -L/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/src/mpl -lrt -lpthread'
dependency_libs=' -lm -lpthread -lrt'
# Names of additional weak libraries provided by this library
weak_library_names=''
@@ -25,7 +25,7 @@ weak_library_names=''
# Version information for libmpi.
current=13
age=1
revision=1
revision=7
# Is this an already installed library?
installed=yes
@@ -38,4 +38,4 @@ dlopen=''
dlpreopen=''
# Directory that this library needs to be installed in:
libdir='/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install/lib64'
libdir='/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1/lib64'

View File

@@ -1 +1 @@
libmpi.so.12.1.1
libmpi.so.12.1.7

View File

@@ -1 +1 @@
libmpi.so.12.1.1
libmpi.so.12.1.7

Binary file not shown.

View File

@@ -1,15 +1,15 @@
# this gives access to the mpich header files
prefix=/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install
prefix=/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${prefix}/include
Name: mpich
Description: High Performance and portable MPI
Version: 3.2.1
Version: 3.3.1
URL: http://www.mcs.anl.gov/research/projects/mpich
Requires:
Libs: -Wl,-rpath -Wl,${exec_prefix}/lib64 -L${libdir} -lmpi -lrt -lpthread
Libs: -Wl,-rpath -Wl,${exec_prefix}/lib64 -L${libdir} -lmpi -lm -lpthread -lrt
Cflags: -I${includedir}
# pkg-config does not understand Cxxflags, etc. So we allow users to

View File

@@ -1,4 +1,4 @@
prefix=/home/brgirgis/Documents/code/thirdparty/mpi/mpich_/build/../release_install
prefix=/home/brgirgis/Documents/code/idiscovery/cpp-thirdparty-src/mpi/mpich/install/3.3.1
exec_prefix=${prefix}
libdir=${exec_prefix}/lib64
includedir=${prefix}/include

View File

@@ -19,533 +19,545 @@
<H2>MPI Routines and Constants</H2>
<TABLE>
<TR><TD><A HREF="www3/Constants.html">Constants</A></TD>
<TD><A HREF="www3/MPI_File_set_atomicity.html">MPI_File_set_atomicity</A></TD>
<TD><A HREF="www3/MPI_File_read_ordered_end.html">MPI_File_read_ordered_end</A></TD>
<TD><A HREF="www3/MPI_Rget_accumulate.html">MPI_Rget_accumulate</A></TD>
</TR>
<TR><TD><A HREF="www3/MPIR_Type_commit.html">MPIR_Type_commit</A></TD>
<TD><A HREF="www3/MPI_File_read_shared.html">MPI_File_read_shared</A></TD>
<TD><A HREF="www3/MPI_Rput.html">MPI_Rput</A></TD>
</TR>
<TR><TD><A HREF="www3/MPIX_Comm_agree.html">MPIX_Comm_agree</A></TD>
<TD><A HREF="www3/MPI_File_set_errhandler.html">MPI_File_set_errhandler</A></TD>
<TR><TD><A HREF="www3/MPIR_Type_contiguous.html">MPIR_Type_contiguous</A></TD>
<TD><A HREF="www3/MPI_File_seek.html">MPI_File_seek</A></TD>
<TD><A HREF="www3/MPI_Rsend.html">MPI_Rsend</A></TD>
</TR>
<TR><TD><A HREF="www3/MPIX_Comm_failure_ack.html">MPIX_Comm_failure_ack</A></TD>
<TD><A HREF="www3/MPI_File_set_info.html">MPI_File_set_info</A></TD>
<TR><TD><A HREF="www3/MPIR_Type_dup.html">MPIR_Type_dup</A></TD>
<TD><A HREF="www3/MPI_File_seek_shared.html">MPI_File_seek_shared</A></TD>
<TD><A HREF="www3/MPI_Rsend_init.html">MPI_Rsend_init</A></TD>
</TR>
<TR><TD><A HREF="www3/MPIX_Comm_failure_get_acked.html">MPIX_Comm_failure_get_acked</A></TD>
<TD><A HREF="www3/MPI_File_set_size.html">MPI_File_set_size</A></TD>
<TR><TD><A HREF="www3/MPIR_Type_get_contents.html">MPIR_Type_get_contents</A></TD>
<TD><A HREF="www3/MPI_File_set_atomicity.html">MPI_File_set_atomicity</A></TD>
<TD><A HREF="www3/MPI_Scan.html">MPI_Scan</A></TD>
</TR>
<TR><TD><A HREF="www3/MPIX_Comm_revoke.html">MPIX_Comm_revoke</A></TD>
<TD><A HREF="www3/MPI_File_set_view.html">MPI_File_set_view</A></TD>
<TR><TD><A HREF="www3/MPIR_Type_indexed.html">MPIR_Type_indexed</A></TD>
<TD><A HREF="www3/MPI_File_set_errhandler.html">MPI_File_set_errhandler</A></TD>
<TD><A HREF="www3/MPI_Scatter.html">MPI_Scatter</A></TD>
</TR>
<TR><TD><A HREF="www3/MPIX_Comm_shrink.html">MPIX_Comm_shrink</A></TD>
<TD><A HREF="www3/MPI_File_sync.html">MPI_File_sync</A></TD>
<TR><TD><A HREF="www3/MPIR_Type_struct.html">MPIR_Type_struct</A></TD>
<TD><A HREF="www3/MPI_File_set_info.html">MPI_File_set_info</A></TD>
<TD><A HREF="www3/MPI_Scatterv.html">MPI_Scatterv</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Abort.html">MPI_Abort</A></TD>
<TD><A HREF="www3/MPI_File_write.html">MPI_File_write</A></TD>
<TR><TD><A HREF="www3/MPIR_Type_vector.html">MPIR_Type_vector</A></TD>
<TD><A HREF="www3/MPI_File_set_size.html">MPI_File_set_size</A></TD>
<TD><A HREF="www3/MPI_Send.html">MPI_Send</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Accumulate.html">MPI_Accumulate</A></TD>
<TD><A HREF="www3/MPI_File_write_all.html">MPI_File_write_all</A></TD>
<TR><TD><A HREF="www3/MPIX_Comm_agree.html">MPIX_Comm_agree</A></TD>
<TD><A HREF="www3/MPI_File_set_view.html">MPI_File_set_view</A></TD>
<TD><A HREF="www3/MPI_Send_init.html">MPI_Send_init</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Add_error_class.html">MPI_Add_error_class</A></TD>
<TD><A HREF="www3/MPI_File_write_all_begin.html">MPI_File_write_all_begin</A></TD>
<TR><TD><A HREF="www3/MPIX_Comm_failure_ack.html">MPIX_Comm_failure_ack</A></TD>
<TD><A HREF="www3/MPI_File_sync.html">MPI_File_sync</A></TD>
<TD><A HREF="www3/MPI_Sendrecv.html">MPI_Sendrecv</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Add_error_code.html">MPI_Add_error_code</A></TD>
<TD><A HREF="www3/MPI_File_write_all_end.html">MPI_File_write_all_end</A></TD>
<TR><TD><A HREF="www3/MPIX_Comm_failure_get_acked.html">MPIX_Comm_failure_get_acked</A></TD>
<TD><A HREF="www3/MPI_File_write.html">MPI_File_write</A></TD>
<TD><A HREF="www3/MPI_Sendrecv_replace.html">MPI_Sendrecv_replace</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Add_error_string.html">MPI_Add_error_string</A></TD>
<TD><A HREF="www3/MPI_File_write_at.html">MPI_File_write_at</A></TD>
<TR><TD><A HREF="www3/MPIX_Comm_revoke.html">MPIX_Comm_revoke</A></TD>
<TD><A HREF="www3/MPI_File_write_all.html">MPI_File_write_all</A></TD>
<TD><A HREF="www3/MPI_Ssend.html">MPI_Ssend</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Address.html">MPI_Address</A></TD>
<TD><A HREF="www3/MPI_File_write_at_all.html">MPI_File_write_at_all</A></TD>
<TR><TD><A HREF="www3/MPIX_Comm_shrink.html">MPIX_Comm_shrink</A></TD>
<TD><A HREF="www3/MPI_File_write_all_begin.html">MPI_File_write_all_begin</A></TD>
<TD><A HREF="www3/MPI_Ssend_init.html">MPI_Ssend_init</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Aint_add.html">MPI_Aint_add</A></TD>
<TD><A HREF="www3/MPI_File_write_at_all_begin.html">MPI_File_write_at_all_begin</A></TD>
<TR><TD><A HREF="www3/MPI_Abort.html">MPI_Abort</A></TD>
<TD><A HREF="www3/MPI_File_write_all_end.html">MPI_File_write_all_end</A></TD>
<TD><A HREF="www3/MPI_Start.html">MPI_Start</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Aint_diff.html">MPI_Aint_diff</A></TD>
<TD><A HREF="www3/MPI_File_write_at_all_end.html">MPI_File_write_at_all_end</A></TD>
<TR><TD><A HREF="www3/MPI_Accumulate.html">MPI_Accumulate</A></TD>
<TD><A HREF="www3/MPI_File_write_at.html">MPI_File_write_at</A></TD>
<TD><A HREF="www3/MPI_Startall.html">MPI_Startall</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Allgather.html">MPI_Allgather</A></TD>
<TD><A HREF="www3/MPI_File_write_ordered.html">MPI_File_write_ordered</A></TD>
<TR><TD><A HREF="www3/MPI_Add_error_class.html">MPI_Add_error_class</A></TD>
<TD><A HREF="www3/MPI_File_write_at_all.html">MPI_File_write_at_all</A></TD>
<TD><A HREF="www3/MPI_Status_set_cancelled.html">MPI_Status_set_cancelled</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Allgatherv.html">MPI_Allgatherv</A></TD>
<TD><A HREF="www3/MPI_File_write_ordered_begin.html">MPI_File_write_ordered_begin</A></TD>
<TR><TD><A HREF="www3/MPI_Add_error_code.html">MPI_Add_error_code</A></TD>
<TD><A HREF="www3/MPI_File_write_at_all_begin.html">MPI_File_write_at_all_begin</A></TD>
<TD><A HREF="www3/MPI_Status_set_elements.html">MPI_Status_set_elements</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Alloc_mem.html">MPI_Alloc_mem</A></TD>
<TD><A HREF="www3/MPI_File_write_ordered_end.html">MPI_File_write_ordered_end</A></TD>
<TR><TD><A HREF="www3/MPI_Add_error_string.html">MPI_Add_error_string</A></TD>
<TD><A HREF="www3/MPI_File_write_at_all_end.html">MPI_File_write_at_all_end</A></TD>
<TD><A HREF="www3/MPI_Status_set_elements_x.html">MPI_Status_set_elements_x</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Allreduce.html">MPI_Allreduce</A></TD>
<TD><A HREF="www3/MPI_File_write_shared.html">MPI_File_write_shared</A></TD>
<TR><TD><A HREF="www3/MPI_Address.html">MPI_Address</A></TD>
<TD><A HREF="www3/MPI_File_write_ordered.html">MPI_File_write_ordered</A></TD>
<TD><A HREF="www3/MPI_T_category_changed.html">MPI_T_category_changed</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Alltoall.html">MPI_Alltoall</A></TD>
<TD><A HREF="www3/MPI_Finalize.html">MPI_Finalize</A></TD>
<TR><TD><A HREF="www3/MPI_Aint_add.html">MPI_Aint_add</A></TD>
<TD><A HREF="www3/MPI_File_write_ordered_begin.html">MPI_File_write_ordered_begin</A></TD>
<TD><A HREF="www3/MPI_T_category_get_categories.html">MPI_T_category_get_categories</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Alltoallv.html">MPI_Alltoallv</A></TD>
<TD><A HREF="www3/MPI_Finalized.html">MPI_Finalized</A></TD>
<TR><TD><A HREF="www3/MPI_Aint_diff.html">MPI_Aint_diff</A></TD>
<TD><A HREF="www3/MPI_File_write_ordered_end.html">MPI_File_write_ordered_end</A></TD>
<TD><A HREF="www3/MPI_T_category_get_cvars.html">MPI_T_category_get_cvars</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Alltoallw.html">MPI_Alltoallw</A></TD>
<TD><A HREF="www3/MPI_Free_mem.html">MPI_Free_mem</A></TD>
<TR><TD><A HREF="www3/MPI_Allgather.html">MPI_Allgather</A></TD>
<TD><A HREF="www3/MPI_File_write_shared.html">MPI_File_write_shared</A></TD>
<TD><A HREF="www3/MPI_T_category_get_info.html">MPI_T_category_get_info</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Attr_delete.html">MPI_Attr_delete</A></TD>
<TD><A HREF="www3/MPI_Gather.html">MPI_Gather</A></TD>
<TR><TD><A HREF="www3/MPI_Allgatherv.html">MPI_Allgatherv</A></TD>
<TD><A HREF="www3/MPI_Finalize.html">MPI_Finalize</A></TD>
<TD><A HREF="www3/MPI_T_category_get_num.html">MPI_T_category_get_num</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Attr_get.html">MPI_Attr_get</A></TD>
<TD><A HREF="www3/MPI_Gatherv.html">MPI_Gatherv</A></TD>
<TR><TD><A HREF="www3/MPI_Alloc_mem.html">MPI_Alloc_mem</A></TD>
<TD><A HREF="www3/MPI_Finalized.html">MPI_Finalized</A></TD>
<TD><A HREF="www3/MPI_T_category_get_pvars.html">MPI_T_category_get_pvars</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Attr_put.html">MPI_Attr_put</A></TD>
<TD><A HREF="www3/MPI_Get.html">MPI_Get</A></TD>
<TR><TD><A HREF="www3/MPI_Allreduce.html">MPI_Allreduce</A></TD>
<TD><A HREF="www3/MPI_Free_mem.html">MPI_Free_mem</A></TD>
<TD><A HREF="www3/MPI_T_cvar_get_info.html">MPI_T_cvar_get_info</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Barrier.html">MPI_Barrier</A></TD>
<TD><A HREF="www3/MPI_Get_accumulate.html">MPI_Get_accumulate</A></TD>
<TR><TD><A HREF="www3/MPI_Alltoall.html">MPI_Alltoall</A></TD>
<TD><A HREF="www3/MPI_Gather.html">MPI_Gather</A></TD>
<TD><A HREF="www3/MPI_T_cvar_get_num.html">MPI_T_cvar_get_num</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Bcast.html">MPI_Bcast</A></TD>
<TD><A HREF="www3/MPI_Get_address.html">MPI_Get_address</A></TD>
<TR><TD><A HREF="www3/MPI_Alltoallv.html">MPI_Alltoallv</A></TD>
<TD><A HREF="www3/MPI_Gatherv.html">MPI_Gatherv</A></TD>
<TD><A HREF="www3/MPI_T_cvar_handle_alloc.html">MPI_T_cvar_handle_alloc</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Bsend.html">MPI_Bsend</A></TD>
<TD><A HREF="www3/MPI_Get_count.html">MPI_Get_count</A></TD>
<TR><TD><A HREF="www3/MPI_Alltoallw.html">MPI_Alltoallw</A></TD>
<TD><A HREF="www3/MPI_Get.html">MPI_Get</A></TD>
<TD><A HREF="www3/MPI_T_cvar_handle_free.html">MPI_T_cvar_handle_free</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Bsend_init.html">MPI_Bsend_init</A></TD>
<TD><A HREF="www3/MPI_Get_elements.html">MPI_Get_elements</A></TD>
<TR><TD><A HREF="www3/MPI_Attr_delete.html">MPI_Attr_delete</A></TD>
<TD><A HREF="www3/MPI_Get_accumulate.html">MPI_Get_accumulate</A></TD>
<TD><A HREF="www3/MPI_T_cvar_read.html">MPI_T_cvar_read</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Buffer_attach.html">MPI_Buffer_attach</A></TD>
<TD><A HREF="www3/MPI_Get_elements_x.html">MPI_Get_elements_x</A></TD>
<TR><TD><A HREF="www3/MPI_Attr_get.html">MPI_Attr_get</A></TD>
<TD><A HREF="www3/MPI_Get_address.html">MPI_Get_address</A></TD>
<TD><A HREF="www3/MPI_T_cvar_write.html">MPI_T_cvar_write</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Buffer_detach.html">MPI_Buffer_detach</A></TD>
<TD><A HREF="www3/MPI_Get_library_version.html">MPI_Get_library_version</A></TD>
<TR><TD><A HREF="www3/MPI_Attr_put.html">MPI_Attr_put</A></TD>
<TD><A HREF="www3/MPI_Get_count.html">MPI_Get_count</A></TD>
<TD><A HREF="www3/MPI_T_enum_get_info.html">MPI_T_enum_get_info</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cancel.html">MPI_Cancel</A></TD>
<TD><A HREF="www3/MPI_Get_processor_name.html">MPI_Get_processor_name</A></TD>
<TR><TD><A HREF="www3/MPI_Barrier.html">MPI_Barrier</A></TD>
<TD><A HREF="www3/MPI_Get_elements.html">MPI_Get_elements</A></TD>
<TD><A HREF="www3/MPI_T_enum_get_item.html">MPI_T_enum_get_item</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cart_coords.html">MPI_Cart_coords</A></TD>
<TD><A HREF="www3/MPI_Get_version.html">MPI_Get_version</A></TD>
<TR><TD><A HREF="www3/MPI_Bcast.html">MPI_Bcast</A></TD>
<TD><A HREF="www3/MPI_Get_elements_x.html">MPI_Get_elements_x</A></TD>
<TD><A HREF="www3/MPI_T_finalize.html">MPI_T_finalize</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cart_create.html">MPI_Cart_create</A></TD>
<TD><A HREF="www3/MPI_Graph_create.html">MPI_Graph_create</A></TD>
<TR><TD><A HREF="www3/MPI_Bsend.html">MPI_Bsend</A></TD>
<TD><A HREF="www3/MPI_Get_library_version.html">MPI_Get_library_version</A></TD>
<TD><A HREF="www3/MPI_T_init_thread.html">MPI_T_init_thread</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cart_get.html">MPI_Cart_get</A></TD>
<TD><A HREF="www3/MPI_Graph_get.html">MPI_Graph_get</A></TD>
<TR><TD><A HREF="www3/MPI_Bsend_init.html">MPI_Bsend_init</A></TD>
<TD><A HREF="www3/MPI_Get_processor_name.html">MPI_Get_processor_name</A></TD>
<TD><A HREF="www3/MPI_T_pvar_get_info.html">MPI_T_pvar_get_info</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cart_map.html">MPI_Cart_map</A></TD>
<TD><A HREF="www3/MPI_Graph_map.html">MPI_Graph_map</A></TD>
<TR><TD><A HREF="www3/MPI_Buffer_attach.html">MPI_Buffer_attach</A></TD>
<TD><A HREF="www3/MPI_Get_version.html">MPI_Get_version</A></TD>
<TD><A HREF="www3/MPI_T_pvar_get_num.html">MPI_T_pvar_get_num</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cart_rank.html">MPI_Cart_rank</A></TD>
<TD><A HREF="www3/MPI_Graph_neighbors.html">MPI_Graph_neighbors</A></TD>
<TR><TD><A HREF="www3/MPI_Buffer_detach.html">MPI_Buffer_detach</A></TD>
<TD><A HREF="www3/MPI_Graph_create.html">MPI_Graph_create</A></TD>
<TD><A HREF="www3/MPI_T_pvar_handle_alloc.html">MPI_T_pvar_handle_alloc</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cart_shift.html">MPI_Cart_shift</A></TD>
<TD><A HREF="www3/MPI_Graph_neighbors_count.html">MPI_Graph_neighbors_count</A></TD>
<TR><TD><A HREF="www3/MPI_Cancel.html">MPI_Cancel</A></TD>
<TD><A HREF="www3/MPI_Graph_get.html">MPI_Graph_get</A></TD>
<TD><A HREF="www3/MPI_T_pvar_handle_free.html">MPI_T_pvar_handle_free</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cart_sub.html">MPI_Cart_sub</A></TD>
<TD><A HREF="www3/MPI_Graphdims_get.html">MPI_Graphdims_get</A></TD>
<TR><TD><A HREF="www3/MPI_Cart_coords.html">MPI_Cart_coords</A></TD>
<TD><A HREF="www3/MPI_Graph_map.html">MPI_Graph_map</A></TD>
<TD><A HREF="www3/MPI_T_pvar_read.html">MPI_T_pvar_read</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Cartdim_get.html">MPI_Cartdim_get</A></TD>
<TD><A HREF="www3/MPI_Grequest_complete.html">MPI_Grequest_complete</A></TD>
<TR><TD><A HREF="www3/MPI_Cart_create.html">MPI_Cart_create</A></TD>
<TD><A HREF="www3/MPI_Graph_neighbors.html">MPI_Graph_neighbors</A></TD>
<TD><A HREF="www3/MPI_T_pvar_readreset.html">MPI_T_pvar_readreset</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Close_port.html">MPI_Close_port</A></TD>
<TD><A HREF="www3/MPI_Grequest_start.html">MPI_Grequest_start</A></TD>
<TR><TD><A HREF="www3/MPI_Cart_get.html">MPI_Cart_get</A></TD>
<TD><A HREF="www3/MPI_Graph_neighbors_count.html">MPI_Graph_neighbors_count</A></TD>
<TD><A HREF="www3/MPI_T_pvar_reset.html">MPI_T_pvar_reset</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_accept.html">MPI_Comm_accept</A></TD>
<TD><A HREF="www3/MPI_Group_compare.html">MPI_Group_compare</A></TD>
<TR><TD><A HREF="www3/MPI_Cart_map.html">MPI_Cart_map</A></TD>
<TD><A HREF="www3/MPI_Graphdims_get.html">MPI_Graphdims_get</A></TD>
<TD><A HREF="www3/MPI_T_pvar_session_create.html">MPI_T_pvar_session_create</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_call_errhandler.html">MPI_Comm_call_errhandler</A></TD>
<TD><A HREF="www3/MPI_Group_difference.html">MPI_Group_difference</A></TD>
<TR><TD><A HREF="www3/MPI_Cart_rank.html">MPI_Cart_rank</A></TD>
<TD><A HREF="www3/MPI_Grequest_complete.html">MPI_Grequest_complete</A></TD>
<TD><A HREF="www3/MPI_T_pvar_session_free.html">MPI_T_pvar_session_free</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_compare.html">MPI_Comm_compare</A></TD>
<TD><A HREF="www3/MPI_Group_excl.html">MPI_Group_excl</A></TD>
<TR><TD><A HREF="www3/MPI_Cart_shift.html">MPI_Cart_shift</A></TD>
<TD><A HREF="www3/MPI_Grequest_start.html">MPI_Grequest_start</A></TD>
<TD><A HREF="www3/MPI_T_pvar_start.html">MPI_T_pvar_start</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_connect.html">MPI_Comm_connect</A></TD>
<TD><A HREF="www3/MPI_Group_free.html">MPI_Group_free</A></TD>
<TR><TD><A HREF="www3/MPI_Cart_sub.html">MPI_Cart_sub</A></TD>
<TD><A HREF="www3/MPI_Group_compare.html">MPI_Group_compare</A></TD>
<TD><A HREF="www3/MPI_T_pvar_stop.html">MPI_T_pvar_stop</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_create.html">MPI_Comm_create</A></TD>
<TD><A HREF="www3/MPI_Group_incl.html">MPI_Group_incl</A></TD>
<TR><TD><A HREF="www3/MPI_Cartdim_get.html">MPI_Cartdim_get</A></TD>
<TD><A HREF="www3/MPI_Group_difference.html">MPI_Group_difference</A></TD>
<TD><A HREF="www3/MPI_T_pvar_write.html">MPI_T_pvar_write</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_create_errhandler.html">MPI_Comm_create_errhandler</A></TD>
<TD><A HREF="www3/MPI_Group_intersection.html">MPI_Group_intersection</A></TD>
<TR><TD><A HREF="www3/MPI_Close_port.html">MPI_Close_port</A></TD>
<TD><A HREF="www3/MPI_Group_excl.html">MPI_Group_excl</A></TD>
<TD><A HREF="www3/MPI_Test.html">MPI_Test</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_create_group.html">MPI_Comm_create_group</A></TD>
<TD><A HREF="www3/MPI_Group_range_excl.html">MPI_Group_range_excl</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_accept.html">MPI_Comm_accept</A></TD>
<TD><A HREF="www3/MPI_Group_free.html">MPI_Group_free</A></TD>
<TD><A HREF="www3/MPI_Test_cancelled.html">MPI_Test_cancelled</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_create_keyval.html">MPI_Comm_create_keyval</A></TD>
<TD><A HREF="www3/MPI_Group_range_incl.html">MPI_Group_range_incl</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_call_errhandler.html">MPI_Comm_call_errhandler</A></TD>
<TD><A HREF="www3/MPI_Group_incl.html">MPI_Group_incl</A></TD>
<TD><A HREF="www3/MPI_Testall.html">MPI_Testall</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_delete_attr.html">MPI_Comm_delete_attr</A></TD>
<TD><A HREF="www3/MPI_Group_rank.html">MPI_Group_rank</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_compare.html">MPI_Comm_compare</A></TD>
<TD><A HREF="www3/MPI_Group_intersection.html">MPI_Group_intersection</A></TD>
<TD><A HREF="www3/MPI_Testany.html">MPI_Testany</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_disconnect.html">MPI_Comm_disconnect</A></TD>
<TD><A HREF="www3/MPI_Group_size.html">MPI_Group_size</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_connect.html">MPI_Comm_connect</A></TD>
<TD><A HREF="www3/MPI_Group_range_excl.html">MPI_Group_range_excl</A></TD>
<TD><A HREF="www3/MPI_Testsome.html">MPI_Testsome</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_dup.html">MPI_Comm_dup</A></TD>
<TD><A HREF="www3/MPI_Group_translate_ranks.html">MPI_Group_translate_ranks</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_create.html">MPI_Comm_create</A></TD>
<TD><A HREF="www3/MPI_Group_range_incl.html">MPI_Group_range_incl</A></TD>
<TD><A HREF="www3/MPI_Topo_test.html">MPI_Topo_test</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_dup_with_info.html">MPI_Comm_dup_with_info</A></TD>
<TD><A HREF="www3/MPI_Group_union.html">MPI_Group_union</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_create_errhandler.html">MPI_Comm_create_errhandler</A></TD>
<TD><A HREF="www3/MPI_Group_rank.html">MPI_Group_rank</A></TD>
<TD><A HREF="www3/MPI_Type_commit.html">MPI_Type_commit</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_free.html">MPI_Comm_free</A></TD>
<TD><A HREF="www3/MPI_Iallgather.html">MPI_Iallgather</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_create_group.html">MPI_Comm_create_group</A></TD>
<TD><A HREF="www3/MPI_Group_size.html">MPI_Group_size</A></TD>
<TD><A HREF="www3/MPI_Type_contiguous.html">MPI_Type_contiguous</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_free_keyval.html">MPI_Comm_free_keyval</A></TD>
<TD><A HREF="www3/MPI_Iallgatherv.html">MPI_Iallgatherv</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_create_keyval.html">MPI_Comm_create_keyval</A></TD>
<TD><A HREF="www3/MPI_Group_translate_ranks.html">MPI_Group_translate_ranks</A></TD>
<TD><A HREF="www3/MPI_Type_create_darray.html">MPI_Type_create_darray</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_get_attr.html">MPI_Comm_get_attr</A></TD>
<TD><A HREF="www3/MPI_Iallreduce.html">MPI_Iallreduce</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_delete_attr.html">MPI_Comm_delete_attr</A></TD>
<TD><A HREF="www3/MPI_Group_union.html">MPI_Group_union</A></TD>
<TD><A HREF="www3/MPI_Type_create_hindexed.html">MPI_Type_create_hindexed</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_get_errhandler.html">MPI_Comm_get_errhandler</A></TD>
<TD><A HREF="www3/MPI_Ialltoall.html">MPI_Ialltoall</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_disconnect.html">MPI_Comm_disconnect</A></TD>
<TD><A HREF="www3/MPI_Iallgather.html">MPI_Iallgather</A></TD>
<TD><A HREF="www3/MPI_Type_create_hindexed_block.html">MPI_Type_create_hindexed_block</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_get_info.html">MPI_Comm_get_info</A></TD>
<TD><A HREF="www3/MPI_Ialltoallv.html">MPI_Ialltoallv</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_dup.html">MPI_Comm_dup</A></TD>
<TD><A HREF="www3/MPI_Iallgatherv.html">MPI_Iallgatherv</A></TD>
<TD><A HREF="www3/MPI_Type_create_hvector.html">MPI_Type_create_hvector</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_get_name.html">MPI_Comm_get_name</A></TD>
<TD><A HREF="www3/MPI_Ialltoallw.html">MPI_Ialltoallw</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_dup_with_info.html">MPI_Comm_dup_with_info</A></TD>
<TD><A HREF="www3/MPI_Iallreduce.html">MPI_Iallreduce</A></TD>
<TD><A HREF="www3/MPI_Type_create_indexed_block.html">MPI_Type_create_indexed_block</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_get_parent.html">MPI_Comm_get_parent</A></TD>
<TD><A HREF="www3/MPI_Ibarrier.html">MPI_Ibarrier</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_free.html">MPI_Comm_free</A></TD>
<TD><A HREF="www3/MPI_Ialltoall.html">MPI_Ialltoall</A></TD>
<TD><A HREF="www3/MPI_Type_create_keyval.html">MPI_Type_create_keyval</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_group.html">MPI_Comm_group</A></TD>
<TD><A HREF="www3/MPI_Ibcast.html">MPI_Ibcast</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_free_keyval.html">MPI_Comm_free_keyval</A></TD>
<TD><A HREF="www3/MPI_Ialltoallv.html">MPI_Ialltoallv</A></TD>
<TD><A HREF="www3/MPI_Type_create_resized.html">MPI_Type_create_resized</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_idup.html">MPI_Comm_idup</A></TD>
<TD><A HREF="www3/MPI_Ibsend.html">MPI_Ibsend</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_get_attr.html">MPI_Comm_get_attr</A></TD>
<TD><A HREF="www3/MPI_Ialltoallw.html">MPI_Ialltoallw</A></TD>
<TD><A HREF="www3/MPI_Type_create_struct.html">MPI_Type_create_struct</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_join.html">MPI_Comm_join</A></TD>
<TD><A HREF="www3/MPI_Iexscan.html">MPI_Iexscan</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_get_errhandler.html">MPI_Comm_get_errhandler</A></TD>
<TD><A HREF="www3/MPI_Ibarrier.html">MPI_Ibarrier</A></TD>
<TD><A HREF="www3/MPI_Type_create_subarray.html">MPI_Type_create_subarray</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_rank.html">MPI_Comm_rank</A></TD>
<TD><A HREF="www3/MPI_Igather.html">MPI_Igather</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_get_info.html">MPI_Comm_get_info</A></TD>
<TD><A HREF="www3/MPI_Ibcast.html">MPI_Ibcast</A></TD>
<TD><A HREF="www3/MPI_Type_delete_attr.html">MPI_Type_delete_attr</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_remote_group.html">MPI_Comm_remote_group</A></TD>
<TD><A HREF="www3/MPI_Igatherv.html">MPI_Igatherv</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_get_name.html">MPI_Comm_get_name</A></TD>
<TD><A HREF="www3/MPI_Ibsend.html">MPI_Ibsend</A></TD>
<TD><A HREF="www3/MPI_Type_dup.html">MPI_Type_dup</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_remote_size.html">MPI_Comm_remote_size</A></TD>
<TD><A HREF="www3/MPI_Improbe.html">MPI_Improbe</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_get_parent.html">MPI_Comm_get_parent</A></TD>
<TD><A HREF="www3/MPI_Iexscan.html">MPI_Iexscan</A></TD>
<TD><A HREF="www3/MPI_Type_extent.html">MPI_Type_extent</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_set_attr.html">MPI_Comm_set_attr</A></TD>
<TD><A HREF="www3/MPI_Imrecv.html">MPI_Imrecv</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_group.html">MPI_Comm_group</A></TD>
<TD><A HREF="www3/MPI_Igather.html">MPI_Igather</A></TD>
<TD><A HREF="www3/MPI_Type_free.html">MPI_Type_free</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_set_errhandler.html">MPI_Comm_set_errhandler</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_allgather.html">MPI_Ineighbor_allgather</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_idup.html">MPI_Comm_idup</A></TD>
<TD><A HREF="www3/MPI_Igatherv.html">MPI_Igatherv</A></TD>
<TD><A HREF="www3/MPI_Type_free_keyval.html">MPI_Type_free_keyval</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_set_info.html">MPI_Comm_set_info</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_allgatherv.html">MPI_Ineighbor_allgatherv</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_join.html">MPI_Comm_join</A></TD>
<TD><A HREF="www3/MPI_Improbe.html">MPI_Improbe</A></TD>
<TD><A HREF="www3/MPI_Type_get_attr.html">MPI_Type_get_attr</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_set_name.html">MPI_Comm_set_name</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_alltoall.html">MPI_Ineighbor_alltoall</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_rank.html">MPI_Comm_rank</A></TD>
<TD><A HREF="www3/MPI_Imrecv.html">MPI_Imrecv</A></TD>
<TD><A HREF="www3/MPI_Type_get_contents.html">MPI_Type_get_contents</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_size.html">MPI_Comm_size</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_alltoallv.html">MPI_Ineighbor_alltoallv</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_remote_group.html">MPI_Comm_remote_group</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_allgather.html">MPI_Ineighbor_allgather</A></TD>
<TD><A HREF="www3/MPI_Type_get_envelope.html">MPI_Type_get_envelope</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_spawn.html">MPI_Comm_spawn</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_alltoallw.html">MPI_Ineighbor_alltoallw</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_remote_size.html">MPI_Comm_remote_size</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_allgatherv.html">MPI_Ineighbor_allgatherv</A></TD>
<TD><A HREF="www3/MPI_Type_get_extent.html">MPI_Type_get_extent</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_spawn_multiple.html">MPI_Comm_spawn_multiple</A></TD>
<TD><A HREF="www3/MPI_Info_create.html">MPI_Info_create</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_set_attr.html">MPI_Comm_set_attr</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_alltoall.html">MPI_Ineighbor_alltoall</A></TD>
<TD><A HREF="www3/MPI_Type_get_extent_x.html">MPI_Type_get_extent_x</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_split.html">MPI_Comm_split</A></TD>
<TD><A HREF="www3/MPI_Info_delete.html">MPI_Info_delete</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_set_errhandler.html">MPI_Comm_set_errhandler</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_alltoallv.html">MPI_Ineighbor_alltoallv</A></TD>
<TD><A HREF="www3/MPI_Type_get_name.html">MPI_Type_get_name</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_split_type.html">MPI_Comm_split_type</A></TD>
<TD><A HREF="www3/MPI_Info_dup.html">MPI_Info_dup</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_set_info.html">MPI_Comm_set_info</A></TD>
<TD><A HREF="www3/MPI_Ineighbor_alltoallw.html">MPI_Ineighbor_alltoallw</A></TD>
<TD><A HREF="www3/MPI_Type_get_true_extent.html">MPI_Type_get_true_extent</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Comm_test_inter.html">MPI_Comm_test_inter</A></TD>
<TD><A HREF="www3/MPI_Info_free.html">MPI_Info_free</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_set_name.html">MPI_Comm_set_name</A></TD>
<TD><A HREF="www3/MPI_Info_create.html">MPI_Info_create</A></TD>
<TD><A HREF="www3/MPI_Type_get_true_extent_x.html">MPI_Type_get_true_extent_x</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Compare_and_swap.html">MPI_Compare_and_swap</A></TD>
<TD><A HREF="www3/MPI_Info_get.html">MPI_Info_get</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_size.html">MPI_Comm_size</A></TD>
<TD><A HREF="www3/MPI_Info_delete.html">MPI_Info_delete</A></TD>
<TD><A HREF="www3/MPI_Type_hindexed.html">MPI_Type_hindexed</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Dims_create.html">MPI_Dims_create</A></TD>
<TD><A HREF="www3/MPI_Info_get_nkeys.html">MPI_Info_get_nkeys</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_spawn.html">MPI_Comm_spawn</A></TD>
<TD><A HREF="www3/MPI_Info_dup.html">MPI_Info_dup</A></TD>
<TD><A HREF="www3/MPI_Type_hvector.html">MPI_Type_hvector</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Dist_graph_create.html">MPI_Dist_graph_create</A></TD>
<TD><A HREF="www3/MPI_Info_get_nthkey.html">MPI_Info_get_nthkey</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_spawn_multiple.html">MPI_Comm_spawn_multiple</A></TD>
<TD><A HREF="www3/MPI_Info_free.html">MPI_Info_free</A></TD>
<TD><A HREF="www3/MPI_Type_indexed.html">MPI_Type_indexed</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Dist_graph_create_adjacent.html">MPI_Dist_graph_create_adjacent</A></TD>
<TD><A HREF="www3/MPI_Info_get_valuelen.html">MPI_Info_get_valuelen</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_split.html">MPI_Comm_split</A></TD>
<TD><A HREF="www3/MPI_Info_get.html">MPI_Info_get</A></TD>
<TD><A HREF="www3/MPI_Type_lb.html">MPI_Type_lb</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Dist_graph_neighbors.html">MPI_Dist_graph_neighbors</A></TD>
<TD><A HREF="www3/MPI_Info_set.html">MPI_Info_set</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_split_type.html">MPI_Comm_split_type</A></TD>
<TD><A HREF="www3/MPI_Info_get_nkeys.html">MPI_Info_get_nkeys</A></TD>
<TD><A HREF="www3/MPI_Type_match_size.html">MPI_Type_match_size</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Dist_graph_neighbors_count.html">MPI_Dist_graph_neighbors_count</A></TD>
<TD><A HREF="www3/MPI_Init.html">MPI_Init</A></TD>
<TR><TD><A HREF="www3/MPI_Comm_test_inter.html">MPI_Comm_test_inter</A></TD>
<TD><A HREF="www3/MPI_Info_get_nthkey.html">MPI_Info_get_nthkey</A></TD>
<TD><A HREF="www3/MPI_Type_set_attr.html">MPI_Type_set_attr</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Errhandler_create.html">MPI_Errhandler_create</A></TD>
<TD><A HREF="www3/MPI_Init_thread.html">MPI_Init_thread</A></TD>
<TR><TD><A HREF="www3/MPI_Compare_and_swap.html">MPI_Compare_and_swap</A></TD>
<TD><A HREF="www3/MPI_Info_get_valuelen.html">MPI_Info_get_valuelen</A></TD>
<TD><A HREF="www3/MPI_Type_set_name.html">MPI_Type_set_name</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Errhandler_free.html">MPI_Errhandler_free</A></TD>
<TD><A HREF="www3/MPI_Initialized.html">MPI_Initialized</A></TD>
<TR><TD><A HREF="www3/MPI_Dims_create.html">MPI_Dims_create</A></TD>
<TD><A HREF="www3/MPI_Info_set.html">MPI_Info_set</A></TD>
<TD><A HREF="www3/MPI_Type_size.html">MPI_Type_size</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Errhandler_get.html">MPI_Errhandler_get</A></TD>
<TD><A HREF="www3/MPI_Intercomm_create.html">MPI_Intercomm_create</A></TD>
<TR><TD><A HREF="www3/MPI_Dist_graph_create.html">MPI_Dist_graph_create</A></TD>
<TD><A HREF="www3/MPI_Init.html">MPI_Init</A></TD>
<TD><A HREF="www3/MPI_Type_size_x.html">MPI_Type_size_x</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Errhandler_set.html">MPI_Errhandler_set</A></TD>
<TD><A HREF="www3/MPI_Intercomm_merge.html">MPI_Intercomm_merge</A></TD>
<TR><TD><A HREF="www3/MPI_Dist_graph_create_adjacent.html">MPI_Dist_graph_create_adjacent</A></TD>
<TD><A HREF="www3/MPI_Init_thread.html">MPI_Init_thread</A></TD>
<TD><A HREF="www3/MPI_Type_struct.html">MPI_Type_struct</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Error_class.html">MPI_Error_class</A></TD>
<TD><A HREF="www3/MPI_Iprobe.html">MPI_Iprobe</A></TD>
<TR><TD><A HREF="www3/MPI_Dist_graph_neighbors.html">MPI_Dist_graph_neighbors</A></TD>
<TD><A HREF="www3/MPI_Initialized.html">MPI_Initialized</A></TD>
<TD><A HREF="www3/MPI_Type_ub.html">MPI_Type_ub</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Error_string.html">MPI_Error_string</A></TD>
<TD><A HREF="www3/MPI_Irecv.html">MPI_Irecv</A></TD>
<TR><TD><A HREF="www3/MPI_Dist_graph_neighbors_count.html">MPI_Dist_graph_neighbors_count</A></TD>
<TD><A HREF="www3/MPI_Intercomm_create.html">MPI_Intercomm_create</A></TD>
<TD><A HREF="www3/MPI_Type_vector.html">MPI_Type_vector</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Exscan.html">MPI_Exscan</A></TD>
<TD><A HREF="www3/MPI_Ireduce.html">MPI_Ireduce</A></TD>
<TR><TD><A HREF="www3/MPI_Errhandler_create.html">MPI_Errhandler_create</A></TD>
<TD><A HREF="www3/MPI_Intercomm_merge.html">MPI_Intercomm_merge</A></TD>
<TD><A HREF="www3/MPI_Unpack.html">MPI_Unpack</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_Fetch_and_op.html">MPI_Fetch_and_op</A></TD>
<TD><A HREF="www3/MPI_Ireduce_scatter.html">MPI_Ireduce_scatter</A></TD>
<TR><TD><A HREF="www3/MPI_Errhandler_free.html">MPI_Errhandler_free</A></TD>
<TD><A HREF="www3/MPI_Iprobe.html">MPI_Iprobe</A></TD>
<TD><A HREF="www3/MPI_Unpack_external.html">MPI_Unpack_external</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_c2f.html">MPI_File_c2f</A></TD>
<TD><A HREF="www3/MPI_Ireduce_scatter_block.html">MPI_Ireduce_scatter_block</A></TD>
<TR><TD><A HREF="www3/MPI_Errhandler_get.html">MPI_Errhandler_get</A></TD>
<TD><A HREF="www3/MPI_Irecv.html">MPI_Irecv</A></TD>
<TD><A HREF="www3/MPI_Unpublish_name.html">MPI_Unpublish_name</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_call_errhandler.html">MPI_File_call_errhandler</A></TD>
<TD><A HREF="www3/MPI_Irsend.html">MPI_Irsend</A></TD>
<TR><TD><A HREF="www3/MPI_Errhandler_set.html">MPI_Errhandler_set</A></TD>
<TD><A HREF="www3/MPI_Ireduce.html">MPI_Ireduce</A></TD>
<TD><A HREF="www3/MPI_Wait.html">MPI_Wait</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_close.html">MPI_File_close</A></TD>
<TD><A HREF="www3/MPI_Is_thread_main.html">MPI_Is_thread_main</A></TD>
<TR><TD><A HREF="www3/MPI_Error_class.html">MPI_Error_class</A></TD>
<TD><A HREF="www3/MPI_Ireduce_scatter.html">MPI_Ireduce_scatter</A></TD>
<TD><A HREF="www3/MPI_Waitall.html">MPI_Waitall</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_create_errhandler.html">MPI_File_create_errhandler</A></TD>
<TD><A HREF="www3/MPI_Iscan.html">MPI_Iscan</A></TD>
<TR><TD><A HREF="www3/MPI_Error_string.html">MPI_Error_string</A></TD>
<TD><A HREF="www3/MPI_Ireduce_scatter_block.html">MPI_Ireduce_scatter_block</A></TD>
<TD><A HREF="www3/MPI_Waitany.html">MPI_Waitany</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_delete.html">MPI_File_delete</A></TD>
<TD><A HREF="www3/MPI_Iscatter.html">MPI_Iscatter</A></TD>
<TR><TD><A HREF="www3/MPI_Exscan.html">MPI_Exscan</A></TD>
<TD><A HREF="www3/MPI_Irsend.html">MPI_Irsend</A></TD>
<TD><A HREF="www3/MPI_Waitsome.html">MPI_Waitsome</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_f2c.html">MPI_File_f2c</A></TD>
<TD><A HREF="www3/MPI_Iscatterv.html">MPI_Iscatterv</A></TD>
<TR><TD><A HREF="www3/MPI_Fetch_and_op.html">MPI_Fetch_and_op</A></TD>
<TD><A HREF="www3/MPI_Is_thread_main.html">MPI_Is_thread_main</A></TD>
<TD><A HREF="www3/MPI_Win_allocate.html">MPI_Win_allocate</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_amode.html">MPI_File_get_amode</A></TD>
<TD><A HREF="www3/MPI_Isend.html">MPI_Isend</A></TD>
<TR><TD><A HREF="www3/MPI_File_c2f.html">MPI_File_c2f</A></TD>
<TD><A HREF="www3/MPI_Iscan.html">MPI_Iscan</A></TD>
<TD><A HREF="www3/MPI_Win_allocate_shared.html">MPI_Win_allocate_shared</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_atomicity.html">MPI_File_get_atomicity</A></TD>
<TD><A HREF="www3/MPI_Issend.html">MPI_Issend</A></TD>
<TR><TD><A HREF="www3/MPI_File_call_errhandler.html">MPI_File_call_errhandler</A></TD>
<TD><A HREF="www3/MPI_Iscatter.html">MPI_Iscatter</A></TD>
<TD><A HREF="www3/MPI_Win_attach.html">MPI_Win_attach</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_byte_offset.html">MPI_File_get_byte_offset</A></TD>
<TD><A HREF="www3/MPI_Keyval_create.html">MPI_Keyval_create</A></TD>
<TR><TD><A HREF="www3/MPI_File_close.html">MPI_File_close</A></TD>
<TD><A HREF="www3/MPI_Iscatterv.html">MPI_Iscatterv</A></TD>
<TD><A HREF="www3/MPI_Win_call_errhandler.html">MPI_Win_call_errhandler</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_errhandler.html">MPI_File_get_errhandler</A></TD>
<TD><A HREF="www3/MPI_Keyval_free.html">MPI_Keyval_free</A></TD>
<TR><TD><A HREF="www3/MPI_File_create_errhandler.html">MPI_File_create_errhandler</A></TD>
<TD><A HREF="www3/MPI_Isend.html">MPI_Isend</A></TD>
<TD><A HREF="www3/MPI_Win_complete.html">MPI_Win_complete</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_group.html">MPI_File_get_group</A></TD>
<TD><A HREF="www3/MPI_Lookup_name.html">MPI_Lookup_name</A></TD>
<TR><TD><A HREF="www3/MPI_File_delete.html">MPI_File_delete</A></TD>
<TD><A HREF="www3/MPI_Issend.html">MPI_Issend</A></TD>
<TD><A HREF="www3/MPI_Win_create.html">MPI_Win_create</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_info.html">MPI_File_get_info</A></TD>
<TD><A HREF="www3/MPI_Mprobe.html">MPI_Mprobe</A></TD>
<TR><TD><A HREF="www3/MPI_File_f2c.html">MPI_File_f2c</A></TD>
<TD><A HREF="www3/MPI_Keyval_create.html">MPI_Keyval_create</A></TD>
<TD><A HREF="www3/MPI_Win_create_dynamic.html">MPI_Win_create_dynamic</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_position.html">MPI_File_get_position</A></TD>
<TD><A HREF="www3/MPI_Mrecv.html">MPI_Mrecv</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_amode.html">MPI_File_get_amode</A></TD>
<TD><A HREF="www3/MPI_Keyval_free.html">MPI_Keyval_free</A></TD>
<TD><A HREF="www3/MPI_Win_create_errhandler.html">MPI_Win_create_errhandler</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_position_shared.html">MPI_File_get_position_shared</A></TD>
<TD><A HREF="www3/MPI_Neighbor_allgather.html">MPI_Neighbor_allgather</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_atomicity.html">MPI_File_get_atomicity</A></TD>
<TD><A HREF="www3/MPI_Lookup_name.html">MPI_Lookup_name</A></TD>
<TD><A HREF="www3/MPI_Win_create_keyval.html">MPI_Win_create_keyval</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_size.html">MPI_File_get_size</A></TD>
<TD><A HREF="www3/MPI_Neighbor_allgatherv.html">MPI_Neighbor_allgatherv</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_byte_offset.html">MPI_File_get_byte_offset</A></TD>
<TD><A HREF="www3/MPI_Mprobe.html">MPI_Mprobe</A></TD>
<TD><A HREF="www3/MPI_Win_delete_attr.html">MPI_Win_delete_attr</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_type_extent.html">MPI_File_get_type_extent</A></TD>
<TD><A HREF="www3/MPI_Neighbor_alltoall.html">MPI_Neighbor_alltoall</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_errhandler.html">MPI_File_get_errhandler</A></TD>
<TD><A HREF="www3/MPI_Mrecv.html">MPI_Mrecv</A></TD>
<TD><A HREF="www3/MPI_Win_detach.html">MPI_Win_detach</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_get_view.html">MPI_File_get_view</A></TD>
<TD><A HREF="www3/MPI_Neighbor_alltoallv.html">MPI_Neighbor_alltoallv</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_group.html">MPI_File_get_group</A></TD>
<TD><A HREF="www3/MPI_Neighbor_allgather.html">MPI_Neighbor_allgather</A></TD>
<TD><A HREF="www3/MPI_Win_fence.html">MPI_Win_fence</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iread.html">MPI_File_iread</A></TD>
<TD><A HREF="www3/MPI_Neighbor_alltoallw.html">MPI_Neighbor_alltoallw</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_info.html">MPI_File_get_info</A></TD>
<TD><A HREF="www3/MPI_Neighbor_allgatherv.html">MPI_Neighbor_allgatherv</A></TD>
<TD><A HREF="www3/MPI_Win_flush.html">MPI_Win_flush</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iread_all.html">MPI_File_iread_all</A></TD>
<TD><A HREF="www3/MPI_Op_commute.html">MPI_Op_commute</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_position.html">MPI_File_get_position</A></TD>
<TD><A HREF="www3/MPI_Neighbor_alltoall.html">MPI_Neighbor_alltoall</A></TD>
<TD><A HREF="www3/MPI_Win_flush_all.html">MPI_Win_flush_all</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iread_at.html">MPI_File_iread_at</A></TD>
<TD><A HREF="www3/MPI_Op_create.html">MPI_Op_create</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_position_shared.html">MPI_File_get_position_shared</A></TD>
<TD><A HREF="www3/MPI_Neighbor_alltoallv.html">MPI_Neighbor_alltoallv</A></TD>
<TD><A HREF="www3/MPI_Win_flush_local.html">MPI_Win_flush_local</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iread_at_all.html">MPI_File_iread_at_all</A></TD>
<TD><A HREF="www3/MPI_Op_free.html">MPI_Op_free</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_size.html">MPI_File_get_size</A></TD>
<TD><A HREF="www3/MPI_Neighbor_alltoallw.html">MPI_Neighbor_alltoallw</A></TD>
<TD><A HREF="www3/MPI_Win_flush_local_all.html">MPI_Win_flush_local_all</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iread_shared.html">MPI_File_iread_shared</A></TD>
<TD><A HREF="www3/MPI_Open_port.html">MPI_Open_port</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_type_extent.html">MPI_File_get_type_extent</A></TD>
<TD><A HREF="www3/MPI_Op_commute.html">MPI_Op_commute</A></TD>
<TD><A HREF="www3/MPI_Win_free.html">MPI_Win_free</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iwrite.html">MPI_File_iwrite</A></TD>
<TD><A HREF="www3/MPI_Pack.html">MPI_Pack</A></TD>
<TR><TD><A HREF="www3/MPI_File_get_view.html">MPI_File_get_view</A></TD>
<TD><A HREF="www3/MPI_Op_create.html">MPI_Op_create</A></TD>
<TD><A HREF="www3/MPI_Win_free_keyval.html">MPI_Win_free_keyval</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iwrite_all.html">MPI_File_iwrite_all</A></TD>
<TD><A HREF="www3/MPI_Pack_external.html">MPI_Pack_external</A></TD>
<TR><TD><A HREF="www3/MPI_File_iread.html">MPI_File_iread</A></TD>
<TD><A HREF="www3/MPI_Op_free.html">MPI_Op_free</A></TD>
<TD><A HREF="www3/MPI_Win_get_attr.html">MPI_Win_get_attr</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iwrite_at.html">MPI_File_iwrite_at</A></TD>
<TD><A HREF="www3/MPI_Pack_external_size.html">MPI_Pack_external_size</A></TD>
<TR><TD><A HREF="www3/MPI_File_iread_all.html">MPI_File_iread_all</A></TD>
<TD><A HREF="www3/MPI_Open_port.html">MPI_Open_port</A></TD>
<TD><A HREF="www3/MPI_Win_get_errhandler.html">MPI_Win_get_errhandler</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iwrite_at_all.html">MPI_File_iwrite_at_all</A></TD>
<TD><A HREF="www3/MPI_Pack_size.html">MPI_Pack_size</A></TD>
<TR><TD><A HREF="www3/MPI_File_iread_at.html">MPI_File_iread_at</A></TD>
<TD><A HREF="www3/MPI_Pack.html">MPI_Pack</A></TD>
<TD><A HREF="www3/MPI_Win_get_group.html">MPI_Win_get_group</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_iwrite_shared.html">MPI_File_iwrite_shared</A></TD>
<TD><A HREF="www3/MPI_Pcontrol.html">MPI_Pcontrol</A></TD>
<TR><TD><A HREF="www3/MPI_File_iread_at_all.html">MPI_File_iread_at_all</A></TD>
<TD><A HREF="www3/MPI_Pack_external.html">MPI_Pack_external</A></TD>
<TD><A HREF="www3/MPI_Win_get_info.html">MPI_Win_get_info</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_open.html">MPI_File_open</A></TD>
<TD><A HREF="www3/MPI_Probe.html">MPI_Probe</A></TD>
<TR><TD><A HREF="www3/MPI_File_iread_shared.html">MPI_File_iread_shared</A></TD>
<TD><A HREF="www3/MPI_Pack_external_size.html">MPI_Pack_external_size</A></TD>
<TD><A HREF="www3/MPI_Win_get_name.html">MPI_Win_get_name</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_preallocate.html">MPI_File_preallocate</A></TD>
<TD><A HREF="www3/MPI_Publish_name.html">MPI_Publish_name</A></TD>
<TR><TD><A HREF="www3/MPI_File_iwrite.html">MPI_File_iwrite</A></TD>
<TD><A HREF="www3/MPI_Pack_size.html">MPI_Pack_size</A></TD>
<TD><A HREF="www3/MPI_Win_lock.html">MPI_Win_lock</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read.html">MPI_File_read</A></TD>
<TD><A HREF="www3/MPI_Put.html">MPI_Put</A></TD>
<TR><TD><A HREF="www3/MPI_File_iwrite_all.html">MPI_File_iwrite_all</A></TD>
<TD><A HREF="www3/MPI_Pcontrol.html">MPI_Pcontrol</A></TD>
<TD><A HREF="www3/MPI_Win_lock_all.html">MPI_Win_lock_all</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_all.html">MPI_File_read_all</A></TD>
<TD><A HREF="www3/MPI_Query_thread.html">MPI_Query_thread</A></TD>
<TR><TD><A HREF="www3/MPI_File_iwrite_at.html">MPI_File_iwrite_at</A></TD>
<TD><A HREF="www3/MPI_Probe.html">MPI_Probe</A></TD>
<TD><A HREF="www3/MPI_Win_post.html">MPI_Win_post</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_all_begin.html">MPI_File_read_all_begin</A></TD>
<TD><A HREF="www3/MPI_Raccumulate.html">MPI_Raccumulate</A></TD>
<TR><TD><A HREF="www3/MPI_File_iwrite_at_all.html">MPI_File_iwrite_at_all</A></TD>
<TD><A HREF="www3/MPI_Publish_name.html">MPI_Publish_name</A></TD>
<TD><A HREF="www3/MPI_Win_set_attr.html">MPI_Win_set_attr</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_all_end.html">MPI_File_read_all_end</A></TD>
<TD><A HREF="www3/MPI_Recv.html">MPI_Recv</A></TD>
<TR><TD><A HREF="www3/MPI_File_iwrite_shared.html">MPI_File_iwrite_shared</A></TD>
<TD><A HREF="www3/MPI_Put.html">MPI_Put</A></TD>
<TD><A HREF="www3/MPI_Win_set_errhandler.html">MPI_Win_set_errhandler</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_at.html">MPI_File_read_at</A></TD>
<TD><A HREF="www3/MPI_Recv_init.html">MPI_Recv_init</A></TD>
<TR><TD><A HREF="www3/MPI_File_open.html">MPI_File_open</A></TD>
<TD><A HREF="www3/MPI_Query_thread.html">MPI_Query_thread</A></TD>
<TD><A HREF="www3/MPI_Win_set_info.html">MPI_Win_set_info</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_at_all.html">MPI_File_read_at_all</A></TD>
<TD><A HREF="www3/MPI_Reduce.html">MPI_Reduce</A></TD>
<TR><TD><A HREF="www3/MPI_File_preallocate.html">MPI_File_preallocate</A></TD>
<TD><A HREF="www3/MPI_Raccumulate.html">MPI_Raccumulate</A></TD>
<TD><A HREF="www3/MPI_Win_set_name.html">MPI_Win_set_name</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_at_all_begin.html">MPI_File_read_at_all_begin</A></TD>
<TD><A HREF="www3/MPI_Reduce_local.html">MPI_Reduce_local</A></TD>
<TR><TD><A HREF="www3/MPI_File_read.html">MPI_File_read</A></TD>
<TD><A HREF="www3/MPI_Recv.html">MPI_Recv</A></TD>
<TD><A HREF="www3/MPI_Win_shared_query.html">MPI_Win_shared_query</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_at_all_end.html">MPI_File_read_at_all_end</A></TD>
<TD><A HREF="www3/MPI_Reduce_scatter.html">MPI_Reduce_scatter</A></TD>
<TR><TD><A HREF="www3/MPI_File_read_all.html">MPI_File_read_all</A></TD>
<TD><A HREF="www3/MPI_Recv_init.html">MPI_Recv_init</A></TD>
<TD><A HREF="www3/MPI_Win_start.html">MPI_Win_start</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_ordered.html">MPI_File_read_ordered</A></TD>
<TD><A HREF="www3/MPI_Reduce_scatter_block.html">MPI_Reduce_scatter_block</A></TD>
<TR><TD><A HREF="www3/MPI_File_read_all_begin.html">MPI_File_read_all_begin</A></TD>
<TD><A HREF="www3/MPI_Reduce.html">MPI_Reduce</A></TD>
<TD><A HREF="www3/MPI_Win_sync.html">MPI_Win_sync</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_ordered_begin.html">MPI_File_read_ordered_begin</A></TD>
<TD><A HREF="www3/MPI_Register_datarep.html">MPI_Register_datarep</A></TD>
<TR><TD><A HREF="www3/MPI_File_read_all_end.html">MPI_File_read_all_end</A></TD>
<TD><A HREF="www3/MPI_Reduce_local.html">MPI_Reduce_local</A></TD>
<TD><A HREF="www3/MPI_Win_test.html">MPI_Win_test</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_ordered_end.html">MPI_File_read_ordered_end</A></TD>
<TD><A HREF="www3/MPI_Request_free.html">MPI_Request_free</A></TD>
<TR><TD><A HREF="www3/MPI_File_read_at.html">MPI_File_read_at</A></TD>
<TD><A HREF="www3/MPI_Reduce_scatter.html">MPI_Reduce_scatter</A></TD>
<TD><A HREF="www3/MPI_Win_unlock.html">MPI_Win_unlock</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_shared.html">MPI_File_read_shared</A></TD>
<TD><A HREF="www3/MPI_Request_get_status.html">MPI_Request_get_status</A></TD>
<TR><TD><A HREF="www3/MPI_File_read_at_all.html">MPI_File_read_at_all</A></TD>
<TD><A HREF="www3/MPI_Reduce_scatter_block.html">MPI_Reduce_scatter_block</A></TD>
<TD><A HREF="www3/MPI_Win_unlock_all.html">MPI_Win_unlock_all</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_seek.html">MPI_File_seek</A></TD>
<TD><A HREF="www3/MPI_Rget.html">MPI_Rget</A></TD>
<TR><TD><A HREF="www3/MPI_File_read_at_all_begin.html">MPI_File_read_at_all_begin</A></TD>
<TD><A HREF="www3/MPI_Register_datarep.html">MPI_Register_datarep</A></TD>
<TD><A HREF="www3/MPI_Win_wait.html">MPI_Win_wait</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_seek_shared.html">MPI_File_seek_shared</A></TD>
<TD><A HREF="www3/MPI_Rget_accumulate.html">MPI_Rget_accumulate</A></TD>
<TR><TD><A HREF="www3/MPI_File_read_at_all_end.html">MPI_File_read_at_all_end</A></TD>
<TD><A HREF="www3/MPI_Request_free.html">MPI_Request_free</A></TD>
<TD><A HREF="www3/MPI_Wtick.html">MPI_Wtick</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_ordered.html">MPI_File_read_ordered</A></TD>
<TD><A HREF="www3/MPI_Request_get_status.html">MPI_Request_get_status</A></TD>
<TD><A HREF="www3/MPI_Wtime.html">MPI_Wtime</A></TD>
</TR>
<TR><TD><A HREF="www3/MPI_File_read_ordered_begin.html">MPI_File_read_ordered_begin</A></TD>
<TD><A HREF="www3/MPI_Rget.html">MPI_Rget</A></TD>
<TD></TD>
</TR>
</TABLE>
</BODY>
</HTML>

View File

@@ -22,12 +22,12 @@ running them
<DT><B>-help </B><DD>Give short help
<DT><B>-cc=name </B><DD>Use compiler <tt>name</tt> instead of the default choice. Use
<DT><B>-cc=name </B><DD>Use compiler <TT>name</TT> instead of the default choice. Use
this only if the compiler is compatible with the MPICH
library (see below)
<DT><B>-config=name </B><DD>Load a configuration file for a particular compiler.
This allows a single <tt>mpicc</tt> command to be used with
This allows a single <TT>mpicc</TT> command to be used with
multiple compilers.
<DT><B>-compile_info </B><DD>Show the steps for compiling a program. This option
@@ -44,37 +44,40 @@ details
<DT><B>-echo </B><DD>Show exactly what this program is doing.
This option should normally not be used.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <tt>\-c
</tt>causes files to be compiled, <tt>\-g</tt> selects compilation with
debugging on most systems, and <tt>\-o name</tt> causes linking
with the output executable given the name <tt>name</tt>.
<DT><B>-static</B><DD>mpi - Use a statically compile MPI library, but shared libraries
for all of the other dependencies.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <TT>\-c
</TT>causes files to be compiled, <TT>\-g</TT> selects compilation with
debugging on most systems, and <TT>\-o name</TT> causes linking
with the output executable given the name <TT>name</TT>.
</DL>
<P>
<H2>Environment Variables</H2>
The environment variable <tt>MPICH_CC</tt> may be used
The environment variable <TT>MPICH_CC</TT> may be used
to select different C compiler and linker. Note that since
MPICH is built with a particular C and Fortran compiler, changing the
compilers used can cause problems. Use this only if you could intermix
code compiled with the different compilers.
<P>
The environment variable <tt>MPICC_PROFILE</tt> specifies a profile library
and has the same effect as if <tt>\-profile=$MPICC_PROFILE</tt> were used as
an argument to <tt>mpicc</tt>. See the discussion of <tt>\-profile</tt> below for more
The environment variable <TT>MPICC_PROFILE</TT> specifies a profile library
and has the same effect as if <TT>\-profile=$MPICC_PROFILE</TT> were used as
an argument to <TT>mpicc</TT>. See the discussion of <TT>\-profile</TT> below for more
details.
<P>
<H2>Compatible Compilers</H2>
The MPI library may be used with any compiler that uses the same
lengths for basic data objects (such as <tt>long double</tt>) and that
lengths for basic data objects (such as <TT>long double</TT>) and that
uses compatible run-time libraries. On many systems, the various
compilers are compatible and may be used interchangably. There are
exceptions; if you use the <tt>MPICH_CC</tt> environment variable or the
<tt>\-cc=name</tt> command-line argument to override the choice of compiler
exceptions; if you use the <TT>MPICH_CC</TT> environment variable or the
<TT>\-cc=name</TT> command-line argument to override the choice of compiler
and encounter problems, try reconfiguring MPICH with the new compiler
and installing MPICH in a separate location. See the installation manual
for more details.
<P>
<H2>Examples</H2>
To compile a single file <tt>foo.c</tt>, use
To compile a single file <TT>foo.c</TT>, use
<PRE>
mpicc -c foo.c
</PRE>
@@ -93,19 +96,19 @@ Combining compilation and linking in a single command
is a convenient way to build simple programs.
<P>
<H2>Selecting a Profiling Library</H2>
The <tt>\-profile=name</tt> argument allows you to specify an MPI profiling
library to be used. <tt>name</tt> can have two forms:
The <TT>\-profile=name</TT> argument allows you to specify an MPI profiling
library to be used. <TT>name</TT> can have two forms:
<P>
<br>A library in the same directory as the MPI library
<br>The name of a profile configuration file
<br>
<BR>A library in the same directory as the MPI library
<BR>The name of a profile configuration file
<BR>
<P>
If <tt>name</tt> is a library, then this library is included before the MPI
If <TT>name</TT> is a library, then this library is included before the MPI
library. This allows the simple use of libraries that make use of the
MPI profiling interface and that are installed in the same directory as
the MPI library.
<P>
If <tt>name.conf</tt> is the name of a file in the sysconfdir directory, then this
If <TT>name.conf</TT> is the name of a file in the sysconfdir directory, then this
is read and may define the following variables:
<DL>
<DT><B>PROFILE_PRELIB </B><DD>Libraries (and paths) to include before the MPI library
@@ -113,9 +116,9 @@ is read and may define the following variables:
<DT><B>PROFILE_POSTLIB </B><DD>Libraries to include after the MPI library
<DT><B>PROFILE_INCPATHS </B><DD>C preprocessor arguments for any include files
For example, to add <tt>/usr/local/myprof/include</tt> to the include path and
the library <tt>libmyprof.a</tt> in <tt>/usr/local/myprof/lib</tt> to the link step,
you could create the file <tt>myprof.conf</tt> with the lines
For example, to add <TT>/usr/local/myprof/include</TT> to the include path and
the library <TT>libmyprof.a</TT> in <TT>/usr/local/myprof/lib</TT> to the link step,
you could create the file <TT>myprof.conf</TT> with the lines
</DL>
<P>
<PRE>
@@ -125,10 +128,10 @@ you could create the file <tt>myprof.conf</tt> with the lines
and place it in the sysconfdir directory (this directory is set at
configure time when MPICH is built). Then using the command-line
argument <tt>\-profile=myprof</tt> will cause these
argument <TT>\-profile=myprof</TT> will cause these
definitions to be added to the relevant compile commands.
<P>
<H0>See Also</H0>
<H2>See Also</H2>
mpicxx, mpifort, mpiexec
<br>
<BR>
</BODY></HTML>

View File

@@ -22,12 +22,12 @@ running them
<DT><B>-help </B><DD>Give short help
<DT><B>-cxx=name </B><DD>Use compiler <tt>name</tt> instead of the default choice. Use
<DT><B>-cxx=name </B><DD>Use compiler <TT>name</TT> instead of the default choice. Use
this only if the compiler is compatible with the MPICH
library (see below)
<DT><B>-config=name </B><DD>Load a configuration file for a particular compiler.
This allows a single <tt>mpicxx</tt> command to be used with
This allows a single <TT>mpicxx</TT> command to be used with
multiple compilers.
<DT><B>-compile_info </B><DD>Show the steps for compiling a program. This option
@@ -44,37 +44,40 @@ details
<DT><B>-echo </B><DD>Show exactly what this program is doing.
This option should normally not be used.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <tt>\-c
</tt>causes files to be compiled, <tt>\-g</tt> selects compilation with
debugging on most systems, and <tt>\-o name</tt> causes linking
with the output executable given the name <tt>name</tt>.
<DT><B>-static</B><DD>mpi - Use a statically compile MPI library, but shared libraries
for all of the other dependencies.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <TT>\-c
</TT>causes files to be compiled, <TT>\-g</TT> selects compilation with
debugging on most systems, and <TT>\-o name</TT> causes linking
with the output executable given the name <TT>name</TT>.
</DL>
<P>
<H2>Environment Variables</H2>
The environment variables <tt>MPICH_CXX</tt> may be used
The environment variables <TT>MPICH_CXX</TT> may be used
to select different C++ compiler and linker. Note that since
MPICH is built with a particular C and Fortran compiler, changing the
compilers used can cause problems. Use this only if you could intermix
code compiled with the different compilers.
<P>
The environment variable <tt>MPICC_PROFILE</tt> specifies a profile library
and has the same effect as if <tt>\-profile=$MPICC_PROFILE</tt> were used as
an argument to <tt>mpicc</tt>. See the discussion of <tt>\-profile</tt> below for more
The environment variable <TT>MPICC_PROFILE</TT> specifies a profile library
and has the same effect as if <TT>\-profile=$MPICC_PROFILE</TT> were used as
an argument to <TT>mpicc</TT>. See the discussion of <TT>\-profile</TT> below for more
details.
<P>
<H2>Compatible Compilers</H2>
The MPI library may be used with any compiler that uses the same
lengths for basic data objects (such as <tt>long double</tt>) and that
lengths for basic data objects (such as <TT>long double</TT>) and that
uses compatible run-time libraries. On many systems, the various
compilers are compatible and may be used interchangably. There are
exceptions; if you use the <tt>MPICH_CXX</tt> environment variable or the
<tt>\-cxx=name</tt> command-line argument to override the choice of compiler
exceptions; if you use the <TT>MPICH_CXX</TT> environment variable or the
<TT>\-cxx=name</TT> command-line argument to override the choice of compiler
and encounter problems, try reconfiguring MPICH with the new compiler,
and installing MPICH in a separate location. See the installation manual
for more details.
<P>
<H2>Examples</H2>
To compile a single file <tt>foo.c</tt>, use
To compile a single file <TT>foo.c</TT>, use
<PRE>
mpicxx -c foo.cxx
</PRE>
@@ -93,19 +96,19 @@ Combining compilation and linking in a single command
is a convenient way to build simple programs.
<P>
<H2>Selecting a Profiling Library</H2>
The <tt>\-profile=name</tt> argument allows you to specify an MPI profiling
library to be used. <tt>name</tt> can have two forms:
The <TT>\-profile=name</TT> argument allows you to specify an MPI profiling
library to be used. <TT>name</TT> can have two forms:
<P>
<br>A library in the same directory as the MPI library
<br>The name of a profile configuration file
<br>
<BR>A library in the same directory as the MPI library
<BR>The name of a profile configuration file
<BR>
<P>
If <tt>name</tt> is a library, then this library is included before the MPI
If <TT>name</TT> is a library, then this library is included before the MPI
library. This allows the simple use of libraries that make use of the
MPI profiling interface and that are installed in the same directory as
the MPI library.
<P>
If <tt>name.conf</tt> is the name of a file in the sysconfdir directory, then this
If <TT>name.conf</TT> is the name of a file in the sysconfdir directory, then this
is read and may define the following variables:
<DL>
<DT><B>PROFILE_PRELIB </B><DD>Libraries (and paths) to include before the MPI library
@@ -113,9 +116,9 @@ is read and may define the following variables:
<DT><B>PROFILE_POSTLIB </B><DD>Libraries to include after the MPI library
<DT><B>PROFILE_INCPATHS </B><DD>C preprocessor arguments for any include files
For example, to add <tt>/usr/local/myprof/include</tt> to the include path and
the library <tt>libmyprof.a</tt> in <tt>/usr/local/myprof/lib</tt> to the link step,
you could create the file <tt>myprof.conf</tt> with the lines
For example, to add <TT>/usr/local/myprof/include</TT> to the include path and
the library <TT>libmyprof.a</TT> in <TT>/usr/local/myprof/lib</TT> to the link step,
you could create the file <TT>myprof.conf</TT> with the lines
</DL>
<P>
<PRE>
@@ -125,10 +128,10 @@ you could create the file <tt>myprof.conf</tt> with the lines
and place it in the sysconfdir directory (this directory is set at
configure time when MPICH is built). Then using the command-line
argument <tt>\-profile=myprof</tt> will cause these
argument <TT>\-profile=myprof</TT> will cause these
definitions to be added to the relevant compile commands.
<P>
<H0>See Also</H0>
<H2>See Also</H2>
mpicc, mpifort, mpiexec
<br>
<BR>
</BODY></HTML>

View File

@@ -14,12 +14,12 @@ Run an MPI program
mpiexec args executable pgmargs [ : args executable pgmargs ... ]
</PRE>
where <tt>args</tt> are command line arguments for <tt>mpiexec</tt> (see below),
<tt>executable</tt> is the name of an executable MPI program, and <tt>pgmargs
</tt>are command line arguments for the executable. Multiple executables
where <TT>args</TT> are command line arguments for <TT>mpiexec</TT> (see below),
<TT>executable</TT> is the name of an executable MPI program, and <TT>pgmargs
</TT>are command line arguments for the executable. Multiple executables
can be specified by using the colon notation (for MPMD - Multiple Program
Multiple Data applications). For example, the following command will run
the MPI program <tt>a.out</tt> on 4 processes:
the MPI program <TT>a.out</TT> on 4 processes:
<PRE>
mpiexec -n 4 a.out
</PRE>
@@ -34,7 +34,7 @@ The MPI standard specifies the following arguments and their meanings:
<DT><B>-arch &lt;architecture name&gt; </B><DD>Pick hosts with this architecture type
<DT><B>-wdir &lt;working directory&gt; </B><DD>cd to this one <em>before</em> running executable
<DT><B>-wdir &lt;working directory&gt; </B><DD>cd to this one <EM>before</EM> running executable
<DT><B>-path &lt;pathlist&gt; </B><DD>use this to find the executable
@@ -53,13 +53,13 @@ Additional arguments that are specific to the MPICH implementation
are discussed below.
<P>
Note that not all of these parameters are meaningful for all
systems. For example, the <tt>gforker</tt> version of <tt>mpiexec</tt> creates all
systems. For example, the <TT>gforker</TT> version of <TT>mpiexec</TT> creates all
processes on the same system on which it is running; in that case, the
<tt>\-arch</tt> and <tt>\-host</tt> options are ignored.
<TT>\-arch</TT> and <TT>\-host</TT> options are ignored.
<P>
The colon character (<tt>:</tt>) may be used to separate different executables
The colon character (<TT>:</TT>) may be used to separate different executables
for MPMD (multiple program multiple data) programming. For example,
to run the program <tt>ocean</tt> on 4 processes and <tt>air</tt> on 8 processes, use:
to run the program <TT>ocean</TT> on 4 processes and <TT>air</TT> on 8 processes, use:
<P>
<PRE>
mpiexec -n 4 ocean : -n 8 air
@@ -70,40 +70,40 @@ to run the program <tt>ocean</tt> on 4 processes and <tt>air</tt> on 8 processes
<H2>MPICH-Specific Arguments</H2>
<P>
Many of the implementations of process managers in MPICH support the
following arguments to <tt>mpiexec</tt>:
following arguments to <TT>mpiexec</TT>:
<P>
<DL>
<DT><B>-np &lt;num&gt; </B><DD>A synonym for the standard <tt>\-n</tt> argument
<DT><B>-np &lt;num&gt; </B><DD>A synonym for the standard <TT>\-n</TT> argument
<DT><B>-env &lt;name&gt; &lt;value&gt; </B><DD>Set the environment variable <tt>&lt;name&gt;</tt> to <tt>&lt;value&gt;</tt> for
the processes being run by <tt>mpiexec
</tt>
<DT><B>-env &lt;name&gt; &lt;value&gt; </B><DD>Set the environment variable <TT>&lt;name&gt;</TT> to <TT>&lt;value&gt;</TT> for
the processes being run by <TT>mpiexec
</TT>
<DT><B>-envnone </B><DD>Pass no environment variables (other than ones specified with
other <tt>\-env</tt> or <tt>\-genv</tt> arguments) to the processes being run by <tt>mpiexec</tt>.
other <TT>\-env</TT> or <TT>\-genv</TT> arguments) to the processes being run by <TT>mpiexec</TT>.
By default, all environment
variables are provided to each MPI process (rationale: principle of
least surprise for the user)
<DT><B>-envlist &lt;list&gt; </B><DD>Pass the listed environment variables (names separated
by commas), with their current values, to the processes being run by
<tt>mpiexec</tt>.
<TT>mpiexec</TT>.
<DT><B>-genv &lt;name&gt; &lt;value&gt; </B><DD>The <tt>\-genv</tt> options have the same meaning as their
corresponding <tt>\-env</tt> version, except they apply to all executables, not just
<DT><B>-genv &lt;name&gt; &lt;value&gt; </B><DD>The <TT>\-genv</TT> options have the same meaning as their
corresponding <TT>\-env</TT> version, except they apply to all executables, not just
the current executable (in the case that the colon syntax is used to specify
multiple execuables).
<DT><B>-genvnone </B><DD>Like <tt>\-envnone</tt>, but for all executables
<DT><B>-genvnone </B><DD>Like <TT>\-envnone</TT>, but for all executables
<DT><B>-genvlist &lt;list&gt; </B><DD>Like <tt>\-envlist</tt>, but for all executables
<DT><B>-genvlist &lt;list&gt; </B><DD>Like <TT>\-envlist</TT>, but for all executables
<DT><B>-usize &lt;n&gt; </B><DD>Specify the value returned for the value of the attribute
<tt>MPI_UNIVERSE_SIZE</tt>.
<TT>MPI_UNIVERSE_SIZE</TT>.
<DT><B>-l </B><DD>Label standard out and standard error (<tt>stdout</tt> and <tt>stderr</tt>) with
<DT><B>-l </B><DD>Label standard out and standard error (<TT>stdout</TT> and <TT>stderr</TT>) with
the rank of the process
<DT><B>-maxtime &lt;n&gt; </B><DD>Set a timelimit of <tt>&lt;n&gt;</tt> seconds.
<DT><B>-maxtime &lt;n&gt; </B><DD>Set a timelimit of <TT>&lt;n&gt;</TT> seconds.
<DT><B>-exitinfo </B><DD>Provide more information on the reason each process exited if
there is an abnormal exit
@@ -111,42 +111,42 @@ there is an abnormal exit
<P>
<H2>Environment variables for mpiexec</H2>
The following environment variables are understood by some versions of
<tt>mpiexec</tt>. The command line arguments have priority over these; that is,
<TT>mpiexec</TT>. The command line arguments have priority over these; that is,
if both the environment variable and command line argument are used, the
value specified by the command line argument is used.
<P>
<DL>
<DT><B>MPIEXEC_TIMEOUT </B><DD>Maximum running time in seconds. <tt>mpiexec</tt> will
<DT><B>MPIEXEC_TIMEOUT </B><DD>Maximum running time in seconds. <TT>mpiexec</TT> will
terminate MPI programs that take longer than the value specified by
<tt>MPIEXEC_TIMEOUT</tt>.
<TT>MPIEXEC_TIMEOUT</TT>.
<DT><B>MPIEXEC_UNIVERSE_SIZE </B><DD>Set the universe size
<DT><B>MPIEXEC_PORT_RANGE </B><DD>Set the range of ports that <tt>mpiexec</tt> will use
<DT><B>MPIEXEC_PORT_RANGE </B><DD>Set the range of ports that <TT>mpiexec</TT> will use
in communicating with the processes that it starts. The format of
this is <tt>&lt;low&gt;:&lt;high&gt;</tt>. For example, to specify any port between
10000 and 10100, use <tt>10000:10100</tt>.
this is <TT>&lt;low&gt;:&lt;high&gt;</TT>. For example, to specify any port between
10000 and 10100, use <TT>10000:10100</TT>.
<DT><B>MPICH_PORT_RANGE </B><DD>Has the same meaning as <tt>MPIEXEC_PORT_RANGE</tt> and
is used if <tt>MPIEXEC_PORT_RANGE</tt> is not set.
<DT><B>MPICH_PORT_RANGE </B><DD>Has the same meaning as <TT>MPIEXEC_PORT_RANGE</TT> and
is used if <TT>MPIEXEC_PORT_RANGE</TT> is not set.
<DT><B>MPIEXEC_PREFIX_DEFAULT </B><DD>If this environment variable is set, output
to standard output is prefixed by the rank in <tt>MPI_COMM_WORLD</tt> of the
to standard output is prefixed by the rank in <TT>MPI_COMM_WORLD</TT> of the
process and output to standard error is prefixed by the rank and the
text <tt>(err)</tt>; both are followed by an angle bracket (<tt>&gt;</tt>). If
text <TT>(err)</TT>; both are followed by an angle bracket (<TT>&gt;</TT>). If
this variable is not set, there is no prefix.
<DT><B>MPIEXEC_PREFIX_STDOUT </B><DD>Set the prefix used for lines sent to standard
output. A <tt>%d</tt> is replaced with the rank in <tt>MPI_COMM_WORLD</tt>; a <tt>%w</tt> is
replaced with an indication of which <tt>MPI_COMM_WORLD</tt> in MPI jobs that
involve multiple <tt>MPI_COMM_WORLD</tt>s (e.g., ones that use <tt>MPI_Comm_spawn</tt> or
<tt>MPI_Comm_connect</tt>).
output. A <TT>%d</TT> is replaced with the rank in <TT>MPI_COMM_WORLD</TT>; a <TT>%w</TT> is
replaced with an indication of which <TT>MPI_COMM_WORLD</TT> in MPI jobs that
involve multiple <TT>MPI_COMM_WORLD</TT>s (e.g., ones that use <TT>MPI_Comm_spawn</TT> or
<TT>MPI_Comm_connect</TT>).
<DT><B>MPIEXEC_PREFIX_STDERR </B><DD>Like <tt>MPIEXEC_PREFIX_STDOUT</tt>, but for standard error.
<DT><B>MPIEXEC_PREFIX_STDERR </B><DD>Like <TT>MPIEXEC_PREFIX_STDOUT</TT>, but for standard error.
</DL>
<P>
<H2>Return Status</H2>
<tt>mpiexec</tt> returns the maximum of the exit status values of all of the
processes created by <tt>mpiexec</tt>.
<TT>mpiexec</TT> returns the maximum of the exit status values of all of the
processes created by <TT>mpiexec</TT>.
<P>
</BODY></HTML>

View File

@@ -22,12 +22,12 @@ running them
<DT><B>-help </B><DD>Give short help
<DT><B>-f77=name </B><DD>Use compiler <tt>name</tt> instead of the default choice. Use
<DT><B>-f77=name </B><DD>Use compiler <TT>name</TT> instead of the default choice. Use
this only if the compiler is compatible with the MPICH
library (see below)
<DT><B>-config=name </B><DD>Load a configuration file for a particular compiler.
This allows a single <tt>mpif77</tt> command to be used with
This allows a single <TT>mpif77</TT> command to be used with
multiple compilers.
<DT><B>-compile_info </B><DD>Show the steps for compiling a program. This option
@@ -44,14 +44,17 @@ details
<DT><B>-echo </B><DD>Show exactly what this program is doing.
This option should normally not be used.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <tt>\-c
</tt>causes files to be compiled, <tt>\-g</tt> selects compilation with
debugging on most systems, and <tt>\-o name</tt> causes linking
with the output executable given the name <tt>name</tt>.
<DT><B>-static</B><DD>mpi - Use a statically compile MPI library, but shared libraries
for all of the other dependencies.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <TT>\-c
</TT>causes files to be compiled, <TT>\-g</TT> selects compilation with
debugging on most systems, and <TT>\-o name</TT> causes linking
with the output executable given the name <TT>name</TT>.
</DL>
<P>
<H2>Environment Variables</H2>
The environment variables <tt>MPICH_F77</tt> may be used
The environment variables <TT>MPICH_F77</TT> may be used
to select different Fortran compiler and linker. Note that since
MPICH is built with a particular C and Fortran compiler, change the
compilers used can cause problems. Use this only if you could intermix
@@ -59,17 +62,17 @@ code compiled with the different compilers.
<P>
<H2>Compatible Compilers</H2>
The MPI library may be used with any compiler that uses the same
lengths for basic data objects (such as <tt>long double</tt>) and that
lengths for basic data objects (such as <TT>long double</TT>) and that
uses compatible run-time libraries. On many systems, the various
compilers are compatible and may be used interchangably. There are
exceptions; if you use the <tt>MPICH_F77</tt> environment variable or the
<tt>\-f77=name</tt> command-line argument to override the choice of compiler
exceptions; if you use the <TT>MPICH_F77</TT> environment variable or the
<TT>\-f77=name</TT> command-line argument to override the choice of compiler
and encounter problems, try reconfiguring MPICH with the new compiler
and installing MPICH in a separate location. See the installation manual
for more details.
<P>
<H2>Examples</H2>
To compile a single file <tt>foo.f</tt>, use
To compile a single file <TT>foo.f</TT>, use
<PRE>
mpif77 -c foo.f
</PRE>
@@ -88,19 +91,19 @@ Combining compilation and linking in a single command
is a convenient way to build simple programs.
<P>
<H2>Selecting a Profiling Library</H2>
The <tt>\-profile=name</tt> argument allows you to specify an MPI profiling
library to be used. <tt>name</tt> can have two forms:
The <TT>\-profile=name</TT> argument allows you to specify an MPI profiling
library to be used. <TT>name</TT> can have two forms:
<P>
<br>A library in the same directory as the MPI library
<br>The name of a profile configuration file
<br>
<BR>A library in the same directory as the MPI library
<BR>The name of a profile configuration file
<BR>
<P>
If <tt>name</tt> is a library, then this library is included before the MPI
If <TT>name</TT> is a library, then this library is included before the MPI
library. This allows the simple use of libraries that make use of the
MPI profiling interface and that are installed in the same directory as
the MPI library.
<P>
If <tt>name.conf</tt> is the name of a file in the sysconfdir directory, then this
If <TT>name.conf</TT> is the name of a file in the sysconfdir directory, then this
is read and may define the following variables:
<DL>
<DT><B>PROFILE_PRELIB </B><DD>Libraries (and paths) to include before the MPI library
@@ -108,9 +111,9 @@ is read and may define the following variables:
<DT><B>PROFILE_POSTLIB </B><DD>Libraries to include after the MPI library
<DT><B>PROFILE_INCPATHS </B><DD>C preprocessor arguments for any include files
For example, to add <tt>/usr/local/myprof/include</tt> to the include path and
the library <tt>libmyprof.a</tt> in <tt>/usr/local/myprof/lib</tt> to the link step,
you could create the file <tt>myprof.conf</tt> with the lines
For example, to add <TT>/usr/local/myprof/include</TT> to the include path and
the library <TT>libmyprof.a</TT> in <TT>/usr/local/myprof/lib</TT> to the link step,
you could create the file <TT>myprof.conf</TT> with the lines
</DL>
<P>
<PRE>
@@ -120,10 +123,10 @@ you could create the file <tt>myprof.conf</tt> with the lines
and place it in the sysconfdir directory (this directory is set at
configure time when MPICH is built). Then using the command-line
argument <tt>\-profile=myprof</tt> will cause these
argument <TT>\-profile=myprof</TT> will cause these
definitions to be added to the relevant compile commands.
<P>
<H0>See Also</H0>
<H2>See Also</H2>
mpicc, mpicxx, mpifort, mpiexec
<br>
<BR>
</BODY></HTML>

View File

@@ -22,12 +22,12 @@ running them
<DT><B>-help </B><DD>Give short help
<DT><B>-fc=name </B><DD>Use compiler <tt>name</tt> instead of the default choice. Use
<DT><B>-fc=name </B><DD>Use compiler <TT>name</TT> instead of the default choice. Use
this only if the compiler is compatible with the MPICH
library (see below)
<DT><B>-config=name </B><DD>Load a configuration file for a particular compiler.
This allows a single <tt>mpifort</tt> command to be used with
This allows a single <TT>mpifort</TT> command to be used with
multiple compilers.
<DT><B>-compile_info </B><DD>Show the steps for compiling a program. This option
@@ -44,14 +44,17 @@ details
<DT><B>-echo </B><DD>Show exactly what this program is doing.
This option should normally not be used.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <tt>\-c
</tt>causes files to be compiled, <tt>\-g</tt> selects compilation with
debugging on most systems, and <tt>\-o name</tt> causes linking
with the output executable given the name <tt>name</tt>.
<DT><B>-static</B><DD>mpi - Use a statically compile MPI library, but shared libraries
for all of the other dependencies.
<DT><B>others </B><DD>are passed to the compiler or linker. For example, <TT>\-c
</TT>causes files to be compiled, <TT>\-g</TT> selects compilation with
debugging on most systems, and <TT>\-o name</TT> causes linking
with the output executable given the name <TT>name</TT>.
</DL>
<P>
<H2>Environment Variables</H2>
The environment variables <tt>MPICH_FC</tt> may be used
The environment variables <TT>MPICH_FC</TT> may be used
to select different Fortran compiler and linker. Note that since
MPICH is built with a particular C and Fortran compiler, change the
compilers used can cause problems. Use this only if you could intermix
@@ -59,17 +62,17 @@ code compiled with the different compilers.
<P>
<H2>Compatible Compilers</H2>
The MPI library may be used with any compiler that uses the same
lengths for basic data objects (such as <tt>long double</tt>) and that
lengths for basic data objects (such as <TT>long double</TT>) and that
uses compatible run-time libraries. On many systems, the various
compilers are compatible and may be used interchangably. There are
exceptions; if you use the <tt>MPICH_FC</tt> environment variable or the
<tt>\-fc=name</tt> command-line argument to override the choice of compiler
exceptions; if you use the <TT>MPICH_FC</TT> environment variable or the
<TT>\-fc=name</TT> command-line argument to override the choice of compiler
and encounter problems, try reconfiguring MPICH with the new compiler
and installing MPICH in a separate location. See the installation manual
for more details.
<P>
<H2>Examples</H2>
To compile a single file <tt>foo.f</tt>, use
To compile a single file <TT>foo.f</TT>, use
<PRE>
mpifort -c foo.f
</PRE>
@@ -88,19 +91,19 @@ Combining compilation and linking in a single command
is a convenient way to build simple programs.
<P>
<H2>Selecting a Profiling Library</H2>
The <tt>\-profile=name</tt> argument allows you to specify an MPI profiling
library to be used. <tt>name</tt> can have two forms:
The <TT>\-profile=name</TT> argument allows you to specify an MPI profiling
library to be used. <TT>name</TT> can have two forms:
<P>
<br>A library in the same directory as the MPI library
<br>The name of a profile configuration file
<br>
<BR>A library in the same directory as the MPI library
<BR>The name of a profile configuration file
<BR>
<P>
If <tt>name</tt> is a library, then this library is included before the MPI
If <TT>name</TT> is a library, then this library is included before the MPI
library. This allows the simple use of libraries that make use of the
MPI profiling interface and that are installed in the same directory as
the MPI library.
<P>
If <tt>name.conf</tt> is the name of a file in the sysconfdir directory, then this
If <TT>name.conf</TT> is the name of a file in the sysconfdir directory, then this
is read and may define the following variables:
<DL>
<DT><B>PROFILE_PRELIB </B><DD>Libraries (and paths) to include before the MPI library
@@ -108,9 +111,9 @@ is read and may define the following variables:
<DT><B>PROFILE_POSTLIB </B><DD>Libraries to include after the MPI library
<DT><B>PROFILE_INCPATHS </B><DD>C preprocessor arguments for any include files
For example, to add <tt>/usr/local/myprof/include</tt> to the include path and
the library <tt>libmyprof.a</tt> in <tt>/usr/local/myprof/lib</tt> to the link step,
you could create the file <tt>myprof.conf</tt> with the lines
For example, to add <TT>/usr/local/myprof/include</TT> to the include path and
the library <TT>libmyprof.a</TT> in <TT>/usr/local/myprof/lib</TT> to the link step,
you could create the file <TT>myprof.conf</TT> with the lines
</DL>
<P>
<PRE>
@@ -120,10 +123,10 @@ you could create the file <tt>myprof.conf</tt> with the lines
and place it in the sysconfdir directory (this directory is set at
configure time when MPICH is built). Then using the command-line
argument <tt>\-profile=myprof</tt> will cause these
argument <TT>\-profile=myprof</TT> will cause these
definitions to be added to the relevant compile commands.
<P>
<H0>See Also</H0>
<H2>See Also</H2>
mpicc, mpicxx, mpifort, mpiexec
<br>
<BR>
</BODY></HTML>

View File

@@ -10,9 +10,9 @@ Meaning of MPI's defined constants
<H2>Data types</H2>
Note that the Fortran types should only be used in Fortran programs,
and the C types should only be used in C programs. For example,
it is in error to use <tt>MPI_INT</tt> for a Fortran INTEGER.
Datatypes are of type <tt>MPI_Datatype</tt> in C, type <tt>INTEGER</tt> in Fortran,
and <tt>Type(MPI_Datatype)</tt> in Fortran08
it is in error to use <TT>MPI_INT</TT> for a Fortran INTEGER.
Datatypes are of type <TT>MPI_Datatype</TT> in C, type <TT>INTEGER</TT> in Fortran,
and <TT>Type(MPI_Datatype)</TT> in Fortran08
<P>
<H2>C datatypes</H2>
MPI_CHAR - char
@@ -38,8 +38,8 @@ MPI_CHAR - char
</DL>
<DL><DT><B>MPI_LONG_LONG_INT </B> <DD> long long
</DL>
<DL><DT><B>MPI_LONG_LONG </B> <DD> synonyn for <tt>MPI_LONG_LONG_INT
</tt>
<DL><DT><B>MPI_LONG_LONG </B> <DD> synonyn for <TT>MPI_LONG_LONG_INT
</TT>
</DL>
<DL><DT><B>MPI_UNSIGNED_LONG_LONG </B> <DD> unsigned long long
</DL>
@@ -78,103 +78,103 @@ MPI_CHAR - char
</DL>
<P>
<P>
The following are datatypes for the MPI functions <tt>MPI_MAXLOC</tt> and
<tt>MPI_MINLOC</tt>.
MPI_FLOAT_INT - <tt>struct { float, int }
</tt>
<DL><DT><B>MPI_LONG_INT </B> <DD> <tt>struct { long, int }
</tt>
The following are datatypes for the MPI functions <TT>MPI_MAXLOC</TT> and
<TT>MPI_MINLOC</TT>.
MPI_FLOAT_INT - <TT>struct { float, int }
</TT>
<DL><DT><B>MPI_LONG_INT </B> <DD> <TT>struct { long, int }
</TT>
</DL>
<DL><DT><B>MPI_DOUBLE_INT </B> <DD> <tt>struct { double, int }
</tt>
<DL><DT><B>MPI_DOUBLE_INT </B> <DD> <TT>struct { double, int }
</TT>
</DL>
<DL><DT><B>MPI_SHORT_INT </B> <DD> <tt>struct { short, int }
</tt>
<DL><DT><B>MPI_SHORT_INT </B> <DD> <TT>struct { short, int }
</TT>
</DL>
<DL><DT><B>MPI_2INT </B> <DD> <tt>struct { int, int }
</tt>
<DL><DT><B>MPI_2INT </B> <DD> <TT>struct { int, int }
</TT>
</DL>
<DL><DT><B>MPI_LONG_DOUBLE_INT </B> <DD> <tt>struct { long double, int }</tt>; this
is an <em>optional</em> type, and may be set to <tt>MPI_DATATYPE_NULL
</tt>
<DL><DT><B>MPI_LONG_DOUBLE_INT </B> <DD> <TT>struct { long double, int }</TT>; this
is an <EM>optional</EM> type, and may be set to <TT>MPI_DATATYPE_NULL
</TT>
</DL>
</DL>
<P>
<P>
Special datatypes for C and Fortran
MPI_PACKED - For <tt>MPI_Pack</tt> and <tt>MPI_Unpack
</tt>
<DL><DT><B>MPI_UB </B> <DD> For <tt>MPI_Type_struct</tt>; an upper-bound indicator. Removed in MPI 3
MPI_PACKED - For <TT>MPI_Pack</TT> and <TT>MPI_Unpack
</TT>
<DL><DT><B>MPI_UB </B> <DD> For <TT>MPI_Type_struct</TT>; an upper-bound indicator. Removed in MPI 3
</DL>
<DL><DT><B>MPI_LB </B> <DD> For <tt>MPI_Type_struct</tt>; a lower-bound indicator. Removed in MPI 3
<DL><DT><B>MPI_LB </B> <DD> For <TT>MPI_Type_struct</TT>; a lower-bound indicator. Removed in MPI 3
</DL>
</DL>
<P>
<H2>Fortran datatypes</H2>
MPI_REAL - <tt>REAL
</tt>
<DL><DT><B>MPI_INTEGER </B> <DD> <tt>INTEGER
</tt>
MPI_REAL - <TT>REAL
</TT>
<DL><DT><B>MPI_INTEGER </B> <DD> <TT>INTEGER
</TT>
</DL>
<DL><DT><B>MPI_LOGICAL </B> <DD> <tt>LOGICAL
</tt>
<DL><DT><B>MPI_LOGICAL </B> <DD> <TT>LOGICAL
</TT>
</DL>
<DL><DT><B>MPI_DOUBLE_PRECISION </B> <DD> <tt>DOUBLE PRECISION
</tt>
<DL><DT><B>MPI_DOUBLE_PRECISION </B> <DD> <TT>DOUBLE PRECISION
</TT>
</DL>
<DL><DT><B>MPI_COMPLEX </B> <DD> <tt>COMPLEX
</tt>
<DL><DT><B>MPI_COMPLEX </B> <DD> <TT>COMPLEX
</TT>
</DL>
<DL><DT><B>MPI_DOUBLE_COMPLEX </B> <DD> <tt>complex*16</tt> (or <tt>complex*32</tt>) where supported.
<DL><DT><B>MPI_DOUBLE_COMPLEX </B> <DD> <TT>complex*16</TT> (or <TT>complex*32</TT>) where supported.
</DL>
</DL>
<P>
The following datatypes are optional
MPI_INTEGER1 - <tt>integer*1</tt> if supported
<DL><DT><B>MPI_INTEGER2 </B> <DD> <tt>integer*2</tt> if supported
MPI_INTEGER1 - <TT>integer*1</TT> if supported
<DL><DT><B>MPI_INTEGER2 </B> <DD> <TT>integer*2</TT> if supported
</DL>
<DL><DT><B>MPI_INTEGER4 </B> <DD> <tt>integer*4</tt> if supported
<DL><DT><B>MPI_INTEGER4 </B> <DD> <TT>integer*4</TT> if supported
</DL>
<DL><DT><B>MPI_INTEGER8 </B> <DD> <tt>integer*8</tt> if supported
<DL><DT><B>MPI_INTEGER8 </B> <DD> <TT>integer*8</TT> if supported
</DL>
<DL><DT><B>MPI_INTEGER16 </B> <DD> <tt>integer*16</tt> if supported
<DL><DT><B>MPI_INTEGER16 </B> <DD> <TT>integer*16</TT> if supported
</DL>
<DL><DT><B>MPI_REAL4 </B> <DD> <tt>real*4</tt> if supported
<DL><DT><B>MPI_REAL4 </B> <DD> <TT>real*4</TT> if supported
</DL>
<DL><DT><B>MPI_REAL8 </B> <DD> <tt>real*8</tt> if supported
<DL><DT><B>MPI_REAL8 </B> <DD> <TT>real*8</TT> if supported
</DL>
</DL>
<DL><DT><B>MPI_REAL16 </B> <DD> <tt>real*16</tt> if supported
<DL><DT><B>MPI_REAL16 </B> <DD> <TT>real*16</TT> if supported
</DL>
<DL><DT><B>MPI_COMPLEX8 </B> <DD> <tt>complex*8</tt> if supported
<DL><DT><B>MPI_COMPLEX8 </B> <DD> <TT>complex*8</TT> if supported
</DL>
<DL><DT><B>MPI_COMPLEX16 </B> <DD> <tt>complex*16</tt> if supported
<DL><DT><B>MPI_COMPLEX16 </B> <DD> <TT>complex*16</TT> if supported
</DL>
<DL><DT><B>MPI_COMPLEX32 </B> <DD> <tt>complex*32</tt> if supported
<DL><DT><B>MPI_COMPLEX32 </B> <DD> <TT>complex*32</TT> if supported
</DL>
</DL>
<P>
The following are datatypes for the MPI functions <tt>MPI_MAXLOC</tt> and
<tt>MPI_MINLOC</tt>. In Fortran, these datatype always consist of
The following are datatypes for the MPI functions <TT>MPI_MAXLOC</TT> and
<TT>MPI_MINLOC</TT>. In Fortran, these datatype always consist of
two elements of the same Fortran type.
MPI_2INTEGER - <tt>INTEGER,INTEGER
</tt>
<DL><DT><B>MPI_2REAL </B> <DD> <tt>REAL, REAL
</tt>
MPI_2INTEGER - <TT>INTEGER,INTEGER
</TT>
<DL><DT><B>MPI_2REAL </B> <DD> <TT>REAL, REAL
</TT>
</DL>
<DL><DT><B>MPI_2DOUBLE_PRECISION </B> <DD> <tt>DOUBLE PRECISION, DOUBLE PRECISION
</tt>
<DL><DT><B>MPI_2DOUBLE_PRECISION </B> <DD> <TT>DOUBLE PRECISION, DOUBLE PRECISION
</TT>
</DL>
</DL>
<P>
MPI Datatypes for MPI Types
MPI_AINT - Datatype for an <tt>MPI_Aint
</tt>
<DL><DT><B>MPI_OFFSET </B> <DD> Datatype for an <tt>MPI_Offset
</tt>
MPI_AINT - Datatype for an <TT>MPI_Aint
</TT>
<DL><DT><B>MPI_OFFSET </B> <DD> Datatype for an <TT>MPI_Offset
</TT>
</DL>
<DL><DT><B>MPI_COUNT </B> <DD> Datatype for an <tt>MPI_Count
</tt>
<DL><DT><B>MPI_COUNT </B> <DD> Datatype for an <TT>MPI_Count
</TT>
</DL>
</DL>
<P>
@@ -221,19 +221,19 @@ MPI_COMBINER_NAMED - a named predefined datatype
<H2>MPI Datatype Type Classes</H2>
MPI Type classes used with routines to return Fortran types with defined
precision and range
MPI_TYPECLASS_REAL - <tt>REAL
</tt>
<DL><DT><B>MPI_TYPECLASS_INTEGER </B> <DD> <tt>INTEGER
</tt>
MPI_TYPECLASS_REAL - <TT>REAL
</TT>
<DL><DT><B>MPI_TYPECLASS_INTEGER </B> <DD> <TT>INTEGER
</TT>
</DL>
<DL><DT><B>MPI_TYPECLASS_COMPLEX </B> <DD> <tt>COMPLEX
</tt>
<DL><DT><B>MPI_TYPECLASS_COMPLEX </B> <DD> <TT>COMPLEX
</TT>
</DL>
</DL>
<P>
<H2>MPI Darray and Subarray Values</H2>
These values are used to create a datatype with the <tt>DARRAY</tt> and <tt>SUBARRAY
</tt>constructors.
These values are used to create a datatype with the <TT>DARRAY</TT> and <TT>SUBARRAY
</TT>constructors.
MPI_ORDER_C - Row-major order (as used by C)
<DL><DT><B>MPI_ORDER_FORTRAN </B> <DD> Column-major order (as used by Fortran)
</DL>
@@ -248,8 +248,8 @@ MPI_ORDER_C - Row-major order (as used by C)
</DL>
<P>
<H2>Communicators</H2>
Communicators are of type <tt>MPI_Comm</tt> in C, <tt>INTEGER</tt> in Fortran, and
<tt>Type(MPI_Comm)</tt> in Fortran08
Communicators are of type <TT>MPI_Comm</TT> in C, <TT>INTEGER</TT> in Fortran, and
<TT>Type(MPI_Comm)</TT> in Fortran08
MPI_COMM_WORLD - Contains all of the processes
<DL><DT><B>MPI_COMM_SELF </B> <DD> Contains only the calling process
</DL>
@@ -260,14 +260,14 @@ MPI_COMM_TYPE_SHARED - All processes that can share memory are grouped into
the same communicator.
<P>
<H2>Groups</H2>
Groups are of type <tt>MPI_Group</tt> in C, <tt>INTEGER</tt> in Fortran,
and <tt>Type(MPI_Group)</tt> in Fortran08
Groups are of type <TT>MPI_Group</TT> in C, <TT>INTEGER</TT> in Fortran,
and <TT>Type(MPI_Group)</TT> in Fortran08
<P>
MPI_GROUP_EMPTY - A group containing no members.
<P>
<H2>Results of the compare operations on groups and communicators</H2>
MPI_IDENT - Identical
<DL><DT><B>MPI_CONGRUENT </B> <DD> (only for <tt>MPI_COMM_COMPARE</tt>) The groups are identical
<DL><DT><B>MPI_CONGRUENT </B> <DD> (only for <TT>MPI_COMM_COMPARE</TT>) The groups are identical
</DL>
<DL><DT><B>MPI_SIMILAR </B> <DD> Same members, but in a different order
</DL>
@@ -277,9 +277,9 @@ MPI_IDENT - Identical
<P>
<P>
<H2>Collective operations</H2>
The collective combination operations (e.g., <tt>MPI_REDUCE</tt>, <tt>MPI_ALLREDUCE</tt>,
<tt>MPI_REDUCE_SCATTER</tt>, and <tt>MPI_SCAN</tt>) take a combination operation.
This operation is of type <tt>MPI_Op</tt> in C and of type <tt>INTEGER</tt> in Fortran.
The collective combination operations (e.g., <TT>MPI_REDUCE</TT>, <TT>MPI_ALLREDUCE</TT>,
<TT>MPI_REDUCE_SCATTER</TT>, and <TT>MPI_SCAN</TT>) take a combination operation.
This operation is of type <TT>MPI_Op</TT> in C and of type <TT>INTEGER</TT> in Fortran.
The predefined operations are
<P>
MPI_MAX - return the maximum
@@ -315,24 +315,24 @@ the first is found)
<P>
<H2>Notes on collective operations</H2>
<P>
The reduction functions (<tt>MPI_Op</tt>) do not return an error value. As a result,
if the functions detect an error, all they can do is either call <tt>MPI_Abort
</tt>or silently skip the problem. Thus, if you change the error handler from
<tt>MPI_ERRORS_ARE_FATAL</tt> to something else, for example, <tt>MPI_ERRORS_RETURN</tt>,
The reduction functions (<TT>MPI_Op</TT>) do not return an error value. As a result,
if the functions detect an error, all they can do is either call <TT>MPI_Abort
</TT>or silently skip the problem. Thus, if you change the error handler from
<TT>MPI_ERRORS_ARE_FATAL</TT> to something else, for example, <TT>MPI_ERRORS_RETURN</TT>,
then no error may be indicated.
<P>
The reason for this is the performance problems in ensuring that
all collective routines return the same error value.
<P>
Note that not all datatypes are valid for these functions. For example,
<tt>MPI_COMPLEX</tt> is not valid for <tt>MPI_MAX</tt> and <tt>MPI_MIN</tt>. In addition, the MPI
1.1 standard did not include the C types <tt>MPI_CHAR</tt> and <tt>MPI_UNSIGNED_CHAR
</tt>among the lists of arithmetic types for operations like <tt>MPI_SUM</tt>. However,
since the C type <tt>char</tt> is an integer type (like <tt>short</tt>), it should have been
included. The MPI Forum will probably include <tt>char</tt> and <tt>unsigned char
</tt>as a clarification to MPI 1.1; until then, users are advised that MPI
implementations may not accept <tt>MPI_CHAR</tt> and <tt>MPI_UNSIGNED_CHAR</tt> as valid
datatypes for <tt>MPI_SUM</tt>, <tt>MPI_PROD</tt>, etc. MPICH does allow these datatypes.
<TT>MPI_COMPLEX</TT> is not valid for <TT>MPI_MAX</TT> and <TT>MPI_MIN</TT>. In addition, the MPI
1.1 standard did not include the C types <TT>MPI_CHAR</TT> and <TT>MPI_UNSIGNED_CHAR
</TT>among the lists of arithmetic types for operations like <TT>MPI_SUM</TT>. However,
since the C type <TT>char</TT> is an integer type (like <TT>short</TT>), it should have been
included. The MPI Forum will probably include <TT>char</TT> and <TT>unsigned char
</TT>as a clarification to MPI 1.1; until then, users are advised that MPI
implementations may not accept <TT>MPI_CHAR</TT> and <TT>MPI_UNSIGNED_CHAR</TT> as valid
datatypes for <TT>MPI_SUM</TT>, <TT>MPI_PROD</TT>, etc. MPICH does allow these datatypes.
<P>
<H2>Permanent key values</H2>
These are the same in C and Fortran
@@ -342,7 +342,7 @@ MPI_TAG_UB - Largest tag value
</DL>
<DL><DT><B>MPI_IO </B> <DD> Rank of process that can do I/O
</DL>
<DL><DT><B>MPI_WTIME_IS_GLOBAL </B> <DD> Has value 1 if <tt>MPI_WTIME</tt> is globally synchronized.
<DL><DT><B>MPI_WTIME_IS_GLOBAL </B> <DD> Has value 1 if <TT>MPI_WTIME</TT> is globally synchronized.
</DL>
<DL><DT><B>MPI_UNIVERSE_SIZE </B> <DD> Number of available processes. See the standard for
a description of limitations on this value
@@ -350,7 +350,7 @@ a description of limitations on this value
<DL><DT><B>MPI_LASTUSEDCODE </B> <DD> Last used MPI error code (check - code or class?)
</DL>
<DL><DT><B>MPI_APPNUM </B> <DD> Application number, starting from 0. See the standard for
<tt>MPI_COMM_SPAWN_MULTIPLE</tt> and <tt>mpiexec</tt> for details
<TT>MPI_COMM_SPAWN_MULTIPLE</TT> and <TT>mpiexec</TT> for details
</DL>
</DL>
<P>
@@ -390,14 +390,14 @@ MPI_COMM_NULL - Null communicator
<P>
<H2>Predefined Constants</H2>
MPI_MAX_PROCESSOR_NAME - Maximum length of name returned by
<tt>MPI_GET_PROCESSOR_NAME
</tt>
<TT>MPI_GET_PROCESSOR_NAME
</TT>
<DL><DT><B>MPI_MAX_ERROR_STRING </B> <DD> Maximum length of string return by
<tt>MPI_ERROR_STRING
</tt>
<TT>MPI_ERROR_STRING
</TT>
</DL>
<DL><DT><B>MPI_MAX_LIBRARY_VERSION_STRING </B> <DD> Maximum length of string returned by
<tt>MPI_GET_LIBRARY_VERSION_STRING</tt>???
<TT>MPI_GET_LIBRARY_VERSION_STRING</TT>???
</DL>
<DL><DT><B>MPI_MAX_PORT_NAME </B> <DD> Maximum length of a port
</DL>
@@ -415,8 +415,8 @@ undefined or unknown integer value
<DL><DT><B>MPI_KEYVAL_INVALID </B> <DD> Special keyval that may be used to detect
uninitialized keyvals.
</DL>
<DL><DT><B>MPI_BSEND_OVERHEAD </B> <DD> Add this to the size of a <tt>MPI_BSEND
</tt>buffer for each outstanding message
<DL><DT><B>MPI_BSEND_OVERHEAD </B> <DD> Add this to the size of a <TT>MPI_BSEND
</TT>buffer for each outstanding message
</DL>
<DL><DT><B>MPI_PROC_NULL </B> <DD> This rank may be used to send or receive from no-one.
</DL>
@@ -474,17 +474,17 @@ the end of the file
<P>
<H2>File Displacement</H2>
MPI_DISPLACEMENT_CURRENT - Use with files opened with mode
<tt>MPI_MODE_SEQUENTIAL</tt> in calls to <tt>MPI_FILE_SET_VIEW
</tt>
<TT>MPI_MODE_SEQUENTIAL</TT> in calls to <TT>MPI_FILE_SET_VIEW
</TT>
<P>
<H2>File Positioning</H2>
MPI_SEEK_SET - Set the pointer to <tt>offset
</tt>
<DL><DT><B>MPI_SEEK_CUR </B> <DD> Set the pointer to the current position plus <tt>offset
</tt>
MPI_SEEK_SET - Set the pointer to <TT>offset
</TT>
<DL><DT><B>MPI_SEEK_CUR </B> <DD> Set the pointer to the current position plus <TT>offset
</TT>
</DL>
<DL><DT><B>MPI_SEEK_END </B> <DD> Set the pointer to the end of the file plus <tt>offset
</tt>
<DL><DT><B>MPI_SEEK_END </B> <DD> Set the pointer to the end of the file plus <TT>offset
</TT>
</DL>
</DL>
<P>
@@ -548,19 +548,19 @@ calls
MPI_INFO_ENV - Contains the execution environment
<P>
<H2>MPI Status</H2>
The <tt>MPI_Status</tt> datatype is a structure in C. The three elements for use
The <TT>MPI_Status</TT> datatype is a structure in C. The three elements for use
by programmers are
MPI_SOURCE - Who sent the message
<DL><DT><B>MPI_TAG </B> <DD> What tag the message was sent with
</DL>
<DL><DT><B>MPI_ERROR </B> <DD> Any error return (only when the error returned by the routine
has error class <tt>MPI_ERR_IN_STATUS</tt>)
has error class <TT>MPI_ERR_IN_STATUS</TT>)
</DL>
</DL>
<P>
MPI_STATUS_IGNORE - Ignore a single <tt>MPI_Status</tt> argument
<DL><DT><B>MPI_STATUSES_IGNORE </B> <DD> Ignore an array of <tt>MPI_Status
</tt>
MPI_STATUS_IGNORE - Ignore a single <TT>MPI_Status</TT> argument
<DL><DT><B>MPI_STATUSES_IGNORE </B> <DD> Ignore an array of <TT>MPI_Status
</TT>
</DL>
</DL>
<P>
@@ -671,14 +671,14 @@ MPI_Aint - C type that holds any valid address.
<DL><DT><B>MPI_Offset </B> <DD> C type that holds any valid file offset.
</DL>
<DL><DT><B>MPI_Handler_function </B> <DD> C function for handling errors (see
<tt>MPI_Errhandler_create</tt>) .
<TT>MPI_Errhandler_create</TT>) .
</DL>
<DL><DT><B>MPI_User_function </B> <DD> C function to combine values (see collective operations
and <tt>MPI_Op_create</tt>)
and <TT>MPI_Op_create</TT>)
</DL>
<DL><DT><B>MPI_Copy_function </B> <DD> Function to copy attributes (see <tt>MPI_Keyval_create</tt>)
<DL><DT><B>MPI_Copy_function </B> <DD> Function to copy attributes (see <TT>MPI_Keyval_create</TT>)
</DL>
<DL><DT><B>MPI_Delete_function </B> <DD> Function to delete attributes (see <tt>MPI_Keyval_create</tt>)
<DL><DT><B>MPI_Delete_function </B> <DD> Function to delete attributes (see <TT>MPI_Keyval_create</TT>)
</DL>
<DL><DT><B>MPI_ERRORS_ARE_FATAL </B> <DD> Error handler that forces exit on error
</DL>
@@ -758,8 +758,8 @@ MPI_SUCCESS - Successful return code
<DL><DT><B>MPI_ERR_ACCESS </B> <DD> Permission denied
</DL>
<DL><DT><B>MPI_ERR_AMODE </B> <DD> Error related to the amode passed to
<tt>MPI_FILE_OPEN
</tt>
<TT>MPI_FILE_OPEN
</TT>
</DL>
<DL><DT><B>MPI_ERR_BAD_FILE </B> <DD> Invalid file name (e.g., path name too long)
</DL>
@@ -768,8 +768,8 @@ conversion function
</DL>
<DL><DT><B>MPI_ERR_DUP_DATAREP </B> <DD> Conversion functions could not be registered
because a data representation identifier that was already defined was passed
to <tt>MPI_REGISTER_DATAREP
</tt>
to <TT>MPI_REGISTER_DATAREP
</TT>
</DL>
<DL><DT><B>MPI_ERR_FILE_EXISTS </B> <DD> File exists
</DL>
@@ -787,8 +787,8 @@ the file is currently open by some process
<DL><DT><B>MPI_ERR_READ_ONLY </B> <DD> Read-only file or file system
</DL>
<DL><DT><B>MPI_ERR_UNSUPPORTED_DATAREP </B> <DD> Unsupported datarep passed to
<tt>MPI_FILE_SET_VIEW
</tt>
<TT>MPI_FILE_SET_VIEW
</TT>
</DL>
<DL><DT><B>MPI_ERR_INFO </B> <DD> Invalid info argument
</DL>

View File

@@ -0,0 +1,18 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML3.2 EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="DOCTEXT">
<TITLE>MPIR_Type_commit</TITLE>
</HEAD>
<BODY BGCOLOR="FFFFFF">
<A NAME="MPIR_Type_commit"><H1>MPIR_Type_commit</H1></A>
nput Parameters: . datatype_p - pointer to MPI datatype
<H2>Synopsis</H2>
<PRE>
int MPIR_Type_commit(MPI_Datatype * datatype_p)
</PRE>
<H2>Output Parameters</H2>
<P>
<H2>Return Value</H2>
0 on success, -1 on failure.
</BODY></HTML>

View File

@@ -0,0 +1,27 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML3.2 EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="DOCTEXT">
<TITLE>MPIR_Type_contiguous</TITLE>
</HEAD>
<BODY BGCOLOR="FFFFFF">
<A NAME="MPIR_Type_contiguous"><H1>MPIR_Type_contiguous</H1></A>
create a contiguous datatype
<H2>Synopsis</H2>
<PRE>
int MPIR_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype * newtype)
</PRE>
<H2>Input Parameters</H2>
<DL>
<DT><B>count </B><DD>number of elements in the contiguous block
<DT><B>oldtype </B><DD>type (using handle) of datatype on which vector is based
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>newtype </B> <DD> handle of new contiguous datatype
</DL>
<P>
<H2>Return Value</H2>
MPI_SUCCESS on success, MPI error code on failure.
</BODY></HTML>

View File

@@ -0,0 +1,29 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML3.2 EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="DOCTEXT">
<TITLE>MPIR_Type_dup</TITLE>
</HEAD>
<BODY BGCOLOR="FFFFFF">
<A NAME="MPIR_Type_dup"><H1>MPIR_Type_dup</H1></A>
create a copy of a datatype
<H2>Synopsis</H2>
<PRE>
#undef FUNCNAME
#define FUNCNAME MPIR_Type_dup
#undef FCNAME
#define FCNAME MPL_QUOTE(FUNCNAME)
int MPIR_Type_dup(MPI_Datatype oldtype, MPI_Datatype * newtype)
</PRE>
<H2>Input Parameters</H2>
<DL><DT><B>oldtype </B> <DD> handle of original datatype
</DL>
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>newtype </B> <DD> handle of newly created copy of datatype
</DL>
<P>
<H2>Return Value</H2>
0 on success, MPI error code on failure.
</BODY></HTML>

View File

@@ -0,0 +1,39 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML3.2 EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="DOCTEXT">
<TITLE>MPIR_Type_get_contents</TITLE>
</HEAD>
<BODY BGCOLOR="FFFFFF">
<A NAME="MPIR_Type_get_contents"><H1>MPIR_Type_get_contents</H1></A>
get content information from datatype
<H2>Synopsis</H2>
<PRE>
int MPIR_Type_get_contents(MPI_Datatype datatype,
int max_integers,
int max_addresses,
int max_datatypes,
int array_of_integers[],
MPI_Aint array_of_addresses[], MPI_Datatype array_of_datatypes[])
</PRE>
<H2>Input Parameters</H2>
<DL>
<DT><B>datatype </B><DD>MPI datatype
<DT><B>max_integers </B><DD>size of array_of_integers
<DT><B>max_addresses </B><DD>size of array_of_addresses
<DT><B>max_datatypes </B><DD>size of array_of_datatypes
</DL>
<P>
<H2>Output Parameters</H2>
<DL>
<DT><B>array_of_integers </B><DD>integers used in creating type
<DT><B>array_of_addresses </B><DD>MPI_Aints used in creating type
<DT><B>array_of_datatypes </B><DD>MPI_Datatypes used in creating type
</DL>
<P>
</BODY></HTML>

View File

@@ -0,0 +1,39 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML3.2 EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="DOCTEXT">
<TITLE>MPIR_Type_indexed</TITLE>
</HEAD>
<BODY BGCOLOR="FFFFFF">
<A NAME="MPIR_Type_indexed"><H1>MPIR_Type_indexed</H1></A>
create an indexed datatype
<H2>Synopsis</H2>
<PRE>
int MPIR_Type_indexed(int count,
const int *blocklength_array,
const void *displacement_array,
int dispinbytes, MPI_Datatype oldtype, MPI_Datatype * newtype)
</PRE>
<H2>Input Parameters</H2>
<DL>
<DT><B>count </B><DD>number of blocks in type
<DT><B>blocklength_array </B><DD>number of elements in each block
<DT><B>displacement_array </B><DD>offsets of blocks from start of type (see next
parameter for units)
<DT><B>dispinbytes </B><DD>if nonzero, then displacements are in bytes (the
displacement_array is an array of ints), otherwise they in terms of
extent of oldtype (the displacement_array is an array of MPI_Aints)
<DT><B>oldtype </B><DD>type (using handle) of datatype on which new type is based
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>newtype </B> <DD> handle of new indexed datatype
</DL>
<P>
<H2>Return Value</H2>
0 on success, -1 on failure.
</BODY></HTML>

View File

@@ -0,0 +1,38 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML3.2 EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="DOCTEXT">
<TITLE>MPIR_Type_struct</TITLE>
</HEAD>
<BODY BGCOLOR="FFFFFF">
<A NAME="MPIR_Type_struct"><H1>MPIR_Type_struct</H1></A>
create a struct datatype
<H2>Synopsis</H2>
<PRE>
#undef FUNCNAME
#define FUNCNAME MPIR_Type_struct
#undef FCNAME
#define FCNAME MPL_QUOTE(FUNCNAME)
int MPIR_Type_struct(int count,
const int *blocklength_array,
const MPI_Aint * displacement_array,
const MPI_Datatype * oldtype_array, MPI_Datatype * newtype)
</PRE>
<H2>Input Parameters</H2>
<DL>
<DT><B>count </B><DD>number of blocks in vector
<DT><B>blocklength_array </B><DD>number of elements in each block
<DT><B>displacement_array </B><DD>offsets of blocks from start of type in bytes
<DT><B>oldtype_array </B><DD>types (using handle) of datatypes on which vector is based
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>newtype </B> <DD> handle of new struct datatype
</DL>
<P>
<H2>Return Value</H2>
MPI_SUCCESS on success, MPI errno on failure.
</BODY></HTML>

View File

@@ -0,0 +1,38 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML3.2 EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="DOCTEXT">
<TITLE>MPIR_Type_vector</TITLE>
</HEAD>
<BODY BGCOLOR="FFFFFF">
<A NAME="MPIR_Type_vector"><H1>MPIR_Type_vector</H1></A>
create a vector datatype
<H2>Synopsis</H2>
<PRE>
int MPIR_Type_vector(int count,
int blocklength,
MPI_Aint stride,
int strideinbytes, MPI_Datatype oldtype, MPI_Datatype * newtype)
</PRE>
<H2>Input Parameters</H2>
<DL>
<DT><B>count </B><DD>number of blocks in vector
<DT><B>blocklength </B><DD>number of elements in each block
<DT><B>stride </B><DD>distance from beginning of one block to the next (see next
parameter for units)
<DT><B>strideinbytes </B><DD>if nonzero, then stride is in bytes, otherwise stride
is in terms of extent of oldtype
<DT><B>oldtype </B><DD>type (using handle) of datatype on which vector is based
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>newtype </B> <DD> handle of new vector datatype
</DL>
<P>
<H2>Return Value</H2>
0 on success, MPI error code on failure.
</BODY></HTML>

View File

@@ -24,38 +24,38 @@ int MPIX_Comm_agree(MPI_Comm comm, int *flag)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<P>
</BODY></HTML>

View File

@@ -16,46 +16,46 @@ int MPIX_Comm_failure_ack( MPI_Comm comm )
</DL>
<P>
<H2>Notes</H2>
Because MPI specifies that null objects (e.g., <tt>MPI_COMM_NULL</tt>) are invalid
as input to MPI routines unless otherwise specified, using <tt>MPI_COMM_NULL
</tt>as input to this routine is an error.
Because MPI specifies that null objects (e.g., <TT>MPI_COMM_NULL</TT>) are invalid
as input to MPI routines unless otherwise specified, using <TT>MPI_COMM_NULL
</TT>as input to this routine is an error.
<P>
<H2>Thread and Interrupt Safety</H2>
<P>
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
</BODY></HTML>

View File

@@ -20,46 +20,46 @@ int MPIX_Comm_failure_get_acked( MPI_Comm comm, MPI_Group *failedgrp )
</DL>
<P>
<H2>Notes</H2>
Because MPI specifies that null objects (e.g., <tt>MPI_COMM_NULL</tt>) are invalid
as input to MPI routines unless otherwise specified, using <tt>MPI_COMM_NULL
</tt>as input to this routine is an error.
Because MPI specifies that null objects (e.g., <TT>MPI_COMM_NULL</TT>) are invalid
as input to MPI routines unless otherwise specified, using <TT>MPI_COMM_NULL
</TT>as input to this routine is an error.
<P>
<H2>Thread and Interrupt Safety</H2>
<P>
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
</BODY></HTML>

View File

@@ -16,32 +16,32 @@ int MPIX_Comm_revoke(MPI_Comm comm)
</DL>
<P>
<H2>Notes</H2>
Asynchronously notifies all MPI processes associated with the communicator <tt>comm</tt>.
Asynchronously notifies all MPI processes associated with the communicator <TT>comm</TT>.
This will be manifest by returning the MPIX_ERR_REVOKED during a subsequent MPI
call.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>

View File

@@ -24,38 +24,38 @@ int MPIX_Comm_shrink(MPI_Comm comm, MPI_Comm *newcomm)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<P>
</BODY></HTML>

View File

@@ -19,8 +19,8 @@ int MPI_Abort(MPI_Comm comm, int errorcode)
</DL>
<P>
<H2>Notes</H2>
Terminates all MPI processes associated with the communicator <tt>comm</tt>; in
most systems (all to date), terminates <em>all</em> processes.
Terminates all MPI processes associated with the communicator <TT>comm</TT>; in
most systems (all to date), terminates <EM>all</EM> processes.
<P>
<H2>Thread and Interrupt Safety</H2>
<P>
@@ -31,35 +31,35 @@ not be used from within a signal handler.
The MPI standard defined a thread-safe interface but this does not
mean that all routines may be called without any thread locks. For
example, two threads must not attempt to change the contents of the
same <tt>MPI_Info</tt> object concurrently. The user is responsible in this
same <TT>MPI_Info</TT> object concurrently. The user is responsible in this
case for using some mechanism, such as thread locks, to ensure that
only one thread at a time makes use of this routine.
Because the <tt>MPI_Abort</tt> routine is intended to ensure that an MPI
Because the <TT>MPI_Abort</TT> routine is intended to ensure that an MPI
process (and possibly an entire job), it cannot wait for a thread to
release a lock or other mechanism for atomic access.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>

View File

@@ -38,53 +38,53 @@ buffer (nonnegative integer)
<P>
<H2>Notes</H2>
The basic components of both the origin and target datatype must be the same
predefined datatype (e.g., all <tt>MPI_INT</tt> or all <tt>MPI_DOUBLE_PRECISION</tt>).
predefined datatype (e.g., all <TT>MPI_INT</TT> or all <TT>MPI_DOUBLE_PRECISION</TT>).
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_RANK </B> <DD> Invalid source or destination rank. Ranks must be between
zero and the size of the communicator minus one; ranks in a receive
(<tt>MPI_Recv</tt>, <tt>MPI_Irecv</tt>, <tt>MPI_Sendrecv</tt>, etc.) may also be <tt>MPI_ANY_SOURCE</tt>.
(<TT>MPI_Recv</TT>, <TT>MPI_Irecv</TT>, <TT>MPI_Sendrecv</TT>, etc.) may also be <TT>MPI_ANY_SOURCE</TT>.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_WIN </B> <DD> Invalid MPI window object
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Raccumulate
<br>
<BR>
</BODY></HTML>

View File

@@ -20,37 +20,37 @@ int MPI_Add_error_class(int *errorclass)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <tt>MPI_Error_string</tt> to get more information
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <TT>MPI_Error_string</TT> to get more information
about this error code.
</DL>
</BODY></HTML>

View File

@@ -24,37 +24,37 @@ int MPI_Add_error_code(int errorclass, int *errorcode)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <tt>MPI_Error_string</tt> to get more information
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <TT>MPI_Error_string</TT> to get more information
about this error code.
</DL>
</BODY></HTML>

View File

@@ -19,15 +19,15 @@ int MPI_Add_error_string(int errorcode, const char *string)
</DL>
<P>
<H2>Notes</H2>
The string must be no more than <tt>MPI_MAX_ERROR_STRING</tt> characters long.
The string must be no more than <TT>MPI_MAX_ERROR_STRING</TT> characters long.
The length of the string is as defined in the calling language.
The length of the string does not include the null terminator in C or C++.
Note that the string is <tt>const</tt> even though the MPI standard does not
Note that the string is <TT>const</TT> even though the MPI standard does not
specify it that way.
<P>
According to the MPI-2 standard, it is erroneous to call <tt>MPI_Add_error_string
</tt>for an error code or class with a value less than or equal
to <tt>MPI_ERR_LASTCODE</tt>. Thus, you cannot replace the predefined error messages
According to the MPI-2 standard, it is erroneous to call <TT>MPI_Add_error_string
</TT>for an error code or class with a value less than or equal
to <TT>MPI_ERR_LASTCODE</TT>. Thus, you cannot replace the predefined error messages
with this routine.
<P>
<H2>Thread and Interrupt Safety</H2>
@@ -35,31 +35,31 @@ with this routine.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>

View File

@@ -22,7 +22,7 @@ int MPI_Address(void *location, MPI_Aint *address)
<H2>Note</H2>
This routine is provided for both the Fortran and C programmers.
On many systems, the address returned by this routine will be the same
as produced by the C <tt>&amp;</tt> operator, but this is not required in C and
as produced by the C <TT>&amp;</TT> operator, but this is not required in C and
may not be true of systems with word- rather than byte-oriented
instructions or systems with segmented address spaces.
<P>
@@ -37,36 +37,36 @@ The MPI-2 standard deprecated a number of routines because MPI-2 provides
better versions. This routine is one of those that was deprecated. The
routine may continue to be used, but new code should use the replacement
routine.
The replacement for this routine is <tt>MPI_Get_address</tt>.
The replacement for this routine is <TT>MPI_Get_address</TT>.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <tt>MPI_Error_string</tt> to get more information
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <TT>MPI_Error_string</TT> to get more information
about this error code.
</DL>
</BODY></HTML>

View File

@@ -34,7 +34,7 @@ as if the process that originally produced base had called:
</PRE>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Aint_diff
<br>
<BR>
</BODY></HTML>

View File

@@ -35,7 +35,7 @@ process that originally produced the addresses had called
on the addresses initially passed to MPI_GET_ADDRESS.
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Aint_add
<br>
<BR>
</BODY></HTML>

View File

@@ -10,8 +10,7 @@ Gathers data from all tasks and distribute the combined data to all tasks
<H2>Synopsis</H2>
<PRE>
int MPI_Allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm)
void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
</PRE>
<H2>Input Parameters</H2>
<DL>
@@ -34,26 +33,26 @@ int MPI_Allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
<P>
<H2>Notes</H2>
The MPI standard (1.0 and 1.1) says that
<br>
<BR>
<P>
<br>
<BR>
<P>
The jth block of data sent from each process is received by every process
and placed in the jth block of the buffer <tt>recvbuf</tt>.
<br>
and placed in the jth block of the buffer <TT>recvbuf</TT>.
<BR>
<P>
<br>
<BR>
<P>
This is misleading; a better description is
<br>
<BR>
<P>
<br>
<BR>
<P>
The block of data sent from the jth process is received by every
process and placed in the jth block of the buffer <tt>recvbuf</tt>.
<br>
process and placed in the jth block of the buffer <TT>recvbuf</TT>.
<BR>
<P>
<br>
<BR>
<P>
This text was suggested by Rajeev Thakur and has been adopted as a
clarification by the MPI Forum.
@@ -63,42 +62,42 @@ clarification by the MPI Forum.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_BUFFER </B> <DD> Invalid buffer pointer. Usually a null buffer where

View File

@@ -25,9 +25,9 @@ int MPI_Allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
containing the number of elements that are to be received from each process
<DT><B>displs </B><DD>integer array (of length group size). Entry
<tt>i</tt> specifies the displacement (relative to recvbuf ) at
which to place the incoming data from process <tt>i</tt>
<TT>i</TT> specifies the displacement (relative to recvbuf) at
which to place the incoming data from process <TT>i
</TT>
<DT><B>recvtype </B><DD>data type of receive buffer elements (handle)
<DT><B>comm </B><DD>communicator (handle)
@@ -39,27 +39,27 @@ which to place the incoming data from process <tt>i</tt>
<P>
<H2>Notes</H2>
The MPI standard (1.0 and 1.1) says that
<br>
<BR>
<P>
<br>
<BR>
<P>
The jth block of data sent from
each process is received by every process and placed in the jth block of the
buffer <tt>recvbuf</tt>.
<br>
buffer <TT>recvbuf</TT>.
<BR>
<P>
<br>
<BR>
<P>
This is misleading; a better description is
<br>
<BR>
<P>
<br>
<BR>
<P>
The block of data sent from the jth process is received by every
process and placed in the jth block of the buffer <tt>recvbuf</tt>.
<br>
process and placed in the jth block of the buffer <TT>recvbuf</TT>.
<BR>
<P>
<br>
<BR>
<P>
This text was suggested by Rajeev Thakur, and has been adopted as a
clarification to the MPI standard by the MPI-Forum.
@@ -69,31 +69,31 @@ clarification to the MPI standard by the MPI-Forum.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -104,7 +104,7 @@ one is not valid.
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
</BODY></HTML>

View File

@@ -27,9 +27,9 @@ Using this routine from Fortran requires that the Fortran compiler accept
a common pointer extension. See Section 4.11 (Memory Allocation) in the
MPI-2 standard for more information and examples.
<P>
Also note that while <tt>baseptr</tt> is a <tt>void *</tt> type, this is
Also note that while <TT>baseptr</TT> is a <TT>void *</TT> type, this is
simply to allow easy use of any pointer object for this parameter.
In fact, this argument is really a <tt>void **</tt> type, that is, a
In fact, this argument is really a <TT>void **</TT> type, that is, a
pointer to a pointer.
<P>
<H2>Thread and Interrupt Safety</H2>
@@ -37,31 +37,31 @@ pointer to a pointer.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -70,10 +70,10 @@ possible.
<DL><DT><B>MPI_ERR_INFO </B> <DD> Invalid Info
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
<DL><DT><B>MPI_ERR_NO_MEM </B> <DD> Insufficient memory available for allocation by
<tt>MPI_Alloc_mem
</tt>
<TT>MPI_Alloc_mem
</TT>
</DL>
</BODY></HTML>

View File

@@ -34,25 +34,25 @@ int MPI_Allreduce(const void *sendbuf, void *recvbuf, int count,
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Notes on collective operations</H2>
<P>
The reduction functions (<tt>MPI_Op</tt>) do not return an error value. As a result,
if the functions detect an error, all they can do is either call <tt>MPI_Abort
</tt>or silently skip the problem. Thus, if you change the error handler from
<tt>MPI_ERRORS_ARE_FATAL</tt> to something else, for example, <tt>MPI_ERRORS_RETURN</tt>,
The reduction functions (<TT>MPI_Op</TT>) do not return an error value. As a result,
if the functions detect an error, all they can do is either call <TT>MPI_Abort
</TT>or silently skip the problem. Thus, if you change the error handler from
<TT>MPI_ERRORS_ARE_FATAL</TT> to something else, for example, <TT>MPI_ERRORS_RETURN</TT>,
then no error may be indicated.
<P>
The reason for this is the performance problems in ensuring that
@@ -60,16 +60,16 @@ all collective routines return the same error value.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -80,14 +80,14 @@ one is not valid.
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_OP </B> <DD> Invalid operation. MPI operations (objects of type <tt>MPI_Op</tt>)
must either be one of the predefined operations (e.g., <tt>MPI_SUM</tt>) or
created with <tt>MPI_Op_create</tt>.
<DL><DT><B>MPI_ERR_OP </B> <DD> Invalid operation. MPI operations (objects of type <TT>MPI_Op</TT>)
must either be one of the predefined operations (e.g., <TT>MPI_SUM</TT>) or
created with <TT>MPI_Op_create</TT>.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
</BODY></HTML>

View File

@@ -10,8 +10,7 @@ Sends data from all to all processes
<H2>Synopsis</H2>
<PRE>
int MPI_Alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm)
void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
</PRE>
<H2>Input Parameters</H2>
<DL>
@@ -37,42 +36,42 @@ int MPI_Alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_BUFFER </B> <DD> Invalid buffer pointer. Usually a null buffer where

View File

@@ -11,8 +11,7 @@ Sends data from all to all processes; each process may send a different amount
<PRE>
int MPI_Alltoallv(const void *sendbuf, const int *sendcounts,
const int *sdispls, MPI_Datatype sendtype, void *recvbuf,
const int *recvcounts, const int *rdispls, MPI_Datatype recvtype,
MPI_Comm comm)
const int *recvcounts, const int *rdispls, MPI_Datatype recvtype, MPI_Comm comm)
</PRE>
<H2>Input Parameters</H2>
<DL>
@@ -22,9 +21,9 @@ int MPI_Alltoallv(const void *sendbuf, const int *sendcounts,
specifying the number of elements to send to each processor
<DT><B>sdispls </B><DD>integer array (of length group size). Entry
<tt>j</tt> specifies the displacement (relative to sendbuf from
which to take the outgoing data destined for process <tt>j</tt>
<TT>j</TT> specifies the displacement (relative to sendbuf from
which to take the outgoing data destined for process <TT>j
</TT>
<DT><B>sendtype </B><DD>data type of send buffer elements (handle)
<DT><B>recvcounts </B><DD>integer array equal to the group size
@@ -32,9 +31,9 @@ specifying the maximum number of elements that can be received from
each processor
<DT><B>rdispls </B><DD>integer array (of length group size). Entry
<tt>i</tt> specifies the displacement (relative to recvbuf at
which to place the incoming data from process <tt>i</tt>
<TT>i</TT> specifies the displacement (relative to recvbuf at
which to place the incoming data from process <TT>i
</TT>
<DT><B>recvtype </B><DD>data type of receive buffer elements (handle)
<DT><B>comm </B><DD>communicator (handle)
@@ -49,42 +48,42 @@ which to place the incoming data from process <tt>i</tt>
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_BUFFER </B> <DD> Invalid buffer pointer. Usually a null buffer where

View File

@@ -50,47 +50,47 @@ the type of data received from process i (handle)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
</BODY></HTML>

View File

@@ -23,45 +23,45 @@ int MPI_Attr_delete(MPI_Comm comm, int keyval)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Deprecated Function</H2>
The MPI-2 standard deprecated a number of routines because MPI-2 provides
better versions. This routine is one of those that was deprecated. The
routine may continue to be used, but new code should use the replacement
routine.
The replacement for this routine is <tt>MPI_Comm_delete_attr</tt>.
The replacement for this routine is <TT>MPI_Comm_delete_attr</TT>.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> This error class is associated with an error code that
indicates that an attempt was made to free one of the permanent keys.

View File

@@ -20,7 +20,7 @@ int MPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag)
<P>
<H2>Output Parameters</H2>
<DL>
<DT><B>attribute_val </B><DD>attribute value, unless <tt>flag</tt> = false
<DT><B>attribute_val </B><DD>attribute value, unless <TT>flag</TT> = false
<DT><B>flag </B><DD>true if an attribute value was extracted; false if no attribute is
associated with the key
@@ -28,12 +28,12 @@ associated with the key
<P>
<H2>Notes</H2>
Attributes must be extracted from the same language as they were inserted
in with <tt>MPI_ATTR_PUT</tt>. The notes for C and Fortran below explain why.
in with <TT>MPI_ATTR_PUT</TT>. The notes for C and Fortran below explain why.
<P>
<H2>Notes for C</H2>
Even though the <tt>attribute_val</tt> argument is declared as <tt>void *</tt>, it is
really the address of a void pointer (i.e., a <tt>void **</tt>). Using
a <tt>void *</tt>, however, is more in keeping with C idiom and allows the
Even though the <TT>attribute_val</TT> argument is declared as <TT>void *</TT>, it is
really the address of a void pointer (i.e., a <TT>void **</TT>). Using
a <TT>void *</TT>, however, is more in keeping with C idiom and allows the
pointer to be passed without additional casts.
<P>
<P>
@@ -42,53 +42,53 @@ pointer to be passed without additional casts.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Deprecated Function</H2>
The MPI-2 standard deprecated a number of routines because MPI-2 provides
better versions. This routine is one of those that was deprecated. The
routine may continue to be used, but new code should use the replacement
routine.
The replacement for this routine is <tt>MPI_Comm_get_attr</tt>.
The replacement for this routine is <TT>MPI_Comm_get_attr</TT>.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
The <tt>attribute_val</tt> in Fortran is a pointer to a Fortran integer, not
a pointer to a <tt>void *</tt>.
The <TT>attribute_val</TT> in Fortran is a pointer to a Fortran integer, not
a pointer to a <TT>void *</TT>.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_KEYVAL </B> <DD> Invalid keyval
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Attr_put, MPI_Keyval_create, MPI_Attr_delete, MPI_Comm_get_attr
<br>
<BR>
</BODY></HTML>

View File

@@ -15,23 +15,23 @@ int MPI_Attr_put(MPI_Comm comm, int keyval, void *attribute_val)
<DL>
<DT><B>comm </B><DD>communicator to which attribute will be attached (handle)
<DT><B>keyval </B><DD>key value, as returned by <tt>MPI_KEYVAL_CREATE</tt> (integer)
<DT><B>keyval </B><DD>key value, as returned by <TT>MPI_KEYVAL_CREATE</TT> (integer)
<DT><B>attribute_val </B><DD>attribute value
</DL>
<P>
<H2>Notes</H2>
Values of the permanent attributes <tt>MPI_TAG_UB</tt>, <tt>MPI_HOST</tt>, <tt>MPI_IO</tt>,
<tt>MPI_WTIME_IS_GLOBAL</tt>, <tt>MPI_UNIVERSE_SIZE</tt>, <tt>MPI_LASTUSEDCODE</tt>, and
<tt>MPI_APPNUM</tt> may not be changed.
Values of the permanent attributes <TT>MPI_TAG_UB</TT>, <TT>MPI_HOST</TT>, <TT>MPI_IO</TT>,
<TT>MPI_WTIME_IS_GLOBAL</TT>, <TT>MPI_UNIVERSE_SIZE</TT>, <TT>MPI_LASTUSEDCODE</TT>, and
<TT>MPI_APPNUM</TT> may not be changed.
<P>
The type of the attribute value depends on whether C, C++, or Fortran
is being used.
In C and C++, an attribute value is a pointer (<tt>void *</tt>); in Fortran,
In C and C++, an attribute value is a pointer (<TT>void *</TT>); in Fortran,
it is a single
integer (<em>not</em> a pointer, since Fortran has no pointers and there are systems
integer (<EM>not</EM> a pointer, since Fortran has no pointers and there are systems
for which a pointer does not fit in an integer (e.g., any &gt; 32 bit address
system that uses 64 bits for Fortran <tt>DOUBLE PRECISION</tt>).
system that uses 64 bits for Fortran <TT>DOUBLE PRECISION</TT>).
<P>
If an attribute is already present, the delete function (specified when the
corresponding keyval was created) will be called.
@@ -41,45 +41,45 @@ corresponding keyval was created) will be called.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Deprecated Function</H2>
The MPI-2 standard deprecated a number of routines because MPI-2 provides
better versions. This routine is one of those that was deprecated. The
routine may continue to be used, but new code should use the replacement
routine.
The replacement for this routine is <tt>MPI_Comm_set_attr</tt>.
The replacement for this routine is <TT>MPI_Comm_set_attr</TT>.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_KEYVAL </B> <DD> Invalid keyval
</DL>
@@ -87,7 +87,7 @@ communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
indicates that an attempt was made to free one of the permanent keys.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Attr_get, MPI_Keyval_create, MPI_Attr_delete, MPI_Comm_set_attr
<br>
<BR>
</BODY></HTML>

View File

@@ -25,37 +25,37 @@ communicator have entered the call.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
</BODY></HTML>

View File

@@ -9,8 +9,7 @@
Broadcasts a message from the process with rank "root" to all other processes of the communicator
<H2>Synopsis</H2>
<PRE>
int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root,
MPI_Comm comm )
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
</PRE>
<H2>Input/Output Parameters</H2>
<DL><DT><B>buffer </B> <DD> starting address of buffer (choice)
@@ -32,44 +31,44 @@ int MPI_Bcast( void *buffer, int count, MPI_Datatype datatype, int root,
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_BUFFER </B> <DD> Invalid buffer pointer. Usually a null buffer where

View File

@@ -9,8 +9,7 @@
Basic send with user-provided buffering
<H2>Synopsis</H2>
<PRE>
int MPI_Bsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
MPI_Comm comm)
int MPI_Bsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
</PRE>
<H2>Input Parameters</H2>
<DL>
@@ -30,10 +29,10 @@ int MPI_Bsend(const void *buf, int count, MPI_Datatype datatype, int dest, int t
<H2>Notes</H2>
This send is provided as a convenience function; it allows the user to
send messages without worring about where they are buffered (because the
user <em>must</em> have provided buffer space with <tt>MPI_Buffer_attach</tt>).
user <EM>must</EM> have provided buffer space with <TT>MPI_Buffer_attach</TT>).
<P>
In deciding how much buffer space to allocate, remember that the buffer space
is not available for reuse by subsequent <tt>MPI_Bsend</tt>s unless you are certain
is not available for reuse by subsequent <TT>MPI_Bsend</TT>s unless you are certain
that the message
has been received (not just that it should have been received). For example,
this code does not allocate enough buffer space
@@ -45,7 +44,7 @@ this code does not allocate enough buffer space
</PRE>
because only enough buffer space is provided for a single send, and the
loop may start a second <tt>MPI_Bsend</tt> before the first is done making use of the
loop may start a second <TT>MPI_Bsend</TT> before the first is done making use of the
buffer.
<P>
In C, you can
@@ -55,7 +54,7 @@ force the messages to be delivered by
MPI_Buffer_attach(b, n);
</PRE>
(The <tt>MPI_Buffer_detach</tt> will not complete until all buffered messages are
(The <TT>MPI_Buffer_detach</TT> will not complete until all buffered messages are
delivered.)
<P>
<H2>Thread and Interrupt Safety</H2>
@@ -63,57 +62,57 @@ delivered.)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_RANK </B> <DD> Invalid source or destination rank. Ranks must be between
zero and the size of the communicator minus one; ranks in a receive
(<tt>MPI_Recv</tt>, <tt>MPI_Irecv</tt>, <tt>MPI_Sendrecv</tt>, etc.) may also be <tt>MPI_ANY_SOURCE</tt>.
(<TT>MPI_Recv</TT>, <TT>MPI_Irecv</TT>, <TT>MPI_Sendrecv</TT>, etc.) may also be <TT>MPI_ANY_SOURCE</TT>.
</DL>
<DL><DT><B>MPI_ERR_TAG </B> <DD> Invalid tag argument. Tags must be non-negative; tags
in a receive (<tt>MPI_Recv</tt>, <tt>MPI_Irecv</tt>, <tt>MPI_Sendrecv</tt>, etc.) may
also be <tt>MPI_ANY_TAG</tt>. The largest tag value is available through the
the attribute <tt>MPI_TAG_UB</tt>.
in a receive (<TT>MPI_Recv</TT>, <TT>MPI_Irecv</TT>, <TT>MPI_Sendrecv</TT>, etc.) may
also be <TT>MPI_ANY_TAG</TT>. The largest tag value is available through the
the attribute <TT>MPI_TAG_UB</TT>.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Buffer_attach, MPI_Ibsend, MPI_Bsend_init
<br>
<BR>
</BODY></HTML>

View File

@@ -36,57 +36,57 @@ int MPI_Bsend_init(const void *buf, int count, MPI_Datatype datatype,
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_COUNT </B> <DD> Invalid count argument. Count arguments must be
non-negative; a count of zero is often valid.
</DL>
<DL><DT><B>MPI_ERR_TYPE </B> <DD> Invalid datatype argument. Additionally, this error can
occur if an uncommitted MPI_Datatype (see <tt>MPI_Type_commit</tt>) is used
occur if an uncommitted MPI_Datatype (see <TT>MPI_Type_commit</TT>) is used
in a communication call.
</DL>
<DL><DT><B>MPI_ERR_RANK </B> <DD> Invalid source or destination rank. Ranks must be between
zero and the size of the communicator minus one; ranks in a receive
(<tt>MPI_Recv</tt>, <tt>MPI_Irecv</tt>, <tt>MPI_Sendrecv</tt>, etc.) may also be <tt>MPI_ANY_SOURCE</tt>.
(<TT>MPI_Recv</TT>, <TT>MPI_Irecv</TT>, <TT>MPI_Sendrecv</TT>, etc.) may also be <TT>MPI_ANY_SOURCE</TT>.
</DL>
<DL><DT><B>MPI_ERR_TAG </B> <DD> Invalid tag argument. Tags must be non-negative; tags
in a receive (<tt>MPI_Recv</tt>, <tt>MPI_Irecv</tt>, <tt>MPI_Sendrecv</tt>, etc.) may
also be <tt>MPI_ANY_TAG</tt>. The largest tag value is available through the
the attribute <tt>MPI_TAG_UB</tt>.
in a receive (<TT>MPI_Recv</TT>, <TT>MPI_Irecv</TT>, <TT>MPI_Sendrecv</TT>, etc.) may
also be <TT>MPI_ANY_TAG</TT>. The largest tag value is available through the
the attribute <TT>MPI_TAG_UB</TT>.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Buffer_attach
<br>
<BR>
</BODY></HTML>

View File

@@ -20,8 +20,8 @@ int MPI_Buffer_attach(void *buffer, int size)
<P>
<H2>Notes</H2>
The size given should be the sum of the sizes of all outstanding Bsends that
you intend to have, plus <tt>MPI_BSEND_OVERHEAD</tt> for each Bsend that you do.
For the purposes of calculating size, you should use <tt>MPI_Pack_size</tt>.
you intend to have, plus <TT>MPI_BSEND_OVERHEAD</TT> for each Bsend that you do.
For the purposes of calculating size, you should use <TT>MPI_Pack_size</TT>.
In other words, in the code
<PRE>
MPI_Buffer_attach(buffer, size);
@@ -30,7 +30,7 @@ In other words, in the code
MPI_Bsend(..., count=40, datatype=type2, ...);
</PRE>
the value of <tt>size</tt> in the <tt>MPI_Buffer_attach</tt> call should be greater than
the value of <TT>size</TT> in the <TT>MPI_Buffer_attach</TT> call should be greater than
the value computed by
<PRE>
MPI_Pack_size(20, type1, comm, &amp;s1);
@@ -38,9 +38,9 @@ the value computed by
size = s1 + s2 + 2 * MPI_BSEND_OVERHEAD;
</PRE>
The <tt>MPI_BSEND_OVERHEAD</tt> gives the maximum amount of space that may be used in
The <TT>MPI_BSEND_OVERHEAD</TT> gives the maximum amount of space that may be used in
the buffer for use by the BSEND routines in using the buffer. This value
is in <tt>mpi.h</tt> (for C) and <tt>mpif.h</tt> (for Fortran).
is in <TT>mpi.h</TT> (for C) and <TT>mpif.h</TT> (for Fortran).
<P>
<H2>Thread and Interrupt Safety</H2>
<P>
@@ -51,35 +51,35 @@ not be used from within a signal handler.
The MPI standard defined a thread-safe interface but this does not
mean that all routines may be called without any thread locks. For
example, two threads must not attempt to change the contents of the
same <tt>MPI_Info</tt> object concurrently. The user is responsible in this
same <TT>MPI_Info</TT> object concurrently. The user is responsible in this
case for using some mechanism, such as thread locks, to ensure that
only one thread at a time makes use of this routine.
Because the buffer for buffered sends (e.g., <tt>MPI_Bsend</tt>) is shared by all
Because the buffer for buffered sends (e.g., <TT>MPI_Bsend</TT>) is shared by all
threads in a process, the user is responsible for ensuring that only
one thread at a time calls this routine or <tt>MPI_Buffer_detach</tt>.
one thread at a time calls this routine or <TT>MPI_Buffer_detach</TT>.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -89,10 +89,10 @@ possible.
one is not valid.
</DL>
<DL><DT><B>MPI_ERR_INTERN </B> <DD> An internal error has been detected. This is fatal.
Please send a bug report to <tt>mpi-bugs@mcs.anl.gov</tt>.
Please send a bug report to <TT>mpi-bugs@mcs.anl.gov</TT>.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Buffer_detach, MPI_Bsend
<br>
<BR>
</BODY></HTML>

View File

@@ -19,7 +19,7 @@ int MPI_Buffer_detach(void *buffer_addr, int *size)
</DL>
<P>
<H2>Notes</H2>
The reason that <tt>MPI_Buffer_detach</tt> returns the address and size of the
The reason that <TT>MPI_Buffer_detach</TT> returns the address and size of the
buffer being detached is to allow nested libraries to replace and restore
the buffer. For example, consider
<P>
@@ -41,7 +41,7 @@ strengths (it is simple) and weaknesses (it only works for nested usages).
<P>
Note that for this approach to work, MPI_Buffer_detach must return MPI_SUCCESS
even when there is no buffer to detach. In that case, it returns a size of
zero. The MPI 1.1 standard for <tt>MPI_BUFFER_DETACH</tt> contains the text
zero. The MPI 1.1 standard for <TT>MPI_BUFFER_DETACH</TT> contains the text
<P>
<PRE>
The statements made in this section describe the behavior of MPI for
@@ -51,8 +51,8 @@ zero. The MPI 1.1 standard for <tt>MPI_BUFFER_DETACH</tt> contains the text
<P>
This could be read as applying only to the various Bsend routines. This
implementation takes the position that this applies to <tt>MPI_BUFFER_DETACH
</tt>as well.
implementation takes the position that this applies to <TT>MPI_BUFFER_DETACH
</TT>as well.
<P>
<H2>Thread and Interrupt Safety</H2>
<P>
@@ -63,22 +63,22 @@ not be used from within a signal handler.
The MPI standard defined a thread-safe interface but this does not
mean that all routines may be called without any thread locks. For
example, two threads must not attempt to change the contents of the
same <tt>MPI_Info</tt> object concurrently. The user is responsible in this
same <TT>MPI_Info</TT> object concurrently. The user is responsible in this
case for using some mechanism, such as thread locks, to ensure that
only one thread at a time makes use of this routine.
Because the buffer for buffered sends (e.g., <tt>MPI_Bsend</tt>) is shared by all
Because the buffer for buffered sends (e.g., <TT>MPI_Bsend</TT>) is shared by all
threads in a process, the user is responsible for ensuring that only
one thread at a time calls this routine or <tt>MPI_Buffer_attach</tt>.
one thread at a time calls this routine or <TT>MPI_Buffer_attach</TT>.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
The Fortran binding for this routine is different. Because Fortran
does not have pointers, it is impossible to provide a way to use the
@@ -86,11 +86,11 @@ output of this routine to exchange buffers. In this case, only the
size field is set.
<P>
<H2>Notes for C</H2>
Even though the <tt>bufferptr</tt> argument is declared as <tt>void *</tt>, it is
Even though the <TT>bufferptr</TT> argument is declared as <TT>void *</TT>, it is
really the address of a void pointer. See the rationale in the
standard for more details.
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Buffer_attach
<br>
<BR>
</BODY></HTML>

View File

@@ -16,9 +16,9 @@ int MPI_Cancel(MPI_Request *request)
</DL>
<P>
<H2>Notes</H2>
The primary expected use of <tt>MPI_Cancel</tt> is in multi-buffering
schemes, where speculative <tt>MPI_Irecvs</tt> are made. When the computation
completes, some of these receive requests may remain; using <tt>MPI_Cancel</tt> allows
The primary expected use of <TT>MPI_Cancel</TT> is in multi-buffering
schemes, where speculative <TT>MPI_Irecvs</TT> are made. When the computation
completes, some of these receive requests may remain; using <TT>MPI_Cancel</TT> allows
the user to cancel these unsatisfied requests.
<P>
Cancelling a send operation is much more difficult, in large part because the
@@ -34,18 +34,18 @@ messages).
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Null Handles</H2>
The MPI 1.1 specification, in the section on opaque objects, explicitly
@@ -62,25 +62,25 @@ disallows freeing a null communicator. The text from the standard is:
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_REQUEST </B> <DD> Invalid <tt>MPI_Request</tt>. Either null or, in the case of a
<tt>MPI_Start</tt> or <tt>MPI_Startall</tt>, not a persistent request.
<DL><DT><B>MPI_ERR_REQUEST </B> <DD> Invalid <TT>MPI_Request</TT>. Either null or, in the case of a
<TT>MPI_Start</TT> or <TT>MPI_Startall</TT>, not a persistent request.
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -15,13 +15,13 @@ int MPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int coords[])
<DL>
<DT><B>comm </B><DD>communicator with cartesian structure (handle)
<DT><B>rank </B><DD>rank of a process within group of <tt>comm</tt> (integer)
<DT><B>rank </B><DD>rank of a process within group of <TT>comm</TT> (integer)
<DT><B>maxdims </B><DD>length of vector <tt>coords</tt> in the calling program (integer)
<DT><B>maxdims </B><DD>length of vector <TT>coords</TT> in the calling program (integer)
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>coords </B> <DD> integer array (of size <tt>ndims</tt>) containing the Cartesian
<DL><DT><B>coords </B> <DD> integer array (of size <TT>ndims</TT>) containing the Cartesian
coordinates of specified process (integer)
</DL>
<P>
@@ -32,27 +32,27 @@ This means that this routine may safely be used by multiple threads and
from within a signal handler.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -60,16 +60,16 @@ possible.
</DL>
<DL><DT><B>MPI_ERR_TOPOLOGY </B> <DD> Invalid topology. Either there is no topology
associated with this communicator, or it is not the correct type (e.g.,
<tt>MPI_CART</tt> when expecting <tt>MPI_GRAPH</tt>).
<TT>MPI_CART</TT> when expecting <TT>MPI_GRAPH</TT>).
</DL>
<DL><DT><B>MPI_ERR_RANK </B> <DD> Invalid source or destination rank. Ranks must be between
zero and the size of the communicator minus one; ranks in a receive
(<tt>MPI_Recv</tt>, <tt>MPI_Irecv</tt>, <tt>MPI_Sendrecv</tt>, etc.) may also be <tt>MPI_ANY_SOURCE</tt>.
(<TT>MPI_Recv</TT>, <TT>MPI_Irecv</TT>, <TT>MPI_Sendrecv</TT>, etc.) may also be <TT>MPI_ANY_SOURCE</TT>.
</DL>
<DL><DT><B>MPI_ERR_DIMS </B> <DD> Invalid dimension argument. A dimension argument
is null or its length is less than or equal to zero.
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -32,38 +32,38 @@ periodic (true) or not (false) in each dimension
</DL>
<P>
<H2>Algorithm</H2>
We ignore <tt>reorder</tt> info currently.
We ignore <TT>reorder</TT> info currently.
<P>
<H2>Thread and Interrupt Safety</H2>
<P>
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -71,12 +71,12 @@ possible.
</DL>
<DL><DT><B>MPI_ERR_TOPOLOGY </B> <DD> Invalid topology. Either there is no topology
associated with this communicator, or it is not the correct type (e.g.,
<tt>MPI_CART</tt> when expecting <tt>MPI_GRAPH</tt>).
<TT>MPI_CART</TT> when expecting <TT>MPI_GRAPH</TT>).
</DL>
<DL><DT><B>MPI_ERR_DIMS </B> <DD> Invalid dimension argument. A dimension argument
is null or its length is less than or equal to zero.
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -9,15 +9,14 @@
Retrieves Cartesian topology information associated with a communicator
<H2>Synopsis</H2>
<PRE>
int MPI_Cart_get(MPI_Comm comm, int maxdims, int dims[], int periods[],
int coords[])
int MPI_Cart_get(MPI_Comm comm, int maxdims, int dims[], int periods[], int coords[])
</PRE>
<H2>Input Parameters</H2>
<DL>
<DT><B>comm </B><DD>communicator with cartesian structure (handle)
<DT><B>maxdims </B><DD>length of vectors <tt>dims</tt>, <tt>periods</tt>, and <tt>coords
</tt>in the calling program (integer)
<DT><B>maxdims </B><DD>length of vectors <TT>dims</TT>, <TT>periods</TT>, and <TT>coords
</TT>in the calling program (integer)
</DL>
<P>
<H2>Output Parameters</H2>
@@ -36,31 +35,31 @@ int MPI_Cart_get(MPI_Comm comm, int maxdims, int dims[], int periods[],
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -68,12 +67,12 @@ possible.
</DL>
<DL><DT><B>MPI_ERR_TOPOLOGY </B> <DD> Invalid topology. Either there is no topology
associated with this communicator, or it is not the correct type (e.g.,
<tt>MPI_CART</tt> when expecting <tt>MPI_GRAPH</tt>).
<TT>MPI_CART</TT> when expecting <TT>MPI_GRAPH</TT>).
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -9,8 +9,7 @@
Maps process to Cartesian topology information
<H2>Synopsis</H2>
<PRE>
int MPI_Cart_map(MPI_Comm comm, int ndims, const int dims[], const int periods[],
int *newrank)
int MPI_Cart_map(MPI_Comm comm, int ndims, const int dims[], const int periods[], int *newrank)
</PRE>
<H2>Input Parameters</H2>
<DL>
@@ -18,15 +17,15 @@ int MPI_Cart_map(MPI_Comm comm, int ndims, const int dims[], const int periods[]
<DT><B>ndims </B><DD>number of dimensions of Cartesian structure (integer)
<DT><B>dims </B><DD>integer array of size <tt>ndims</tt> specifying the number of processes in
<DT><B>dims </B><DD>integer array of size <TT>ndims</TT> specifying the number of processes in
each coordinate direction
<DT><B>periods </B><DD>logical array of size <tt>ndims</tt> specifying the periodicity
<DT><B>periods </B><DD>logical array of size <TT>ndims</TT> specifying the periodicity
specification in each coordinate direction
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>newrank </B> <DD> reordered rank of the calling process; <tt>MPI_UNDEFINED</tt> if
<DL><DT><B>newrank </B> <DD> reordered rank of the calling process; <TT>MPI_UNDEFINED</TT> if
calling process does not belong to grid (integer)
</DL>
<P>
@@ -37,39 +36,39 @@ This means that this routine may safely be used by multiple threads and
from within a signal handler.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_DIMS </B> <DD> Invalid dimension argument. A dimension argument
is null or its length is less than or equal to zero.
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -15,8 +15,8 @@ int MPI_Cart_rank(MPI_Comm comm, const int coords[], int *rank)
<DL>
<DT><B>comm </B><DD>communicator with cartesian structure (handle)
<DT><B>coords </B><DD>integer array (of size <tt>ndims</tt>, the number of dimensions of
the Cartesian topology associated with <tt>comm</tt>) specifying the cartesian
<DT><B>coords </B><DD>integer array (of size <TT>ndims</TT>, the number of dimensions of
the Cartesian topology associated with <TT>comm</TT>) specifying the cartesian
coordinates of a process
</DL>
<P>
@@ -26,7 +26,7 @@ coordinates of a process
<P>
<H2>Notes</H2>
Out-of-range coordinates are erroneous for non-periodic dimensions.
Versions of MPICH before 1.2.2 returned <tt>MPI_PROC_NULL</tt> for the rank in this
Versions of MPICH before 1.2.2 returned <TT>MPI_PROC_NULL</TT> for the rank in this
case.
<P>
<H2>Thread and Interrupt Safety</H2>
@@ -36,27 +36,27 @@ This means that this routine may safely be used by multiple threads and
from within a signal handler.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -64,13 +64,13 @@ possible.
</DL>
<DL><DT><B>MPI_ERR_TOPOLOGY </B> <DD> Invalid topology. Either there is no topology
associated with this communicator, or it is not the correct type (e.g.,
<tt>MPI_CART</tt> when expecting <tt>MPI_GRAPH</tt>).
<TT>MPI_CART</TT> when expecting <TT>MPI_GRAPH</TT>).
</DL>
<DL><DT><B>MPI_ERR_RANK </B> <DD> Invalid source or destination rank. Ranks must be between
zero and the size of the communicator minus one; ranks in a receive
(<tt>MPI_Recv</tt>, <tt>MPI_Irecv</tt>, <tt>MPI_Sendrecv</tt>, etc.) may also be <tt>MPI_ANY_SOURCE</tt>.
(<TT>MPI_Recv</TT>, <TT>MPI_Irecv</TT>, <TT>MPI_Sendrecv</TT>, etc.) may also be <TT>MPI_ANY_SOURCE</TT>.
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -9,8 +9,7 @@
Returns the shifted source and destination ranks, given a shift direction and amount
<H2>Synopsis</H2>
<PRE>
int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source,
int *rank_dest)
int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest)
</PRE>
<H2>Input Parameters</H2>
<DL>
@@ -29,7 +28,7 @@ int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source,
</DL>
<P>
<H2>Notes</H2>
The <tt>direction</tt> argument is in the range <tt>[0,n-1]</tt> for an n-dimensional
The <TT>direction</TT> argument is in the range <TT>[0,n-1]</TT> for an n-dimensional
Cartesian mesh.
<P>
<H2>Thread and Interrupt Safety</H2>
@@ -39,27 +38,27 @@ This means that this routine may safely be used by multiple threads and
from within a signal handler.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -67,12 +66,12 @@ possible.
</DL>
<DL><DT><B>MPI_ERR_TOPOLOGY </B> <DD> Invalid topology. Either there is no topology
associated with this communicator, or it is not the correct type (e.g.,
<tt>MPI_CART</tt> when expecting <tt>MPI_GRAPH</tt>).
<TT>MPI_CART</TT> when expecting <TT>MPI_GRAPH</TT>).
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -15,7 +15,7 @@ int MPI_Cart_sub(MPI_Comm comm, const int remain_dims[], MPI_Comm *newcomm)
<DL>
<DT><B>comm </B><DD>communicator with cartesian structure (handle)
<DT><B>remain_dims </B><DD>the <tt>i</tt>th entry of remain_dims specifies whether the <tt>i</tt>th
<DT><B>remain_dims </B><DD>the <TT>i</TT>th entry of remain_dims specifies whether the <TT>i</TT>th
dimension is kept in the subgrid (true) or is dropped (false) (logical
vector)
</DL>
@@ -30,31 +30,31 @@ process (handle)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -62,12 +62,12 @@ possible.
</DL>
<DL><DT><B>MPI_ERR_TOPOLOGY </B> <DD> Invalid topology. Either there is no topology
associated with this communicator, or it is not the correct type (e.g.,
<tt>MPI_CART</tt> when expecting <tt>MPI_GRAPH</tt>).
<TT>MPI_CART</TT> when expecting <TT>MPI_GRAPH</TT>).
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -26,36 +26,36 @@ This means that this routine may safely be used by multiple threads and
from within a signal handler.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -24,32 +24,32 @@ not be used from within a signal handler.
The MPI standard defined a thread-safe interface but this does not
mean that all routines may be called without any thread locks. For
example, two threads must not attempt to change the contents of the
same <tt>MPI_Info</tt> object concurrently. The user is responsible in this
same <TT>MPI_Info</TT> object concurrently. The user is responsible in this
case for using some mechanism, such as thread locks, to ensure that
only one thread at a time makes use of this routine.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>

View File

@@ -32,31 +32,31 @@ int MPI_Comm_accept(const char *port_name, MPI_Info info, int root, MPI_Comm com
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
@@ -65,6 +65,6 @@ possible.
<DL><DT><B>MPI_ERR_INFO </B> <DD> Invalid Info
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
</BODY></HTML>

View File

@@ -32,39 +32,39 @@ with this routine.
The MPI standard defined a thread-safe interface but this does not
mean that all routines may be called without any thread locks. For
example, two threads must not attempt to change the contents of the
same <tt>MPI_Info</tt> object concurrently. The user is responsible in this
same <TT>MPI_Info</TT> object concurrently. The user is responsible in this
case for using some mechanism, such as thread locks, to ensure that
only one thread at a time makes use of this routine.
<P>
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
</BODY></HTML>

View File

@@ -19,62 +19,62 @@ int MPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int *result)
</DL>
<P>
<H2>Output Parameters</H2>
<DL><DT><B>result </B> <DD> integer which is <tt>MPI_IDENT</tt> if the contexts and groups are the
same, <tt>MPI_CONGRUENT</tt> if different contexts but identical groups, <tt>MPI_SIMILAR
</tt>if different contexts but similar groups, and <tt>MPI_UNEQUAL</tt> otherwise
<DL><DT><B>result </B> <DD> integer which is <TT>MPI_IDENT</TT> if the contexts and groups are the
same, <TT>MPI_CONGRUENT</TT> if different contexts but identical groups, <TT>MPI_SIMILAR
</TT>if different contexts but similar groups, and <TT>MPI_UNEQUAL</TT> otherwise
</DL>
<P>
<H2>Using 'MPI_COMM_NULL' with 'MPI_Comm_compare'</H2>
<P>
It is an error to use <tt>MPI_COMM_NULL</tt> as one of the arguments to
<tt>MPI_Comm_compare</tt>. The relevant sections of the MPI standard are
It is an error to use <TT>MPI_COMM_NULL</TT> as one of the arguments to
<TT>MPI_Comm_compare</TT>. The relevant sections of the MPI standard are
<P>
.(2.4.1 Opaque Objects)
A null handle argument is an erroneous <tt>IN</tt> argument in MPI calls, unless an
A null handle argument is an erroneous <TT>IN</TT> argument in MPI calls, unless an
exception is explicitly stated in the text that defines the function.
<P>
.(5.4.1. Communicator Accessors)
where there is no text in <tt>MPI_COMM_COMPARE</tt> allowing a null handle.
where there is no text in <TT>MPI_COMM_COMPARE</TT> allowing a null handle.
<P>
<H2>Thread and Interrupt Safety</H2>
<P>
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
(To perform the communicator comparisions, this routine may need to
allocate some memory. Memory allocation is not interrupt-safe, and hence
this routine is only thread-safe.)
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> Invalid argument. Some argument is invalid and is not
identified by a specific error class (e.g., <tt>MPI_ERR_RANK</tt>).
identified by a specific error class (e.g., <TT>MPI_ERR_RANK</TT>).
</DL>
</BODY></HTML>

View File

@@ -32,38 +32,38 @@ int MPI_Comm_connect(const char *port_name, MPI_Info info, int root, MPI_Comm co
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_INFO </B> <DD> Invalid Info
</DL>

View File

@@ -15,7 +15,7 @@ int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm)
<DL>
<DT><B>comm </B><DD>communicator (handle)
<DT><B>group </B><DD>group, which is a subset of the group of <tt>comm</tt> (handle)
<DT><B>group </B><DD>group, which is a subset of the group of <TT>comm</TT> (handle)
</DL>
<P>
<H2>Output Parameters</H2>
@@ -27,43 +27,43 @@ int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_GROUP </B> <DD> Null or invalid group passed to function.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Comm_free
<br>
<BR>
</BODY></HTML>

View File

@@ -30,40 +30,40 @@ void MPI_Comm_errhandler_function(MPI_Comm *comm, int *rc);
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <tt>MPI_Error_string</tt> to get more information
<DL><DT><B>MPI_ERR_OTHER </B> <DD> Other error; use <TT>MPI_Error_string</TT> to get more information
about this error code.
</DL>
</BODY></HTML>

View File

@@ -15,7 +15,7 @@ int MPI_Comm_create_group(MPI_Comm comm, MPI_Group group, int tag, MPI_Comm * ne
<DL>
<DT><B>comm </B><DD>communicator (handle)
<DT><B>group </B><DD>group, which is a subset of the group of <tt>comm</tt> (handle)
<DT><B>group </B><DD>group, which is a subset of the group of <TT>comm</TT> (handle)
<DT><B>tag </B><DD>safe tag unused by other communication
</DL>
@@ -29,43 +29,43 @@ int MPI_Comm_create_group(MPI_Comm comm, MPI_Group group, int tag, MPI_Comm * ne
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_GROUP </B> <DD> Null or invalid group passed to function.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Comm_free
<br>
<BR>
</BODY></HTML>

View File

@@ -15,10 +15,10 @@ int MPI_Comm_create_keyval(MPI_Comm_copy_attr_function *comm_copy_attr_fn,
</PRE>
<H2>Input Parameters</H2>
<DL>
<DT><B>comm_copy_attr_fn </B><DD>Copy callback function for <tt>keyval
</tt>
<DT><B>comm_delete_attr_fn </B><DD>Delete callback function for <tt>keyval
</tt>
<DT><B>comm_copy_attr_fn </B><DD>Copy callback function for <TT>keyval
</TT>
<DT><B>comm_delete_attr_fn </B><DD>Delete callback function for <TT>keyval
</TT>
<DT><B>extra_state </B><DD>Extra state for callback functions
</DL>
<P>
@@ -39,17 +39,17 @@ Default copy and delete functions are available. These are
</DL>
<P>
There are subtle differences between C and Fortran that require that the
copy_fn be written in the same language from which <tt>MPI_Comm_create_keyval
</tt>is called.
copy_fn be written in the same language from which <TT>MPI_Comm_create_keyval
</TT>is called.
This should not be a problem for most users; only programmers using both
Fortran and C in the same program need to be sure that they follow this rule.
<P>
<P>
<H2>Return value from attribute callbacks</H2>
The MPI-2 versions of the attribute callbacks should return either
<tt>MPI_SUCCESS</tt> on success or a valid MPI error code or class on failure.
<TT>MPI_SUCCESS</TT> on success or a valid MPI error code or class on failure.
The MPI standard is ambiguous on this point, but as MPI-2 provides
the routines <tt>MPI_Add_error_class</tt> and <tt>MPI_Add_error_code</tt> that allow the
the routines <TT>MPI_Add_error_class</TT> and <TT>MPI_Add_error_code</TT> that allow the
user to define and use MPI error codes and classes.
<P>
<H2>Thread and Interrupt Safety</H2>
@@ -57,38 +57,38 @@ user to define and use MPI error codes and classes.
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Comm_free_keyval
<br>
<BR>
</BODY></HTML>

View File

@@ -23,44 +23,44 @@ int MPI_Comm_delete_attr(MPI_Comm comm, int comm_keyval)
This routine is thread-safe. This means that this routine may be
safely used by multiple threads without the need for any user-provided
thread locks. However, the routine is not interrupt safe. Typically,
this is due to the use of memory allocation routines such as <tt>malloc
</tt>or other non-MPICH runtime routines that are themselves not interrupt-safe.
this is due to the use of memory allocation routines such as <TT>malloc
</TT>or other non-MPICH runtime routines that are themselves not interrupt-safe.
<P>
<H2>Notes for Fortran</H2>
All MPI routines in Fortran (except for <tt>MPI_WTIME</tt> and <tt>MPI_WTICK</tt>) have
an additional argument <tt>ierr</tt> at the end of the argument list. <tt>ierr
</tt>is an integer and has the same meaning as the return value of the routine
All MPI routines in Fortran (except for <TT>MPI_WTIME</TT> and <TT>MPI_WTICK</TT>) have
an additional argument <TT>ierr</TT> at the end of the argument list. <TT>ierr
</TT>is an integer and has the same meaning as the return value of the routine
in C. In Fortran, MPI routines are subroutines, and are invoked with the
<tt>call</tt> statement.
<TT>call</TT> statement.
<P>
All MPI objects (e.g., <tt>MPI_Datatype</tt>, <tt>MPI_Comm</tt>) are of type <tt>INTEGER
</tt>in Fortran.
All MPI objects (e.g., <TT>MPI_Datatype</TT>, <TT>MPI_Comm</TT>) are of type <TT>INTEGER
</TT>in Fortran.
<P>
<H2>Errors</H2>
<P>
All MPI routines (except <tt>MPI_Wtime</tt> and <tt>MPI_Wtick</tt>) return an error value;
All MPI routines (except <TT>MPI_Wtime</TT> and <TT>MPI_Wtick</TT>) return an error value;
C routines as the value of the function and Fortran routines in the last
argument. Before the value is returned, the current MPI error handler is
called. By default, this error handler aborts the MPI job. The error handler
may be changed with <tt>MPI_Comm_set_errhandler</tt> (for communicators),
<tt>MPI_File_set_errhandler</tt> (for files), and <tt>MPI_Win_set_errhandler</tt> (for
RMA windows). The MPI-1 routine <tt>MPI_Errhandler_set</tt> may be used but
may be changed with <TT>MPI_Comm_set_errhandler</TT> (for communicators),
<TT>MPI_File_set_errhandler</TT> (for files), and <TT>MPI_Win_set_errhandler</TT> (for
RMA windows). The MPI-1 routine <TT>MPI_Errhandler_set</TT> may be used but
its use is deprecated. The predefined error handler
<tt>MPI_ERRORS_RETURN</tt> may be used to cause error values to be returned.
Note that MPI does <em>not</em> guarentee that an MPI program can continue past
<TT>MPI_ERRORS_RETURN</TT> may be used to cause error values to be returned.
Note that MPI does <EM>not</EM> guarentee that an MPI program can continue past
an error; however, MPI implementations will attempt to continue whenever
possible.
<P>
<DL><DT><B>MPI_SUCCESS </B> <DD> No error; MPI routine completed successfully.
</DL>
<DL><DT><B>MPI_ERR_COMM </B> <DD> Invalid communicator. A common error is to use a null
communicator in a call (not even allowed in <tt>MPI_Comm_rank</tt>).
communicator in a call (not even allowed in <TT>MPI_Comm_rank</TT>).
</DL>
<DL><DT><B>MPI_ERR_ARG </B> <DD> This error class is associated with an error code that
indicates that an attempt was made to free one of the permanent keys.
</DL>
<P>
<H0>See Also</H0>
<H2>See Also</H2>
MPI_Comm_set_attr, MPI_Comm_create_keyval
<br>
<BR>
</BODY></HTML>

Some files were not shown because too many files have changed in this diff Show More