📄 mpi.h
字号:
/*
* $Id: mpi.h,v 1.19 2002/03/11 10:30:17 joachim Exp $
*
* (C) 1993 by Argonne National Laboratory and Mississipi State University.
* All rights reserved. See COPYRIGHT in top-level directory.
*/
/* user include file for MPI programs */
#ifndef _MPI_INCLUDE
#define _MPI_INCLUDE
/*
NEW_POINTERS enables using ints for the MPI objects instead of addresses.
This is required by MPI 1.1, particularly for Fortran (also for C,
since you can now have "constant" values for things like MPI_INT, and
they are stronger than "constant between MPI_INIT and MPI_FINALIZE".
For example, we might want to allow MPI_INT as a case label.
NEW_POINTERS is the default; I'm purging all code that doesn't use
NEW_POINTERS from the source.
*/
/* The following definitions are used to support a single source tree for
both Unix and Windows NT versions of MPICH. For Unix users, the
definition is empty.
Currently we cannot use __declspec(dllimport) since this will break the
profiling interface. If used, the linker would always link the functions from the dll,
not from the wrapper. So we leave IMPORT_MPI_API empty.
*/
#if defined(WIN32_IMPORT_DLL) && !defined(IN_MPICH_DLL) && !defined(MPID_NO_IMPORT)
#define IMPORT_MPI_API __declspec(dllimport)
#else
#define IMPORT_MPI_API
#endif
#define EXPORT_MPI_API
#define NEW_POINTERS
/* Keep C++ compilers from getting confused */
#if defined(__cplusplus)
extern "C" {
#endif
/* We require that the C compiler support prototypes */
#define MPIR_ARGS(a) a
/* Results of the compare operations */
/* These should stay ordered */
#define MPI_IDENT 0
#define MPI_CONGRUENT 1
#define MPI_SIMILAR 2
#define MPI_UNEQUAL 3
/* Data types
* A more aggressive yet homogeneous implementation might want to
* make the values here the number of bytes in the basic type, with
* a simple test against a max limit (e.g., 16 for long double), and
* non-contiguous structures with indices greater than that.
*
* Note: Configure knows these values for providing the Fortran optional
* types (like MPI_REAL8). Any changes here must be matched by changes
* in configure.in
*/
typedef int MPI_Datatype;
#define MPI_CHAR ((MPI_Datatype)1)
#define MPI_UNSIGNED_CHAR ((MPI_Datatype)2)
#define MPI_BYTE ((MPI_Datatype)3)
#define MPI_SHORT ((MPI_Datatype)4)
#define MPI_UNSIGNED_SHORT ((MPI_Datatype)5)
#define MPI_INT ((MPI_Datatype)6)
#define MPI_UNSIGNED ((MPI_Datatype)7)
#define MPI_LONG ((MPI_Datatype)8)
#define MPI_UNSIGNED_LONG ((MPI_Datatype)9)
#define MPI_FLOAT ((MPI_Datatype)10)
#define MPI_DOUBLE ((MPI_Datatype)11)
#define MPI_LONG_DOUBLE ((MPI_Datatype)12)
#define MPI_LONG_LONG_INT ((MPI_Datatype)13)
/* MPI_LONG_LONG is in the complete ref 2nd edition, though not in the
standard. Rather, MPI_LONG_LONG_INT is on page 40 in the HPCA version */
#define MPI_LONG_LONG ((MPI_Datatype)13)
#define MPI_PACKED ((MPI_Datatype)14)
#define MPI_LB ((MPI_Datatype)15)
#define MPI_UB ((MPI_Datatype)16)
/*
The layouts for the types MPI_DOUBLE_INT etc are simply
struct {
double var;
int loc;
}
This is documented in the man pages on the various datatypes.
*/
#define MPI_FLOAT_INT ((MPI_Datatype)17)
#define MPI_DOUBLE_INT ((MPI_Datatype)18)
#define MPI_LONG_INT ((MPI_Datatype)19)
#define MPI_SHORT_INT ((MPI_Datatype)20)
#define MPI_2INT ((MPI_Datatype)21)
#define MPI_LONG_DOUBLE_INT ((MPI_Datatype)22)
/* Fortran types */
#define MPI_COMPLEX ((MPI_Datatype)23)
#define MPI_DOUBLE_COMPLEX ((MPI_Datatype)24)
#define MPI_LOGICAL ((MPI_Datatype)25)
#define MPI_REAL ((MPI_Datatype)26)
#define MPI_DOUBLE_PRECISION ((MPI_Datatype)27)
#define MPI_INTEGER ((MPI_Datatype)28)
#define MPI_2INTEGER ((MPI_Datatype)29)
#define MPI_2COMPLEX ((MPI_Datatype)30)
#define MPI_2DOUBLE_COMPLEX ((MPI_Datatype)31)
#define MPI_2REAL ((MPI_Datatype)32)
#define MPI_2DOUBLE_PRECISION ((MPI_Datatype)33)
#define MPI_CHARACTER ((MPI_Datatype)1)
/* Communicators */
typedef int MPI_Comm;
/* META */
#ifndef META
#define MPI_COMM_WORLD 91
#endif
#define MPI_COMM_SELF 92
#ifdef META
#define MPI_COMM_ALL 91
#define MPI_COMM_META 93
/* make sure that all use of MPI_COMM_WORLD in the MPI-Application
use MPI_COMM_META instead */
#define MPI_COMM_WORLD 93
/* for the META-Environment, we need different communicators
on each host. This is done by giving them different indexes
on each host - I hope this works! Just take care that
META_MPI_MAX_HOSTS is not bigger than the available index
space.*/
#define MPI_COMM_HOST_BASE 150
#define MPI_COMM_LOCAL_BASE 166
extern IMPORT_MPI_API int MPI_COMM_HOST;
extern IMPORT_MPI_API int MPI_COMM_LOCAL;
#endif
/* /META */
/* Groups */
typedef int MPI_Group;
#define MPI_GROUP_EMPTY 90
/* Windows */
typedef int MPI_Win;
#define MPI_WIN_NULL ((MPI_Win) 0)
#define MPI_WIN_BASE 1
#define MPI_WIN_SIZE 2
#define MPI_WIN_DISP_UNIT 3
/* winlocks */
#define MPI_LOCK_EXCLUSIVE 1
#define MPI_LOCK_SHARED 2
/* Collective operations */
typedef int MPI_Op;
#define MPI_MAX (MPI_Op)(100)
#define MPI_MIN (MPI_Op)(101)
#define MPI_SUM (MPI_Op)(102)
#define MPI_PROD (MPI_Op)(103)
#define MPI_LAND (MPI_Op)(104)
#define MPI_BAND (MPI_Op)(105)
#define MPI_LOR (MPI_Op)(106)
#define MPI_BOR (MPI_Op)(107)
#define MPI_LXOR (MPI_Op)(108)
#define MPI_BXOR (MPI_Op)(109)
#define MPI_MINLOC (MPI_Op)(110)
#define MPI_MAXLOC (MPI_Op)(111)
#define MPI_REPLACE (MPI_Op)(112)
#define MPI_DIV (MPI_Op)(113)
#define MPI_MOD (MPI_Op)(114)
/* Permanent key values */
/* C Versions (return pointer to value) */
#define MPI_TAG_UB 81
#define MPI_HOST 83
#define MPI_IO 85
#define MPI_WTIME_IS_GLOBAL 87
/* Fortran Versions (return integer value) */
#define MPIR_TAG_UB 80
#define MPIR_HOST 82
#define MPIR_IO 84
#define MPIR_WTIME_IS_GLOBAL 86
/* Define some null objects */
#define MPI_COMM_NULL ((MPI_Comm)0)
#define MPI_OP_NULL ((MPI_Op)0)
#define MPI_GROUP_NULL ((MPI_Group)0)
#define MPI_DATATYPE_NULL ((MPI_Datatype)0)
#define MPI_REQUEST_NULL ((MPI_Request)0)
#define MPI_ERRHANDLER_NULL ((MPI_Errhandler )0)
/* These are only guesses; make sure you change them in mpif.h as well */
#define MPI_MAX_PROCESSOR_NAME 256
#define MPI_MAX_ERROR_STRING 512
#define MPI_MAX_NAME_STRING 63 /* How long a name do you need ? */
/* Pre-defined constants */
#define MPI_UNDEFINED (-32766)
#define MPI_UNDEFINED_RANK MPI_UNDEFINED
#define MPI_KEYVAL_INVALID 0
/* Upper bound on the overhead in bsend for each message buffer */
#define MPI_BSEND_OVERHEAD 512
/* Topology types */
#define MPI_GRAPH 1
#define MPI_CART 2
#define MPI_BOTTOM (void *)0
#define MPI_PROC_NULL (-1)
#define MPI_ANY_SOURCE (-2)
#define MPI_ROOT (-3)
#define MPI_ANY_TAG (-1)
/*
Status object. It is the only user-visible MPI data-structure
The "count" field is PRIVATE; use MPI_Get_count to access it.
*/
typedef struct {
int count;
int MPI_SOURCE;
int MPI_TAG;
int MPI_ERROR;
int private_count;
} MPI_Status;
/* MPI_STATUS_SIZE is not strictly required in C; however, it should match
the value for Fortran */
#define MPI_STATUS_SIZE 5
/* Must be able to hold any valid address. 64 bit machines may need
to change this */
/* #if (defined(_SX) && !defined(_LONG64)) */
/* NEC SX-4 in some modes needs this */
/* typedef long long MPI_Aint; */
/* #else */
/* typedef long MPI_Aint; */
/* #endif */
/* MPI Error handlers. Systems that don't support stdargs can't use
this definition
*/
#if defined(USE_STDARG)
typedef void (MPI_Handler_function) ( MPI_Comm *, int *, ... );
typedef void (MPI_Win_errhandler_fn) ( MPI_Win *, int *, ...);
#else
typedef void (MPI_Handler_function) ();
typedef void (MPI_Win_errhandler_fn) ();
#endif
/* For MPI 2 error handling */
typedef MPI_Handler_function MPI_Comm_errhandler_fn;
#define MPI_ERRORS_ARE_FATAL ((MPI_Errhandler)119)
#define MPI_ERRORS_RETURN ((MPI_Errhandler)120)
#define MPIR_ERRORS_WARN ((MPI_Errhandler)121)
typedef int MPI_Errhandler;
/* Make the C names for the null functions all upper-case. Note that
this is required for systems that use all uppercase names for Fortran
externals. */
/* MPI 1 names */
#define MPI_NULL_COPY_FN MPIR_null_copy_fn
#define MPI_NULL_DELETE_FN MPIR_null_delete_fn
#define MPI_DUP_FN MPIR_dup_fn
/* MPI 2 names */
#define MPI_COMM_NULL_COPY_FN MPI_NULL_COPY_FN
#define MPI_COMM_NULL_DELETE_FN MPI_NULL_DELETE_FN
#define MPI_COMM_DUP_FN MPI_DUP_FN
/* MPI request opjects */
typedef union MPIR_HANDLE *MPI_Request;
/* User combination function */
typedef void (MPI_User_function) ( void *, void *, int *, MPI_Datatype * );
/* MPI Attribute copy and delete functions */
typedef int (MPI_Copy_function) ( MPI_Comm, int, void *, void *, void *, int * );
typedef int (MPI_Delete_function) ( MPI_Comm, int, void *, void * );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -