barrier in close whenever shared files supported
[mpich.git] / src / include / mpi.h.in
1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
2 /*  
3  *  (C) 2001 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6 /* @configure_input@ */
7 #ifndef MPI_INCLUDED
8 #define MPI_INCLUDED
9
10 /* user include file for MPI programs */
11
12 /* Keep C++ compilers from getting confused */
13 #if defined(__cplusplus)
14 extern "C" {
15 #endif
16
17 #undef MPICH_DEFINE_ATTR_TYPE_TYPES
18 #if defined(__has_attribute)
19 #  if __has_attribute(pointer_with_type_tag) && \
20       __has_attribute(type_tag_for_datatype) && \
21       !defined(MPICH_NO_ATTR_TYPE_TAGS)
22 #    define MPICH_DEFINE_ATTR_TYPE_TYPES 1
23 #    define MPICH_ATTR_POINTER_WITH_TYPE_TAG(buffer_idx, type_idx)  __attribute__((pointer_with_type_tag(MPI,buffer_idx,type_idx)))
24 #    define MPICH_ATTR_TYPE_TAG(type)                               __attribute__((type_tag_for_datatype(MPI,type)))
25 #    define MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(type)             __attribute__((type_tag_for_datatype(MPI,type,layout_compatible)))
26 #    define MPICH_ATTR_TYPE_TAG_MUST_BE_NULL()                      __attribute__((type_tag_for_datatype(MPI,void,must_be_null)))
27 #    include <stddef.h>
28 #  endif
29 #endif
30
31 #if !defined(MPICH_ATTR_POINTER_WITH_TYPE_TAG)
32 #  define MPICH_ATTR_POINTER_WITH_TYPE_TAG(buffer_idx, type_idx)
33 #  define MPICH_ATTR_TYPE_TAG(type)
34 #  define MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(type)
35 #  define MPICH_ATTR_TYPE_TAG_MUST_BE_NULL()
36 #endif
37
38 #if !defined(INT8_C)
39 /* stdint.h was not included, see if we can get it */
40 #  if defined(__cplusplus)
41 #    if __cplusplus >= 201103
42 #      include <cstdint>
43 #    endif
44 #  endif
45 #endif
46
47 #if !defined(INT8_C)
48 /* stdint.h was not included, see if we can get it */
49 #  if defined(__STDC_VERSION__)
50 #    if __STDC_VERSION__ >= 199901
51 #      include <stdint.h>
52 #    endif
53 #  endif
54 #endif
55
56 #if defined(INT8_C)
57 /* stdint.h was included, so we can annotate these types */
58 #  define MPICH_ATTR_TYPE_TAG_STDINT(type) MPICH_ATTR_TYPE_TAG(type)
59 #else
60 #  define MPICH_ATTR_TYPE_TAG_STDINT(type)
61 #endif
62
63 #ifdef __STDC_VERSION__ 
64 #if __STDC_VERSION__ >= 199901
65 #  define MPICH_ATTR_TYPE_TAG_C99(type) MPICH_ATTR_TYPE_TAG(type)
66 #else
67 #  define MPICH_ATTR_TYPE_TAG_C99(type)
68 #endif
69 #else 
70 #  define MPICH_ATTR_TYPE_TAG_C99(type)
71 #endif
72
73 #if defined(__cplusplus)
74 #  define MPICH_ATTR_TYPE_TAG_CXX(type) MPICH_ATTR_TYPE_TAG(type)
75 #else
76 #  define MPICH_ATTR_TYPE_TAG_CXX(type)
77 #endif
78
79
80 /* Define some null objects */
81 #define MPI_COMM_NULL      ((MPI_Comm)0x04000000)
82 #define MPI_OP_NULL        ((MPI_Op)0x18000000)
83 #define MPI_GROUP_NULL     ((MPI_Group)0x08000000)
84 #define MPI_DATATYPE_NULL  ((MPI_Datatype)0x0c000000)
85 #define MPI_REQUEST_NULL   ((MPI_Request)0x2c000000)
86 #define MPI_ERRHANDLER_NULL ((MPI_Errhandler)0x14000000)
87 #define MPI_MESSAGE_NULL   ((MPI_Message)MPI_REQUEST_NULL)
88 #define MPI_MESSAGE_NO_PROC ((MPI_Message)0x6c000000)
89
90 /* Results of the compare operations. */
91 #define MPI_IDENT     0
92 #define MPI_CONGRUENT 1
93 #define MPI_SIMILAR   2
94 #define MPI_UNEQUAL   3
95
96 typedef int MPI_Datatype;
97 #define MPI_CHAR           ((MPI_Datatype)@MPI_CHAR@)
98 #define MPI_SIGNED_CHAR    ((MPI_Datatype)@MPI_SIGNED_CHAR@)
99 #define MPI_UNSIGNED_CHAR  ((MPI_Datatype)@MPI_UNSIGNED_CHAR@)
100 #define MPI_BYTE           ((MPI_Datatype)@MPI_BYTE@)
101 #define MPI_WCHAR          ((MPI_Datatype)@MPI_WCHAR@)
102 #define MPI_SHORT          ((MPI_Datatype)@MPI_SHORT@)
103 #define MPI_UNSIGNED_SHORT ((MPI_Datatype)@MPI_UNSIGNED_SHORT@)
104 #define MPI_INT            ((MPI_Datatype)@MPI_INT@)
105 #define MPI_UNSIGNED       ((MPI_Datatype)@MPI_UNSIGNED_INT@)
106 #define MPI_LONG           ((MPI_Datatype)@MPI_LONG@)
107 #define MPI_UNSIGNED_LONG  ((MPI_Datatype)@MPI_UNSIGNED_LONG@)
108 #define MPI_FLOAT          ((MPI_Datatype)@MPI_FLOAT@)
109 #define MPI_DOUBLE         ((MPI_Datatype)@MPI_DOUBLE@)
110 #define MPI_LONG_DOUBLE    ((MPI_Datatype)@MPI_LONG_DOUBLE@)
111 #define MPI_LONG_LONG_INT  ((MPI_Datatype)@MPI_LONG_LONG@)
112 #define MPI_UNSIGNED_LONG_LONG ((MPI_Datatype)@MPI_UNSIGNED_LONG_LONG@)
113 #define MPI_LONG_LONG      MPI_LONG_LONG_INT
114
115 #ifdef MPICH_DEFINE_ATTR_TYPE_TYPES
116 static const MPI_Datatype mpich_mpi_char               MPICH_ATTR_TYPE_TAG(char)               = MPI_CHAR;
117 static const MPI_Datatype mpich_mpi_signed_char        MPICH_ATTR_TYPE_TAG(signed char)        = MPI_SIGNED_CHAR;
118 static const MPI_Datatype mpich_mpi_unsigned_char      MPICH_ATTR_TYPE_TAG(unsigned char)      = MPI_UNSIGNED_CHAR;
119 /*static const MPI_Datatype mpich_mpi_byte               MPICH_ATTR_TYPE_TAG(char)               = MPI_BYTE;*/
120 static const MPI_Datatype mpich_mpi_wchar              MPICH_ATTR_TYPE_TAG(wchar_t)            = MPI_WCHAR;
121 static const MPI_Datatype mpich_mpi_short              MPICH_ATTR_TYPE_TAG(short)              = MPI_SHORT;
122 static const MPI_Datatype mpich_mpi_unsigned_short     MPICH_ATTR_TYPE_TAG(unsigned short)     = MPI_UNSIGNED_SHORT;
123 static const MPI_Datatype mpich_mpi_int                MPICH_ATTR_TYPE_TAG(int)                = MPI_INT;
124 static const MPI_Datatype mpich_mpi_unsigned           MPICH_ATTR_TYPE_TAG(unsigned)           = MPI_UNSIGNED;
125 static const MPI_Datatype mpich_mpi_long               MPICH_ATTR_TYPE_TAG(long)               = MPI_LONG;
126 static const MPI_Datatype mpich_mpi_unsigned_long      MPICH_ATTR_TYPE_TAG(unsigned long)      = MPI_UNSIGNED_LONG;
127 static const MPI_Datatype mpich_mpi_float              MPICH_ATTR_TYPE_TAG(float)              = MPI_FLOAT;
128 static const MPI_Datatype mpich_mpi_double             MPICH_ATTR_TYPE_TAG(double)             = MPI_DOUBLE;
129 #if @MPI_LONG_DOUBLE@ != 0x0c000000
130 static const MPI_Datatype mpich_mpi_long_double        MPICH_ATTR_TYPE_TAG(long double)        = MPI_LONG_DOUBLE;
131 #endif
132 static const MPI_Datatype mpich_mpi_long_long_int      MPICH_ATTR_TYPE_TAG(long long int)      = MPI_LONG_LONG_INT;
133 static const MPI_Datatype mpich_mpi_unsigned_long_long MPICH_ATTR_TYPE_TAG(unsigned long long) = MPI_UNSIGNED_LONG_LONG;
134 #endif
135
136 #define MPI_PACKED         ((MPI_Datatype)@MPI_PACKED@)
137 #define MPI_LB             ((MPI_Datatype)@MPI_LB@)
138 #define MPI_UB             ((MPI_Datatype)@MPI_UB@)
139
140 /* 
141    The layouts for the types MPI_DOUBLE_INT etc are simply
142    struct { 
143        double var;
144        int    loc;
145    }
146    This is documented in the man pages on the various datatypes.   
147  */
148 #define MPI_FLOAT_INT         ((MPI_Datatype)@MPI_FLOAT_INT@)
149 #define MPI_DOUBLE_INT        ((MPI_Datatype)@MPI_DOUBLE_INT@)
150 #define MPI_LONG_INT          ((MPI_Datatype)@MPI_LONG_INT@)
151 #define MPI_SHORT_INT         ((MPI_Datatype)@MPI_SHORT_INT@)
152 #define MPI_2INT              ((MPI_Datatype)@MPI_2INT@)
153 #define MPI_LONG_DOUBLE_INT   ((MPI_Datatype)@MPI_LONG_DOUBLE_INT@)
154
155 #ifdef MPICH_DEFINE_ATTR_TYPE_TYPES
156 struct mpich_struct_mpi_float_int       { float f; int i; };
157 struct mpich_struct_mpi_double_int      { double d; int i; };
158 struct mpich_struct_mpi_long_int        { long l; int i; };
159 struct mpich_struct_mpi_short_int       { short s; int i; };
160 struct mpich_struct_mpi_2int            { int i1; int i2; };
161 #if @MPI_LONG_DOUBLE_INT@ != 0x0c000000
162 struct mpich_struct_mpi_long_double_int { long double ld; int i; };
163 #endif
164
165 static const MPI_Datatype mpich_mpi_float_int       MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(struct mpich_struct_mpi_float_int)       = MPI_FLOAT_INT;
166 static const MPI_Datatype mpich_mpi_double_int      MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(struct mpich_struct_mpi_double_int)      = MPI_DOUBLE_INT;
167 static const MPI_Datatype mpich_mpi_long_int        MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(struct mpich_struct_mpi_long_int)        = MPI_LONG_INT;
168 static const MPI_Datatype mpich_mpi_short_int       MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(struct mpich_struct_mpi_short_int)       = MPI_SHORT_INT;
169
170 /*
171  * The MPI_2INT line is commented out because currently Clang 3.3 flags
172  * struct {int i1; int i2;} as different from int[2]. But actually these
173  * two types are of the same layout. Clang gives a type mismatch warning
174  * for a definitely correct code like the following:
175  *  int in[2], out[2];
176  *  MPI_Reduce(in, out, 1, MPI_2INT, MPI_MAXLOC, 0, MPI_COMM_WORLD);
177  *
178  * So, we disable type checking for MPI_2INT until Clang fixes this bug.
179  */
180
181 /* static const MPI_Datatype mpich_mpi_2int            MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(struct mpich_struct_mpi_2int)            = MPI_2INT
182  */
183
184 #if @MPI_LONG_DOUBLE_INT@ != 0x0c000000
185 static const MPI_Datatype mpich_mpi_long_double_int MPICH_ATTR_TYPE_TAG_LAYOUT_COMPATIBLE(struct mpich_struct_mpi_long_double_int) = MPI_LONG_DOUBLE_INT;
186 #endif
187 #endif
188
189 /* Fortran types */
190 #define MPI_COMPLEX           ((MPI_Datatype)@MPI_COMPLEX@)
191 #define MPI_DOUBLE_COMPLEX    ((MPI_Datatype)@MPI_DOUBLE_COMPLEX@)
192 #define MPI_LOGICAL           ((MPI_Datatype)@MPI_LOGICAL@)
193 #define MPI_REAL              ((MPI_Datatype)@MPI_REAL@)
194 #define MPI_DOUBLE_PRECISION  ((MPI_Datatype)@MPI_DOUBLE_PRECISION@)
195 #define MPI_INTEGER           ((MPI_Datatype)@MPI_INTEGER@)
196 #define MPI_2INTEGER          ((MPI_Datatype)@MPI_2INTEGER@)
197 /* 
198  * MPI_2COMPLEX and MPI_2DOUBLE_COMPLEX were defined by accident in 
199  * MPI 1.0 and removed in MPI 1.1.  
200  *
201  * This definition provides backward compatibility.  These definitions
202  * will be removed in a subsequent MPICH release
203  */
204 #ifdef MPICH_DEFINE_2COMPLEX
205 #define MPI_2COMPLEX          ((MPI_Datatype)@MPI_2COMPLEX@)
206 #define MPI_2DOUBLE_COMPLEX   ((MPI_Datatype)@MPI_2DOUBLE_COMPLEX@)
207 #endif 
208 #define MPI_2REAL             ((MPI_Datatype)@MPI_2REAL@)
209 #define MPI_2DOUBLE_PRECISION ((MPI_Datatype)@MPI_2DOUBLE_PRECISION@)
210 #define MPI_CHARACTER         ((MPI_Datatype)@MPI_CHARACTER@)
211
212 /* Size-specific types (see MPI-2, 10.2.5) */
213 #define MPI_REAL4             ((MPI_Datatype)@MPI_REAL4@)
214 #define MPI_REAL8             ((MPI_Datatype)@MPI_REAL8@)
215 #define MPI_REAL16            ((MPI_Datatype)@MPI_REAL16@)
216 #define MPI_COMPLEX8          ((MPI_Datatype)@MPI_COMPLEX8@)
217 #define MPI_COMPLEX16         ((MPI_Datatype)@MPI_COMPLEX16@)
218 #define MPI_COMPLEX32         ((MPI_Datatype)@MPI_COMPLEX32@)
219 #define MPI_INTEGER1          ((MPI_Datatype)@MPI_INTEGER1@)
220 #define MPI_INTEGER2          ((MPI_Datatype)@MPI_INTEGER2@)
221 #define MPI_INTEGER4          ((MPI_Datatype)@MPI_INTEGER4@)
222 #define MPI_INTEGER8          ((MPI_Datatype)@MPI_INTEGER8@)
223 #define MPI_INTEGER16         ((MPI_Datatype)@MPI_INTEGER16@)
224
225 /* C99 fixed-width datatypes */
226 #define MPI_INT8_T            ((MPI_Datatype)@MPI_INT8_T@)
227 #define MPI_INT16_T           ((MPI_Datatype)@MPI_INT16_T@)
228 #define MPI_INT32_T           ((MPI_Datatype)@MPI_INT32_T@)
229 #define MPI_INT64_T           ((MPI_Datatype)@MPI_INT64_T@)
230 #define MPI_UINT8_T           ((MPI_Datatype)@MPI_UINT8_T@)
231 #define MPI_UINT16_T          ((MPI_Datatype)@MPI_UINT16_T@)
232 #define MPI_UINT32_T          ((MPI_Datatype)@MPI_UINT32_T@)
233 #define MPI_UINT64_T          ((MPI_Datatype)@MPI_UINT64_T@)
234
235 #ifdef MPICH_DEFINE_ATTR_TYPE_TYPES
236 static const MPI_Datatype mpich_mpi_int8_t   MPICH_ATTR_TYPE_TAG_STDINT(int8_t)   = MPI_INT8_T;
237 static const MPI_Datatype mpich_mpi_int16_t  MPICH_ATTR_TYPE_TAG_STDINT(int16_t)  = MPI_INT16_T;
238 static const MPI_Datatype mpich_mpi_int32_t  MPICH_ATTR_TYPE_TAG_STDINT(int32_t)  = MPI_INT32_T;
239 static const MPI_Datatype mpich_mpi_int64_t  MPICH_ATTR_TYPE_TAG_STDINT(int64_t)  = MPI_INT64_T;
240 static const MPI_Datatype mpich_mpi_uint8_t  MPICH_ATTR_TYPE_TAG_STDINT(uint8_t)  = MPI_UINT8_T;
241 static const MPI_Datatype mpich_mpi_uint16_t MPICH_ATTR_TYPE_TAG_STDINT(uint16_t) = MPI_UINT16_T;
242 static const MPI_Datatype mpich_mpi_uint32_t MPICH_ATTR_TYPE_TAG_STDINT(uint32_t) = MPI_UINT32_T;
243 static const MPI_Datatype mpich_mpi_uint64_t MPICH_ATTR_TYPE_TAG_STDINT(uint64_t) = MPI_UINT64_T;
244 #endif
245
246 /* other C99 types */
247 #define MPI_C_BOOL                 ((MPI_Datatype)@MPI_C_BOOL@)
248 #define MPI_C_FLOAT_COMPLEX        ((MPI_Datatype)@MPI_C_FLOAT_COMPLEX@)
249 #define MPI_C_COMPLEX              MPI_C_FLOAT_COMPLEX
250 #define MPI_C_DOUBLE_COMPLEX       ((MPI_Datatype)@MPI_C_DOUBLE_COMPLEX@)
251 #define MPI_C_LONG_DOUBLE_COMPLEX  ((MPI_Datatype)@MPI_C_LONG_DOUBLE_COMPLEX@)
252
253 #ifdef MPICH_DEFINE_ATTR_TYPE_TYPES
254 static const MPI_Datatype mpich_mpi_c_bool                MPICH_ATTR_TYPE_TAG_C99(_Bool)           = MPI_C_BOOL;
255 static const MPI_Datatype mpich_mpi_c_float_complex       MPICH_ATTR_TYPE_TAG_C99(float _Complex)  = MPI_C_FLOAT_COMPLEX;
256 static const MPI_Datatype mpich_mpi_c_double_complex      MPICH_ATTR_TYPE_TAG_C99(double _Complex) = MPI_C_DOUBLE_COMPLEX;
257 #if @MPI_C_LONG_DOUBLE_COMPLEX@ != 0x0c000000
258 static const MPI_Datatype mpich_mpi_c_long_double_complex MPICH_ATTR_TYPE_TAG_C99(long double _Complex) = MPI_C_LONG_DOUBLE_COMPLEX;
259 #endif
260 #endif
261
262 /* address/offset types */
263 #define MPI_AINT          ((MPI_Datatype)@MPI_AINT_DATATYPE@)
264 #define MPI_OFFSET        ((MPI_Datatype)@MPI_OFFSET_DATATYPE@)
265 #define MPI_COUNT         ((MPI_Datatype)@MPI_COUNT_DATATYPE@)
266
267 /* MPI-3 C++ types */
268 #define MPI_CXX_BOOL                ((MPI_Datatype)@MPIR_CXX_BOOL@)
269 #define MPI_CXX_FLOAT_COMPLEX       ((MPI_Datatype)@MPIR_CXX_COMPLEX@)
270 #define MPI_CXX_DOUBLE_COMPLEX      ((MPI_Datatype)@MPIR_CXX_DOUBLE_COMPLEX@)
271 #define MPI_CXX_LONG_DOUBLE_COMPLEX ((MPI_Datatype)@MPIR_CXX_LONG_DOUBLE_COMPLEX@)
272
273 /* typeclasses */
274 #define MPI_TYPECLASS_REAL 1
275 #define MPI_TYPECLASS_INTEGER 2
276 #define MPI_TYPECLASS_COMPLEX 3
277
278 /* Communicators */
279 typedef int MPI_Comm;
280 #define MPI_COMM_WORLD ((MPI_Comm)0x44000000)
281 #define MPI_COMM_SELF  ((MPI_Comm)0x44000001)
282
283 /* Groups */
284 typedef int MPI_Group;
285 #define MPI_GROUP_EMPTY ((MPI_Group)0x48000000)
286
287 /* RMA and Windows */
288 typedef int MPI_Win;
289 #define MPI_WIN_NULL ((MPI_Win)0x20000000)
290
291 /* File and IO */
292 /* This define lets ROMIO know that MPI_File has been defined */
293 #define MPI_FILE_DEFINED
294 /* ROMIO uses a pointer for MPI_File objects.  This must be the same definition
295    as in src/mpi/romio/include/mpio.h.in  */
296 typedef struct ADIOI_FileD *MPI_File;
297 #define MPI_FILE_NULL ((MPI_File)0)
298
299 /* Collective operations */
300 typedef int MPI_Op;
301
302 #define MPI_MAX     (MPI_Op)(0x58000001)
303 #define MPI_MIN     (MPI_Op)(0x58000002)
304 #define MPI_SUM     (MPI_Op)(0x58000003)
305 #define MPI_PROD    (MPI_Op)(0x58000004)
306 #define MPI_LAND    (MPI_Op)(0x58000005)
307 #define MPI_BAND    (MPI_Op)(0x58000006)
308 #define MPI_LOR     (MPI_Op)(0x58000007)
309 #define MPI_BOR     (MPI_Op)(0x58000008)
310 #define MPI_LXOR    (MPI_Op)(0x58000009)
311 #define MPI_BXOR    (MPI_Op)(0x5800000a)
312 #define MPI_MINLOC  (MPI_Op)(0x5800000b)
313 #define MPI_MAXLOC  (MPI_Op)(0x5800000c)
314 #define MPI_REPLACE (MPI_Op)(0x5800000d)
315 #define MPI_NO_OP   (MPI_Op)(0x5800000e)
316
317 /* Permanent key values */
318 /* C Versions (return pointer to value),
319    Fortran Versions (return integer value).
320    Handled directly by the attribute value routine
321    
322    DO NOT CHANGE THESE.  The values encode:
323    builtin kind (0x1 in bit 30-31)
324    Keyval object (0x9 in bits 26-29)
325    for communicator (0x1 in bits 22-25)
326    
327    Fortran versions of the attributes are formed by adding one to
328    the C version.
329  */
330 #define MPI_TAG_UB           0x64400001
331 #define MPI_HOST             0x64400003
332 #define MPI_IO               0x64400005
333 #define MPI_WTIME_IS_GLOBAL  0x64400007
334 #define MPI_UNIVERSE_SIZE    0x64400009
335 #define MPI_LASTUSEDCODE     0x6440000b
336 #define MPI_APPNUM           0x6440000d
337
338 /* In addition, there are 5 predefined window attributes that are
339    defined for every window */
340 #define MPI_WIN_BASE          0x66000001
341 #define MPI_WIN_SIZE          0x66000003
342 #define MPI_WIN_DISP_UNIT     0x66000005
343 #define MPI_WIN_CREATE_FLAVOR 0x66000007
344 #define MPI_WIN_MODEL         0x66000009
345
346 #ifdef MPICH_DEFINE_ATTR_TYPE_TYPES
347 static const MPI_Datatype mpich_mpi_datatype_null MPICH_ATTR_TYPE_TAG_MUST_BE_NULL() = MPI_DATATYPE_NULL;
348 #endif
349
350 /* These are only guesses; make sure you change them in mpif.h as well */
351 #define MPI_MAX_PROCESSOR_NAME @MPI_MAX_PROCESSOR_NAME@
352 #define MPI_MAX_LIBRARY_VERSION_STRING @MPI_MAX_LIBRARY_VERSION_STRING@
353 #define MPI_MAX_ERROR_STRING   @MPI_MAX_ERROR_STRING@
354 #define MPI_MAX_PORT_NAME      256
355 #define MPI_MAX_OBJECT_NAME    128
356
357 /* Pre-defined constants */
358 #define MPI_UNDEFINED      (-32766)
359 #define MPI_KEYVAL_INVALID 0x24000000
360
361 /* MPI-3 window flavors */
362 typedef enum MPIR_Win_flavor {
363     MPI_WIN_FLAVOR_CREATE      = 1,
364     MPI_WIN_FLAVOR_ALLOCATE    = 2,
365     MPI_WIN_FLAVOR_DYNAMIC     = 3,
366     MPI_WIN_FLAVOR_SHARED      = 4
367 } MPIR_Win_flavor_t;
368
369 /* MPI-3 window consistency models */
370 typedef enum MPIR_Win_model {
371     MPI_WIN_SEPARATE   = 1,
372     MPI_WIN_UNIFIED    = 2
373 } MPIR_Win_model_t;
374
375 /* Upper bound on the overhead in bsend for each message buffer */
376 #define MPI_BSEND_OVERHEAD @BSEND_OVERHEAD@
377
378 /* Topology types */
379 typedef enum MPIR_Topo_type { MPI_GRAPH=1, MPI_CART=2, MPI_DIST_GRAPH=3 } MPIR_Topo_type;
380
381 #define MPI_BOTTOM      (void *)0
382 extern int * const MPI_UNWEIGHTED;
383 extern int * const MPI_WEIGHTS_EMPTY;
384
385 #define MPI_PROC_NULL   (-1)
386 #define MPI_ANY_SOURCE  (-2)
387 #define MPI_ROOT        (-3)
388 #define MPI_ANY_TAG     (-1)
389
390 #define MPI_LOCK_EXCLUSIVE  234
391 #define MPI_LOCK_SHARED     235
392
393 /* C functions */
394 typedef void (MPI_Handler_function) ( MPI_Comm *, int *, ... );
395 typedef int (MPI_Comm_copy_attr_function)(MPI_Comm, int, void *, void *, 
396                                           void *, int *);
397 typedef int (MPI_Comm_delete_attr_function)(MPI_Comm, int, void *, void *);
398 typedef int (MPI_Type_copy_attr_function)(MPI_Datatype, int, void *, void *, 
399                                           void *, int *);
400 typedef int (MPI_Type_delete_attr_function)(MPI_Datatype, int, void *, void *);
401 typedef int (MPI_Win_copy_attr_function)(MPI_Win, int, void *, void *, void *,
402                                          int *);
403 typedef int (MPI_Win_delete_attr_function)(MPI_Win, int, void *, void *);
404 /* added in MPI-2.2 */
405 typedef void (MPI_Comm_errhandler_function)(MPI_Comm *, int *, ...);
406 typedef void (MPI_File_errhandler_function)(MPI_File *, int *, ...);
407 typedef void (MPI_Win_errhandler_function)(MPI_Win *, int *, ...);
408 /* names that were added in MPI-2.0 and deprecated in MPI-2.2 */
409 typedef MPI_Comm_errhandler_function MPI_Comm_errhandler_fn;
410 typedef MPI_File_errhandler_function MPI_File_errhandler_fn;
411 typedef MPI_Win_errhandler_function MPI_Win_errhandler_fn;
412
413 /* Built in (0x1 in 30-31), errhandler (0x5 in bits 26-29, allkind (0
414    in 22-25), index in the low bits */
415 #define MPI_ERRORS_ARE_FATAL ((MPI_Errhandler)0x54000000)
416 #define MPI_ERRORS_RETURN    ((MPI_Errhandler)0x54000001)
417 /* MPIR_ERRORS_THROW_EXCEPTIONS is not part of the MPI standard, it is here to
418    facilitate the c++ binding which has MPI::ERRORS_THROW_EXCEPTIONS. 
419    Using the MPIR prefix preserved the MPI_ names for objects defined by
420    the standard. */
421 #define MPIR_ERRORS_THROW_EXCEPTIONS ((MPI_Errhandler)0x54000002)
422 typedef int MPI_Errhandler;
423
424 /* Make the C names for the dup function mixed case.
425    This is required for systems that use all uppercase names for Fortran 
426    externals.  */
427 /* MPI 1 names */
428 #define MPI_NULL_COPY_FN   ((MPI_Copy_function *)0)
429 #define MPI_NULL_DELETE_FN ((MPI_Delete_function *)0)
430 #define MPI_DUP_FN         MPIR_Dup_fn
431 /* MPI 2 names */
432 #define MPI_COMM_NULL_COPY_FN ((MPI_Comm_copy_attr_function*)0)
433 #define MPI_COMM_NULL_DELETE_FN ((MPI_Comm_delete_attr_function*)0)
434 #define MPI_COMM_DUP_FN  ((MPI_Comm_copy_attr_function *)MPI_DUP_FN)
435 #define MPI_WIN_NULL_COPY_FN ((MPI_Win_copy_attr_function*)0)
436 #define MPI_WIN_NULL_DELETE_FN ((MPI_Win_delete_attr_function*)0)
437 #define MPI_WIN_DUP_FN   ((MPI_Win_copy_attr_function*)MPI_DUP_FN)
438 #define MPI_TYPE_NULL_COPY_FN ((MPI_Type_copy_attr_function*)0)
439 #define MPI_TYPE_NULL_DELETE_FN ((MPI_Type_delete_attr_function*)0)
440 #define MPI_TYPE_DUP_FN ((MPI_Type_copy_attr_function*)MPI_DUP_FN)
441
442 /* MPI request opjects */
443 typedef int MPI_Request;
444
445 /* MPI message objects for Mprobe and related functions */
446 typedef int MPI_Message;
447
448 /* User combination function */
449 typedef void (MPI_User_function) ( void *, void *, int *, MPI_Datatype * ); 
450
451 /* MPI Attribute copy and delete functions */
452 typedef int (MPI_Copy_function) ( MPI_Comm, int, void *, void *, void *, int * );
453 typedef int (MPI_Delete_function) ( MPI_Comm, int, void *, void * );
454
455 #define MPI_VERSION    3
456 #define MPI_SUBVERSION 0
457 #define MPICH_NAME     3
458 #define MPICH         1
459 #define MPICH_HAS_C2F  1
460
461
462 /* MPICH_VERSION is the version string. MPICH_NUMVERSION is the
463  * numeric version that can be used in numeric comparisons.
464  *
465  * MPICH_VERSION uses the following format:
466  * Version: [MAJ].[MIN].[REV][EXT][EXT_NUMBER]
467  * Example: 1.0.7rc1 has
468  *          MAJ = 1
469  *          MIN = 0
470  *          REV = 7
471  *          EXT = rc
472  *          EXT_NUMBER = 1
473  *
474  * MPICH_NUMVERSION will convert EXT to a format number:
475  *          ALPHA (a) = 0
476  *          BETA (b)  = 1
477  *          RC (rc)   = 2
478  *          PATCH (p) = 3
479  * Regular releases are treated as patch 0
480  *
481  * Numeric version will have 1 digit for MAJ, 2 digits for MIN, 2
482  * digits for REV, 1 digit for EXT and 2 digits for EXT_NUMBER. So,
483  * 1.0.7rc1 will have the numeric version 10007201.
484  */
485 #define MPICH_VERSION "@MPICH_VERSION@"
486 #define MPICH_NUMVERSION @MPICH_NUMVERSION@
487
488 #define MPICH_RELEASE_TYPE_ALPHA  0
489 #define MPICH_RELEASE_TYPE_BETA   1
490 #define MPICH_RELEASE_TYPE_RC     2
491 #define MPICH_RELEASE_TYPE_PATCH  3
492
493 #define MPICH_CALC_VERSION(MAJOR, MINOR, REVISION, TYPE, PATCH) \
494     (((MAJOR) * 10000000) + ((MINOR) * 100000) + ((REVISION) * 1000) + ((TYPE) * 100) + (PATCH))
495
496 /* for the datatype decoders */
497 enum MPIR_Combiner_enum {
498     MPI_COMBINER_NAMED            = 1,
499     MPI_COMBINER_DUP              = 2,
500     MPI_COMBINER_CONTIGUOUS       = 3, 
501     MPI_COMBINER_VECTOR           = 4,
502     MPI_COMBINER_HVECTOR_INTEGER  = 5,
503     MPI_COMBINER_HVECTOR          = 6,
504     MPI_COMBINER_INDEXED          = 7,
505     MPI_COMBINER_HINDEXED_INTEGER = 8, 
506     MPI_COMBINER_HINDEXED         = 9, 
507     MPI_COMBINER_INDEXED_BLOCK    = 10, 
508     MPI_COMBINER_STRUCT_INTEGER   = 11,
509     MPI_COMBINER_STRUCT           = 12,
510     MPI_COMBINER_SUBARRAY         = 13,
511     MPI_COMBINER_DARRAY           = 14,
512     MPI_COMBINER_F90_REAL         = 15,
513     MPI_COMBINER_F90_COMPLEX      = 16,
514     MPI_COMBINER_F90_INTEGER      = 17,
515     MPI_COMBINER_RESIZED          = 18,
516     MPI_COMBINER_HINDEXED_BLOCK   = 19
517 };
518
519 /* for info */
520 typedef int MPI_Info;
521 #define MPI_INFO_NULL         ((MPI_Info)0x1c000000)
522 #define MPI_INFO_ENV          ((MPI_Info)0x5c000001)
523 #define MPI_MAX_INFO_KEY       255
524 #define MPI_MAX_INFO_VAL      1024
525
526 /* for subarray and darray constructors */
527 #define MPI_ORDER_C              56
528 #define MPI_ORDER_FORTRAN        57
529 #define MPI_DISTRIBUTE_BLOCK    121
530 #define MPI_DISTRIBUTE_CYCLIC   122
531 #define MPI_DISTRIBUTE_NONE     123
532 #define MPI_DISTRIBUTE_DFLT_DARG -49767
533
534 #define MPI_IN_PLACE  (void *) -1
535
536 /* asserts for one-sided communication */
537 #define MPI_MODE_NOCHECK      1024
538 #define MPI_MODE_NOSTORE      2048
539 #define MPI_MODE_NOPUT        4096
540 #define MPI_MODE_NOPRECEDE    8192
541 #define MPI_MODE_NOSUCCEED   16384 
542
543 /* predefined types for MPI_Comm_split_type */
544 #define MPI_COMM_TYPE_SHARED    1
545
546 /* Definitions that are determined by configure. */
547 typedef @MPI_AINT@ MPI_Aint;
548 typedef @MPI_FINT@ MPI_Fint;
549 typedef @MPI_COUNT@ MPI_Count;
550
551 #ifdef MPICH_DEFINE_ATTR_TYPE_TYPES
552 static const MPI_Datatype mpich_mpi_aint   MPICH_ATTR_TYPE_TAG(MPI_Aint)   = MPI_AINT;
553 #endif
554
555 /* FIXME: The following two definition are not defined by MPI and must not be
556    included in the mpi.h file, as the MPI namespace is reserved to the MPI 
557    standard */
558 #define MPI_AINT_FMT_DEC_SPEC "@MPI_AINT_FMT_DEC_SPEC@"
559 #define MPI_AINT_FMT_HEX_SPEC "@MPI_AINT_FMT_HEX_SPEC@"
560
561 /* Let ROMIO know that MPI_Offset is already defined */
562 #define HAVE_MPI_OFFSET
563 /* MPI_OFFSET_TYPEDEF is set in configure and is 
564       typedef $MPI_OFFSET MPI_Offset;
565    where $MPI_OFFSET is the correct C type */
566 @MPI_OFFSET_TYPEDEF@
567
568 #ifdef MPICH_DEFINE_ATTR_TYPE_TYPES
569 static const MPI_Datatype mpich_mpi_offset MPICH_ATTR_TYPE_TAG(MPI_Offset) = MPI_OFFSET;
570 #endif
571
572 /* The order of these elements must match that in mpif.h, mpi_f08_types.f90,
573    and mpi_c_interface_types.f90 */
574 typedef struct MPI_Status {
575     int count_lo;
576     int count_hi_and_cancelled;
577     int MPI_SOURCE;
578     int MPI_TAG;
579     int MPI_ERROR;
580 } MPI_Status;
581
582 /* types for the MPI_T_ interface */
583 struct MPIR_T_enum_s;
584 struct MPIR_T_cvar_handle_s;
585 struct MPIR_T_pvar_handle_s;
586 struct MPIR_T_pvar_session_s;
587
588 typedef struct MPIR_T_enum_s * MPI_T_enum;
589 typedef struct MPIR_T_cvar_handle_s * MPI_T_cvar_handle;
590 typedef struct MPIR_T_pvar_handle_s * MPI_T_pvar_handle;
591 typedef struct MPIR_T_pvar_session_s * MPI_T_pvar_session;
592
593 /* extra const at front would be safer, but is incompatible with MPI_T_ prototypes */
594 extern struct MPIR_T_pvar_handle_s * const MPI_T_PVAR_ALL_HANDLES;
595
596 #define MPI_T_ENUM_NULL         ((MPI_T_enum)NULL)
597 #define MPI_T_CVAR_HANDLE_NULL  ((MPI_T_cvar_handle)NULL)
598 #define MPI_T_PVAR_HANDLE_NULL  ((MPI_T_pvar_handle)NULL)
599 #define MPI_T_PVAR_SESSION_NULL ((MPI_T_pvar_session)NULL)
600
601 /* the MPI_T_ interface requires that these VERBOSITY constants occur in this
602  * relative order with increasing values */
603 typedef enum MPIR_T_verbosity_t {
604     /* don't name-shift this if/when MPI_T_ is accepted, this is an MPICH-only
605      * extension */
606     MPIX_T_VERBOSITY_INVALID = 0,
607
608     /* arbitrarily shift values to aid debugging and reduce accidental errors */
609     MPI_T_VERBOSITY_USER_BASIC = 221,
610     MPI_T_VERBOSITY_USER_DETAIL,
611     MPI_T_VERBOSITY_USER_ALL,
612
613     MPI_T_VERBOSITY_TUNER_BASIC,
614     MPI_T_VERBOSITY_TUNER_DETAIL,
615     MPI_T_VERBOSITY_TUNER_ALL,
616
617     MPI_T_VERBOSITY_MPIDEV_BASIC,
618     MPI_T_VERBOSITY_MPIDEV_DETAIL,
619     MPI_T_VERBOSITY_MPIDEV_ALL
620 } MPIR_T_verbosity_t;
621
622 typedef enum MPIR_T_bind_t {
623     /* don't name-shift this if/when MPI_T_ is accepted, this is an MPICH-only
624      * extension */
625     MPIX_T_BIND_INVALID = 0,
626
627     /* arbitrarily shift values to aid debugging and reduce accidental errors */
628     MPI_T_BIND_NO_OBJECT = 9700,
629     MPI_T_BIND_MPI_COMM,
630     MPI_T_BIND_MPI_DATATYPE,
631     MPI_T_BIND_MPI_ERRHANDLER,
632     MPI_T_BIND_MPI_FILE,
633     MPI_T_BIND_MPI_GROUP,
634     MPI_T_BIND_MPI_OP,
635     MPI_T_BIND_MPI_REQUEST,
636     MPI_T_BIND_MPI_WIN,
637     MPI_T_BIND_MPI_MESSAGE,
638     MPI_T_BIND_MPI_INFO
639 } MPIR_T_bind_t;
640
641 typedef enum MPIR_T_scope_t {
642     /* don't name-shift this if/when MPI_T_ is accepted, this is an MPICH-only
643      * extension */
644     MPIX_T_SCOPE_INVALID = 0,
645
646     /* arbitrarily shift values to aid debugging and reduce accidental errors */
647     MPI_T_SCOPE_CONSTANT = 60438,
648     MPI_T_SCOPE_READONLY,
649     MPI_T_SCOPE_LOCAL,
650     MPI_T_SCOPE_GROUP,
651     MPI_T_SCOPE_GROUP_EQ,
652     MPI_T_SCOPE_ALL,
653     MPI_T_SCOPE_ALL_EQ
654 } MPIR_T_scope_t;
655
656 typedef enum MPIR_T_pvar_class_t {
657     /* don't name-shift this if/when MPI_T_ is accepted, this is an MPICH-only
658      * extension */
659     MPIX_T_PVAR_CLASS_INVALID = 0,
660
661     /* arbitrarily shift values to aid debugging and reduce accidental errors */
662     MPIR_T_PVAR_CLASS_FIRST = 240,
663     MPI_T_PVAR_CLASS_STATE = MPIR_T_PVAR_CLASS_FIRST,
664     MPI_T_PVAR_CLASS_LEVEL,
665     MPI_T_PVAR_CLASS_SIZE,
666     MPI_T_PVAR_CLASS_PERCENTAGE,
667     MPI_T_PVAR_CLASS_HIGHWATERMARK,
668     MPI_T_PVAR_CLASS_LOWWATERMARK,
669     MPI_T_PVAR_CLASS_COUNTER,
670     MPI_T_PVAR_CLASS_AGGREGATE,
671     MPI_T_PVAR_CLASS_TIMER,
672     MPI_T_PVAR_CLASS_GENERIC,
673     MPIR_T_PVAR_CLASS_LAST,
674     MPIR_T_PVAR_CLASS_NUMBER = MPIR_T_PVAR_CLASS_LAST - MPIR_T_PVAR_CLASS_FIRST
675 } MPIR_T_pvar_class_t;
676
677 /* Handle conversion types/functions */
678
679 /* Programs that need to convert types used in MPICH should use these */
680 #define MPI_Comm_c2f(comm) (MPI_Fint)(comm)
681 #define MPI_Comm_f2c(comm) (MPI_Comm)(comm)
682 #define MPI_Type_c2f(datatype) (MPI_Fint)(datatype)
683 #define MPI_Type_f2c(datatype) (MPI_Datatype)(datatype)
684 #define MPI_Group_c2f(group) (MPI_Fint)(group)
685 #define MPI_Group_f2c(group) (MPI_Group)(group)
686 #define MPI_Info_c2f(info) (MPI_Fint)(info)
687 #define MPI_Info_f2c(info) (MPI_Info)(info)
688 #define MPI_Request_f2c(request) (MPI_Request)(request)
689 #define MPI_Request_c2f(request) (MPI_Fint)(request)
690 #define MPI_Op_c2f(op) (MPI_Fint)(op)
691 #define MPI_Op_f2c(op) (MPI_Op)(op)
692 #define MPI_Errhandler_c2f(errhandler) (MPI_Fint)(errhandler)
693 #define MPI_Errhandler_f2c(errhandler) (MPI_Errhandler)(errhandler)
694 #define MPI_Win_c2f(win)   (MPI_Fint)(win)
695 #define MPI_Win_f2c(win)   (MPI_Win)(win)
696 #define MPI_Message_c2f(msg) ((MPI_Fint)(msg))
697 #define MPI_Message_f2c(msg) ((MPI_Message)(msg))
698
699 /* PMPI versions of the handle transfer functions.  See section 4.17 */
700 #define PMPI_Comm_c2f(comm) (MPI_Fint)(comm)
701 #define PMPI_Comm_f2c(comm) (MPI_Comm)(comm)
702 #define PMPI_Type_c2f(datatype) (MPI_Fint)(datatype)
703 #define PMPI_Type_f2c(datatype) (MPI_Datatype)(datatype)
704 #define PMPI_Group_c2f(group) (MPI_Fint)(group)
705 #define PMPI_Group_f2c(group) (MPI_Group)(group)
706 #define PMPI_Info_c2f(info) (MPI_Fint)(info)
707 #define PMPI_Info_f2c(info) (MPI_Info)(info)
708 #define PMPI_Request_f2c(request) (MPI_Request)(request)
709 #define PMPI_Request_c2f(request) (MPI_Fint)(request)
710 #define PMPI_Op_c2f(op) (MPI_Fint)(op)
711 #define PMPI_Op_f2c(op) (MPI_Op)(op)
712 #define PMPI_Errhandler_c2f(errhandler) (MPI_Fint)(errhandler)
713 #define PMPI_Errhandler_f2c(errhandler) (MPI_Errhandler)(errhandler)
714 #define PMPI_Win_c2f(win)   (MPI_Fint)(win)
715 #define PMPI_Win_f2c(win)   (MPI_Win)(win)
716 #define PMPI_Message_c2f(msg) ((MPI_Fint)(msg))
717 #define PMPI_Message_f2c(msg) ((MPI_Message)(msg))
718
719 #define MPI_STATUS_IGNORE (MPI_Status *)1
720 #define MPI_STATUSES_IGNORE (MPI_Status *)1
721 #define MPI_ERRCODES_IGNORE (int *)0
722
723 /* See 4.12.5 for MPI_F_STATUS(ES)_IGNORE */
724 @MPIU_DLL_SPEC_DEF@
725 extern MPIU_DLL_SPEC MPI_Fint * MPI_F_STATUS_IGNORE;
726 extern MPIU_DLL_SPEC MPI_Fint * MPI_F_STATUSES_IGNORE;
727 /* The annotation MPIU_DLL_SPEC to the extern statements is used 
728    as a hook for systems that require C extensions to correctly construct
729    DLLs, and is defined as an empty string otherwise
730  */
731
732 /* The MPI standard requires that the ARGV_NULL values be the same as
733    NULL (see 5.3.2) */
734 #define MPI_ARGV_NULL (char **)0
735 #define MPI_ARGVS_NULL (char ***)0
736
737 /* C type for MPI_STATUS in F08.
738    The field order should match that in mpi_f08_types.f90, and mpi_c_interface_types.f90.
739  */
740 typedef struct {
741     MPI_Fint count_lo;
742     MPI_Fint count_hi_and_cancelled;
743     MPI_Fint MPI_SOURCE;
744     MPI_Fint MPI_TAG;
745     MPI_Fint MPI_ERROR;
746 } MPI_F08_Status;
747
748 extern MPI_F08_Status MPIR_F08_MPI_STATUS_IGNORE_OBJ;
749 extern MPI_F08_Status MPIR_F08_MPI_STATUSES_IGNORE_OBJ[1];
750 extern int MPIR_F08_MPI_IN_PLACE;
751 extern int MPIR_F08_MPI_BOTTOM;
752
753 /* Pointers to above objects */
754 extern MPI_F08_Status *MPI_F08_STATUS_IGNORE;
755 extern MPI_F08_Status *MPI_F08_STATUSES_IGNORE;
756
757 /* For supported thread levels */
758 #define MPI_THREAD_SINGLE 0
759 #define MPI_THREAD_FUNNELED 1
760 #define MPI_THREAD_SERIALIZED 2
761 #define MPI_THREAD_MULTIPLE 3
762
763 /* Typedefs for generalized requests */
764 typedef int (MPI_Grequest_cancel_function)(void *, int); 
765 typedef int (MPI_Grequest_free_function)(void *); 
766 typedef int (MPI_Grequest_query_function)(void *, MPI_Status *); 
767 typedef int (MPIX_Grequest_poll_function)(void *, MPI_Status *);
768 typedef int (MPIX_Grequest_wait_function)(int, void **, double, MPI_Status *);
769
770 /* MPI's error classes */
771 #define MPI_SUCCESS          0      /* Successful return code */
772 /* Communication argument parameters */
773 #define MPI_ERR_BUFFER       1      /* Invalid buffer pointer */
774 #define MPI_ERR_COUNT        2      /* Invalid count argument */
775 #define MPI_ERR_TYPE         3      /* Invalid datatype argument */
776 #define MPI_ERR_TAG          4      /* Invalid tag argument */
777 #define MPI_ERR_COMM         5      /* Invalid communicator */
778 #define MPI_ERR_RANK         6      /* Invalid rank */
779 #define MPI_ERR_ROOT         7      /* Invalid root */
780 #define MPI_ERR_TRUNCATE    14      /* Message truncated on receive */
781
782 /* MPI Objects (other than COMM) */
783 #define MPI_ERR_GROUP        8      /* Invalid group */
784 #define MPI_ERR_OP           9      /* Invalid operation */
785 #define MPI_ERR_REQUEST     19      /* Invalid mpi_request handle */
786
787 /* Special topology argument parameters */
788 #define MPI_ERR_TOPOLOGY    10      /* Invalid topology */
789 #define MPI_ERR_DIMS        11      /* Invalid dimension argument */
790
791 /* All other arguments.  This is a class with many kinds */
792 #define MPI_ERR_ARG         12      /* Invalid argument */
793
794 /* Other errors that are not simply an invalid argument */
795 #define MPI_ERR_OTHER       15      /* Other error; use Error_string */
796
797 #define MPI_ERR_UNKNOWN     13      /* Unknown error */
798 #define MPI_ERR_INTERN      16      /* Internal error code    */
799
800 /* Multiple completion has three special error classes */
801 #define MPI_ERR_IN_STATUS           17      /* Look in status for error value */
802 #define MPI_ERR_PENDING             18      /* Pending request */
803
804 /* New MPI-2 Error classes */
805 #define MPI_ERR_ACCESS      20      /* */
806 #define MPI_ERR_AMODE       21      /* */
807 #define MPI_ERR_BAD_FILE    22      /* */
808 #define MPI_ERR_CONVERSION  23      /* */
809 #define MPI_ERR_DUP_DATAREP 24      /* */
810 #define MPI_ERR_FILE_EXISTS 25      /* */
811 #define MPI_ERR_FILE_IN_USE 26      /* */
812 #define MPI_ERR_FILE        27      /* */
813 #define MPI_ERR_IO          32      /* */
814 #define MPI_ERR_NO_SPACE    36      /* */
815 #define MPI_ERR_NO_SUCH_FILE 37     /* */
816 #define MPI_ERR_READ_ONLY   40      /* */
817 #define MPI_ERR_UNSUPPORTED_DATAREP   43  /* */
818
819 /* MPI_ERR_INFO is NOT defined in the MPI-2 standard.  I believe that
820    this is an oversight */
821 #define MPI_ERR_INFO        28      /* */
822 #define MPI_ERR_INFO_KEY    29      /* */
823 #define MPI_ERR_INFO_VALUE  30      /* */
824 #define MPI_ERR_INFO_NOKEY  31      /* */
825
826 #define MPI_ERR_NAME        33      /* */
827 #define MPI_ERR_NO_MEM      34      /* Alloc_mem could not allocate memory */
828 #define MPI_ERR_NOT_SAME    35      /* */
829 #define MPI_ERR_PORT        38      /* */
830 #define MPI_ERR_QUOTA       39      /* */
831 #define MPI_ERR_SERVICE     41      /* */
832 #define MPI_ERR_SPAWN       42      /* */
833 #define MPI_ERR_UNSUPPORTED_OPERATION 44 /* */
834 #define MPI_ERR_WIN         45      /* */
835
836 #define MPI_ERR_BASE        46      /* */
837 #define MPI_ERR_LOCKTYPE    47      /* */
838 #define MPI_ERR_KEYVAL      48      /* Erroneous attribute key */
839 #define MPI_ERR_RMA_CONFLICT 49     /* */
840 #define MPI_ERR_RMA_SYNC    50      /* */ 
841 #define MPI_ERR_SIZE        51      /* */
842 #define MPI_ERR_DISP        52      /* */
843 #define MPI_ERR_ASSERT      53      /* */
844
845 #define MPI_ERR_RMA_RANGE  55       /* */
846 #define MPI_ERR_RMA_ATTACH 56       /* */
847 #define MPI_ERR_RMA_SHARED 57       /* */
848 #define MPI_ERR_RMA_FLAVOR 58       /* */
849
850 /* Return codes for functions in the MPI Tool Information Interface */
851 #define MPI_T_ERR_MEMORY            59  /* Out of memory */
852 #define MPI_T_ERR_NOT_INITIALIZED   60  /* Interface not initialized */
853 #define MPI_T_ERR_CANNOT_INIT       61  /* Interface not in the state to
854                                            be initialized */
855 #define MPI_T_ERR_INVALID_INDEX     62  /* The index is invalid or
856                                            has been deleted  */
857 #define MPI_T_ERR_INVALID_ITEM      63  /* Item index queried is out of range */
858 #define MPI_T_ERR_INVALID_HANDLE    64  /* The handle is invalid */
859 #define MPI_T_ERR_OUT_OF_HANDLES    65  /* No more handles available */
860 #define MPI_T_ERR_OUT_OF_SESSIONS   66  /* No more sessions available */
861 #define MPI_T_ERR_INVALID_SESSION   67  /* Session argument is not valid */
862 #define MPI_T_ERR_CVAR_SET_NOT_NOW  68  /* Cvar can't be set at this moment */
863 #define MPI_T_ERR_CVAR_SET_NEVER    69  /* Cvar can't be set until
864                                            end of execution */
865 #define MPI_T_ERR_PVAR_NO_STARTSTOP 70  /* Pvar can't be started or stopped */
866 #define MPI_T_ERR_PVAR_NO_WRITE     71  /* Pvar can't be written or reset */
867 #define MPI_T_ERR_PVAR_NO_ATOMIC    72  /* Pvar can't be R/W atomically */
868
869
870 #define MPI_ERR_LASTCODE    0x3fffffff  /* Last valid error code for a 
871                                            predefined error class */
872 /* WARNING: this is also defined in mpishared.h.  Update both locations */
873 #define MPICH_ERR_LAST_CLASS 72     /* It is also helpful to know the
874                                        last valid class */
875
876 #define MPICH_ERR_FIRST_MPIX 100 /* Define a gap here because sock is
877                                   * already using some of the values in this
878                                   * range. All MPIX error codes will be
879                                   * above this value to be ABI complaint. */
880
881 #define MPIX_ERR_PROC_FAILED          MPICH_ERR_FIRST_MPIX+1 /* Process failure */
882 #define MPIX_ERR_PROC_FAILED_PENDING  MPICH_ERR_FIRST_MPIX+2 /* A failure has caused this request
883                                                               * to be pending */
884 #define MPIX_ERR_REVOKED              MPICH_ERR_FIRST_MPIX+3 /* The communciation object has been revoked */
885
886 #define MPICH_ERR_LAST_MPIX           MPICH_ERR_FIRST_MPIX+3
887
888
889 /* End of MPI's error classes */
890
891 /* Function type defs */
892 typedef int (MPI_Datarep_conversion_function)(void *, MPI_Datatype, int, 
893              void *, MPI_Offset, void *);
894 typedef int (MPI_Datarep_extent_function)(MPI_Datatype datatype, MPI_Aint *,
895                       void *);
896 #define MPI_CONVERSION_FN_NULL ((MPI_Datarep_conversion_function *)0)
897
898 /* 
899    For systems that may need to add additional definitions to support
900    different declaration styles and options (e.g., different calling 
901    conventions or DLL import/export controls).  
902 */
903 /* --Insert Additional Definitions Here-- */
904
905 /*
906  * Normally, we provide prototypes for all MPI routines.  In a few weird
907  * cases, we need to suppress the prototypes.
908  */
909 #ifndef MPICH_SUPPRESS_PROTOTYPES
910 /* We require that the C compiler support prototypes */
911 /* Begin Prototypes */
912 int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
913              MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
914 int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag,
915              MPI_Comm comm, MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
916 int MPI_Get_count(const MPI_Status *status, MPI_Datatype datatype, int *count);
917 int MPI_Bsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
918               MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
919 int MPI_Ssend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
920               MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
921 int MPI_Rsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
922               MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
923 int MPI_Buffer_attach(void *buffer, int size);
924 int MPI_Buffer_detach(void *buffer_addr, int *size);
925 int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
926               MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
927 int MPI_Ibsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
928                MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
929 int MPI_Issend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
930                MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
931 int MPI_Irsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
932                MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
933 int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag,
934               MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
935 int MPI_Wait(MPI_Request *request, MPI_Status *status);
936 int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status);
937 int MPI_Request_free(MPI_Request *request);
938 int MPI_Waitany(int count, MPI_Request array_of_requests[], int *indx, MPI_Status *status);
939 int MPI_Testany(int count, MPI_Request array_of_requests[], int *indx, int *flag,
940                 MPI_Status *status);
941 int MPI_Waitall(int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[]);
942 int MPI_Testall(int count, MPI_Request array_of_requests[], int *flag,
943                 MPI_Status array_of_statuses[]);
944 int MPI_Waitsome(int incount, MPI_Request array_of_requests[], int *outcount,
945                  int array_of_indices[], MPI_Status array_of_statuses[]);
946 int MPI_Testsome(int incount, MPI_Request array_of_requests[], int *outcount,
947                  int array_of_indices[], MPI_Status array_of_statuses[]);
948 int MPI_Iprobe(int source, int tag, MPI_Comm comm, int *flag, MPI_Status *status);
949 int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *status);
950 int MPI_Cancel(MPI_Request *request);
951 int MPI_Test_cancelled(const MPI_Status *status, int *flag);
952 int MPI_Send_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
953                   MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
954 int MPI_Bsend_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
955                    MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
956 int MPI_Ssend_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
957                    MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
958 int MPI_Rsend_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
959                    MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
960 int MPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int source, int tag,
961                   MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
962 int MPI_Start(MPI_Request *request);
963 int MPI_Startall(int count, MPI_Request array_of_requests[]);
964 int MPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest,
965                  int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype,
966                  int source, int recvtag, MPI_Comm comm, MPI_Status *status)
967                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(6,8);
968 int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, int dest,
969                          int sendtag, int source, int recvtag, MPI_Comm comm,
970                          MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
971 int MPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype *newtype);
972 int MPI_Type_vector(int count, int blocklength, int stride, MPI_Datatype oldtype,
973                     MPI_Datatype *newtype);
974 int MPI_Type_hvector(int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype,
975                      MPI_Datatype *newtype);
976 int MPI_Type_indexed(int count, const int *array_of_blocklengths,
977                      const int *array_of_displacements, MPI_Datatype oldtype,
978                      MPI_Datatype *newtype);
979 int MPI_Type_hindexed(int count, const int *array_of_blocklengths,
980                       const MPI_Aint *array_of_displacements, MPI_Datatype oldtype,
981                       MPI_Datatype *newtype);
982 int MPI_Type_struct(int count, const int *array_of_blocklengths,
983                     const MPI_Aint *array_of_displacements,
984                     const MPI_Datatype *array_of_types, MPI_Datatype *newtype);
985 int MPI_Address(const void *location, MPI_Aint *address);
986 int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint *extent);
987 int MPI_Type_size(MPI_Datatype datatype, int *size);
988 int MPI_Type_lb(MPI_Datatype datatype, MPI_Aint *displacement);
989 int MPI_Type_ub(MPI_Datatype datatype, MPI_Aint *displacement);
990 int MPI_Type_commit(MPI_Datatype *datatype);
991 int MPI_Type_free(MPI_Datatype *datatype);
992 int MPI_Get_elements(const MPI_Status *status, MPI_Datatype datatype, int *count);
993 int MPI_Pack(const void *inbuf, int incount, MPI_Datatype datatype, void *outbuf,
994              int outsize, int *position, MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
995 int MPI_Unpack(const void *inbuf, int insize, int *position, void *outbuf, int outcount,
996                MPI_Datatype datatype, MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
997 int MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *size);
998 int MPI_Barrier(MPI_Comm comm);
999 int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
1000               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1001 int MPI_Gather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1002                int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
1003                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1004 int MPI_Gatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1005                 const int *recvcounts, const int *displs, MPI_Datatype recvtype, int root,
1006                 MPI_Comm comm)
1007                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1008 int MPI_Scatter(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1009                 int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
1010                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1011 int MPI_Scatterv(const void *sendbuf, const int *sendcounts, const int *displs,
1012                  MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype,
1013                  int root, MPI_Comm comm)
1014                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,7);
1015 int MPI_Allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1016                   int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
1017                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1018 int MPI_Allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1019                    const int *recvcounts, const int *displs, MPI_Datatype recvtype, MPI_Comm comm)
1020                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1021 int MPI_Alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1022                  int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
1023                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1024 int MPI_Alltoallv(const void *sendbuf, const int *sendcounts, const int *sdispls,
1025                   MPI_Datatype sendtype, void *recvbuf, const int *recvcounts,
1026                   const int *rdispls, MPI_Datatype recvtype, MPI_Comm comm)
1027                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
1028 int MPI_Alltoallw(const void *sendbuf, const int sendcounts[], const int sdispls[],
1029                   const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[],
1030                   const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm);
1031 int MPI_Exscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1032                MPI_Op op, MPI_Comm comm)
1033                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1034 int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1035                MPI_Op op, int root, MPI_Comm comm)
1036                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1037 int MPI_Op_create(MPI_User_function *user_fn, int commute, MPI_Op *op);
1038 int MPI_Op_free(MPI_Op *op);
1039 int MPI_Allreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1040                   MPI_Op op, MPI_Comm comm)
1041                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1042 int MPI_Reduce_scatter(const void *sendbuf, void *recvbuf, const int recvcounts[],
1043                        MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
1044                        MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1045 int MPI_Scan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op,
1046              MPI_Comm comm)
1047              MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1048 int MPI_Group_size(MPI_Group group, int *size);
1049 int MPI_Group_rank(MPI_Group group, int *rank);
1050 int MPI_Group_translate_ranks(MPI_Group group1, int n, const int ranks1[], MPI_Group group2,
1051                               int ranks2[]);
1052 int MPI_Group_compare(MPI_Group group1, MPI_Group group2, int *result);
1053 int MPI_Comm_group(MPI_Comm comm, MPI_Group *group);
1054 int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
1055 int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
1056 int MPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
1057 int MPI_Group_incl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup);
1058 int MPI_Group_excl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup);
1059 int MPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup);
1060 int MPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup);
1061 int MPI_Group_free(MPI_Group *group);
1062 int MPI_Comm_size(MPI_Comm comm, int *size);
1063 int MPI_Comm_rank(MPI_Comm comm, int *rank);
1064 int MPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int *result);
1065 int MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm);
1066 int MPI_Comm_dup_with_info(MPI_Comm comm, MPI_Info info, MPI_Comm *newcomm);
1067 int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm);
1068 int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm);
1069 int MPI_Comm_free(MPI_Comm *comm);
1070 int MPI_Comm_test_inter(MPI_Comm comm, int *flag);
1071 int MPI_Comm_remote_size(MPI_Comm comm, int *size);
1072 int MPI_Comm_remote_group(MPI_Comm comm, MPI_Group *group);
1073 int MPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm,
1074                          int remote_leader, int tag, MPI_Comm *newintercomm);
1075 int MPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm);
1076 int MPI_Keyval_create(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn,
1077                       int *keyval, void *extra_state);
1078 int MPI_Keyval_free(int *keyval);
1079 int MPI_Attr_put(MPI_Comm comm, int keyval, void *attribute_val);
1080 int MPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag);
1081 int MPI_Attr_delete(MPI_Comm comm, int keyval);
1082 int MPI_Topo_test(MPI_Comm comm, int *status);
1083 int MPI_Cart_create(MPI_Comm comm_old, int ndims, const int dims[], const int periods[],
1084                     int reorder, MPI_Comm *comm_cart);
1085 int MPI_Dims_create(int nnodes, int ndims, int dims[]);
1086 int MPI_Graph_create(MPI_Comm comm_old, int nnodes, const int indx[], const int edges[],
1087                      int reorder, MPI_Comm *comm_graph);
1088 int MPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges);
1089 int MPI_Graph_get(MPI_Comm comm, int maxindex, int maxedges, int indx[], int edges[]);
1090 int MPI_Cartdim_get(MPI_Comm comm, int *ndims);
1091 int MPI_Cart_get(MPI_Comm comm, int maxdims, int dims[], int periods[], int coords[]);
1092 int MPI_Cart_rank(MPI_Comm comm, const int coords[], int *rank);
1093 int MPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int coords[]);
1094 int MPI_Graph_neighbors_count(MPI_Comm comm, int rank, int *nneighbors);
1095 int MPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int neighbors[]);
1096 int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest);
1097 int MPI_Cart_sub(MPI_Comm comm, const int remain_dims[], MPI_Comm *newcomm);
1098 int MPI_Cart_map(MPI_Comm comm, int ndims, const int dims[], const int periods[], int *newrank);
1099 int MPI_Graph_map(MPI_Comm comm, int nnodes, const int indx[], const int edges[], int *newrank);
1100 int MPI_Get_processor_name(char *name, int *resultlen);
1101 int MPI_Get_version(int *version, int *subversion);
1102 int MPI_Get_library_version(char *version, int *resultlen);
1103 int MPI_Errhandler_create(MPI_Handler_function *function, MPI_Errhandler *errhandler);
1104 int MPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler);
1105 int MPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler);
1106 int MPI_Errhandler_free(MPI_Errhandler *errhandler);
1107 int MPI_Error_string(int errorcode, char *string, int *resultlen);
1108 int MPI_Error_class(int errorcode, int *errorclass);
1109 double MPI_Wtime(void);
1110 double MPI_Wtick(void);
1111 int MPI_Init(int *argc, char ***argv);
1112 int MPI_Finalize(void);
1113 int MPI_Initialized(int *flag);
1114 int MPI_Abort(MPI_Comm comm, int errorcode);
1115
1116 /* Note that we may need to define a @PCONTROL_LIST@ depending on whether
1117    stdargs are supported */
1118 int MPI_Pcontrol(const int level, ...);
1119 int MPI_DUP_FN(MPI_Comm oldcomm, int keyval, void *extra_state, void *attribute_val_in,
1120                void *attribute_val_out, int *flag);
1121
1122 /* Process Creation and Management */
1123 int MPI_Close_port(const char *port_name);
1124 int MPI_Comm_accept(const char *port_name, MPI_Info info, int root, MPI_Comm comm,
1125                     MPI_Comm *newcomm);
1126 int MPI_Comm_connect(const char *port_name, MPI_Info info, int root, MPI_Comm comm,
1127                      MPI_Comm *newcomm);
1128 int MPI_Comm_disconnect(MPI_Comm *comm);
1129 int MPI_Comm_get_parent(MPI_Comm *parent);
1130 int MPI_Comm_join(int fd, MPI_Comm *intercomm);
1131 int MPI_Comm_spawn(const char *command, char *argv[], int maxprocs, MPI_Info info, int root,
1132                    MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]);
1133 int MPI_Comm_spawn_multiple(int count, char *array_of_commands[], char **array_of_argv[],
1134                             const int array_of_maxprocs[], const MPI_Info array_of_info[],
1135                             int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]);
1136 int MPI_Lookup_name(const char *service_name, MPI_Info info, char *port_name);
1137 int MPI_Open_port(MPI_Info info, char *port_name);
1138 int MPI_Publish_name(const char *service_name, MPI_Info info, const char *port_name);
1139 int MPI_Unpublish_name(const char *service_name, MPI_Info info, const char *port_name);
1140 int MPI_Comm_set_info(MPI_Comm comm, MPI_Info info);
1141 int MPI_Comm_get_info(MPI_Comm comm, MPI_Info *info);
1142
1143 /* One-Sided Communications */
1144 int MPI_Accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
1145                    int target_rank, MPI_Aint target_disp, int target_count,
1146                    MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
1147                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1148 int MPI_Get(void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
1149             int target_rank, MPI_Aint target_disp, int target_count,
1150             MPI_Datatype target_datatype, MPI_Win win) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1151 int MPI_Put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
1152             int target_rank, MPI_Aint target_disp, int target_count,
1153             MPI_Datatype target_datatype, MPI_Win win) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1154 int MPI_Win_complete(MPI_Win win);
1155 int MPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm,
1156                    MPI_Win *win);
1157 int MPI_Win_fence(int assert, MPI_Win win);
1158 int MPI_Win_free(MPI_Win *win);
1159 int MPI_Win_get_group(MPI_Win win, MPI_Group *group);
1160 int MPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win);
1161 int MPI_Win_post(MPI_Group group, int assert, MPI_Win win);
1162 int MPI_Win_start(MPI_Group group, int assert, MPI_Win win);
1163 int MPI_Win_test(MPI_Win win, int *flag);
1164 int MPI_Win_unlock(int rank, MPI_Win win);
1165 int MPI_Win_wait(MPI_Win win);
1166
1167 /* MPI-3 One-Sided Communication Routines */
1168 int MPI_Win_allocate(MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, void *baseptr,
1169                      MPI_Win *win);
1170 int MPI_Win_allocate_shared(MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm,
1171                             void *baseptr, MPI_Win *win);
1172 int MPI_Win_shared_query(MPI_Win win, int rank, MPI_Aint *size, int *disp_unit, void *baseptr);
1173 int MPI_Win_create_dynamic(MPI_Info info, MPI_Comm comm, MPI_Win *win);
1174 int MPI_Win_attach(MPI_Win win, void *base, MPI_Aint size);
1175 int MPI_Win_detach(MPI_Win win, const void *base);
1176 int MPI_Win_get_info(MPI_Win win, MPI_Info *info_used);
1177 int MPI_Win_set_info(MPI_Win win, MPI_Info info);
1178 int MPI_Get_accumulate(const void *origin_addr, int origin_count,
1179                         MPI_Datatype origin_datatype, void *result_addr, int result_count,
1180                         MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
1181                         int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
1182                         MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1183                         MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1184 int MPI_Fetch_and_op(const void *origin_addr, void *result_addr,
1185                       MPI_Datatype datatype, int target_rank, MPI_Aint target_disp,
1186                       MPI_Op op, MPI_Win win)
1187                       MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1188 int MPI_Compare_and_swap(const void *origin_addr, const void *compare_addr,
1189                           void *result_addr, MPI_Datatype datatype, int target_rank,
1190                           MPI_Aint target_disp, MPI_Win win)
1191                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
1192                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4)
1193                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,4);
1194 int MPI_Rput(const void *origin_addr, int origin_count,
1195               MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp,
1196               int target_count, MPI_Datatype target_datatype, MPI_Win win,
1197               MPI_Request *request)
1198               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1199 int MPI_Rget(void *origin_addr, int origin_count,
1200               MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp,
1201               int target_count, MPI_Datatype target_datatype, MPI_Win win,
1202               MPI_Request *request)
1203               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1204 int MPI_Raccumulate(const void *origin_addr, int origin_count,
1205                      MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp,
1206                      int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win,
1207                      MPI_Request *request)
1208                      MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1209 int MPI_Rget_accumulate(const void *origin_addr, int origin_count,
1210                          MPI_Datatype origin_datatype, void *result_addr, int result_count,
1211                          MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
1212                          int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win,
1213                          MPI_Request *request)
1214                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1215                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1216 int MPI_Win_lock_all(int assert, MPI_Win win);
1217 int MPI_Win_unlock_all(MPI_Win win);
1218 int MPI_Win_flush(int rank, MPI_Win win);
1219 int MPI_Win_flush_all(MPI_Win win);
1220 int MPI_Win_flush_local(int rank, MPI_Win win);
1221 int MPI_Win_flush_local_all(MPI_Win win);
1222 int MPI_Win_sync(MPI_Win win);
1223  
1224 /* External Interfaces */
1225 int MPI_Add_error_class(int *errorclass);
1226 int MPI_Add_error_code(int errorclass, int *errorcode);
1227 int MPI_Add_error_string(int errorcode, const char *string);
1228 int MPI_Comm_call_errhandler(MPI_Comm comm, int errorcode);
1229 int MPI_Comm_create_keyval(MPI_Comm_copy_attr_function *comm_copy_attr_fn,
1230                            MPI_Comm_delete_attr_function *comm_delete_attr_fn, int *comm_keyval,
1231                            void *extra_state);
1232 int MPI_Comm_delete_attr(MPI_Comm comm, int comm_keyval);
1233 int MPI_Comm_free_keyval(int *comm_keyval);
1234 int MPI_Comm_get_attr(MPI_Comm comm, int comm_keyval, void *attribute_val, int *flag);
1235 int MPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen);
1236 int MPI_Comm_set_attr(MPI_Comm comm, int comm_keyval, void *attribute_val);
1237 int MPI_Comm_set_name(MPI_Comm comm, const char *comm_name);
1238 int MPI_File_call_errhandler(MPI_File fh, int errorcode);
1239 int MPI_Grequest_complete(MPI_Request request);
1240 int MPI_Grequest_start(MPI_Grequest_query_function *query_fn, MPI_Grequest_free_function *free_fn,
1241                        MPI_Grequest_cancel_function *cancel_fn, void *extra_state,
1242                        MPI_Request *request);
1243 int MPI_Init_thread(int *argc, char ***argv, int required, int *provided);
1244 int MPI_Is_thread_main(int *flag);
1245 int MPI_Query_thread(int *provided);
1246 int MPI_Status_set_cancelled(MPI_Status *status, int flag);
1247 int MPI_Status_set_elements(MPI_Status *status, MPI_Datatype datatype, int count);
1248 int MPI_Type_create_keyval(MPI_Type_copy_attr_function *type_copy_attr_fn,
1249                            MPI_Type_delete_attr_function *type_delete_attr_fn,
1250                            int *type_keyval, void *extra_state);
1251 int MPI_Type_delete_attr(MPI_Datatype datatype, int type_keyval);
1252 int MPI_Type_dup(MPI_Datatype oldtype, MPI_Datatype *newtype);
1253 int MPI_Type_free_keyval(int *type_keyval);
1254 int MPI_Type_get_attr(MPI_Datatype datatype, int type_keyval, void *attribute_val, int *flag);
1255 int MPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses,
1256                           int max_datatypes, int array_of_integers[],
1257                           MPI_Aint array_of_addresses[], MPI_Datatype array_of_datatypes[]);
1258 int MPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses,
1259                           int *num_datatypes, int *combiner);
1260 int MPI_Type_get_name(MPI_Datatype datatype, char *type_name, int *resultlen);
1261 int MPI_Type_set_attr(MPI_Datatype datatype, int type_keyval, void *attribute_val);
1262 int MPI_Type_set_name(MPI_Datatype datatype, const char *type_name);
1263 int MPI_Type_match_size(int typeclass, int size, MPI_Datatype *datatype);
1264 int MPI_Win_call_errhandler(MPI_Win win, int errorcode);
1265 int MPI_Win_create_keyval(MPI_Win_copy_attr_function *win_copy_attr_fn,
1266                           MPI_Win_delete_attr_function *win_delete_attr_fn, int *win_keyval,
1267                           void *extra_state);
1268 int MPI_Win_delete_attr(MPI_Win win, int win_keyval);
1269 int MPI_Win_free_keyval(int *win_keyval);
1270 int MPI_Win_get_attr(MPI_Win win, int win_keyval, void *attribute_val, int *flag);
1271 int MPI_Win_get_name(MPI_Win win, char *win_name, int *resultlen);
1272 int MPI_Win_set_attr(MPI_Win win, int win_keyval, void *attribute_val);
1273 int MPI_Win_set_name(MPI_Win win, const char *win_name);
1274
1275 int MPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr);
1276 int MPI_Comm_create_errhandler(MPI_Comm_errhandler_function *comm_errhandler_fn,
1277                                MPI_Errhandler *errhandler);
1278 int MPI_Comm_get_errhandler(MPI_Comm comm, MPI_Errhandler *errhandler);
1279 int MPI_Comm_set_errhandler(MPI_Comm comm, MPI_Errhandler errhandler);
1280 int MPI_File_create_errhandler(MPI_File_errhandler_function *file_errhandler_fn,
1281                                MPI_Errhandler *errhandler);
1282 int MPI_File_get_errhandler(MPI_File file, MPI_Errhandler *errhandler);
1283 int MPI_File_set_errhandler(MPI_File file, MPI_Errhandler errhandler);
1284 int MPI_Finalized(int *flag);
1285 int MPI_Free_mem(void *base);
1286 int MPI_Get_address(const void *location, MPI_Aint *address);
1287 int MPI_Info_create(MPI_Info *info);
1288 int MPI_Info_delete(MPI_Info info, const char *key);
1289 int MPI_Info_dup(MPI_Info info, MPI_Info *newinfo);
1290 int MPI_Info_free(MPI_Info *info);
1291 int MPI_Info_get(MPI_Info info, const char *key, int valuelen, char *value, int *flag);
1292 int MPI_Info_get_nkeys(MPI_Info info, int *nkeys);
1293 int MPI_Info_get_nthkey(MPI_Info info, int n, char *key);
1294 int MPI_Info_get_valuelen(MPI_Info info, const char *key, int *valuelen, int *flag);
1295 int MPI_Info_set(MPI_Info info, const char *key, const char *value);
1296 int MPI_Pack_external(const char datarep[], const void *inbuf, int incount,
1297                       MPI_Datatype datatype, void *outbuf, MPI_Aint outsize, MPI_Aint *position)
1298                       MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1299 int MPI_Pack_external_size(const char datarep[], int incount, MPI_Datatype datatype,
1300                            MPI_Aint *size);
1301 int MPI_Request_get_status(MPI_Request request, int *flag, MPI_Status *status);
1302 int MPI_Status_c2f(const MPI_Status *c_status, MPI_Fint *f_status);
1303 int MPI_Status_f2c(const MPI_Fint *f_status, MPI_Status *c_status);
1304 int MPI_Type_create_darray(int size, int rank, int ndims, const int array_of_gsizes[],
1305                            const int array_of_distribs[], const int array_of_dargs[],
1306                            const int array_of_psizes[], int order, MPI_Datatype oldtype,
1307                            MPI_Datatype *newtype);
1308 int MPI_Type_create_hindexed(int count, const int array_of_blocklengths[],
1309                              const MPI_Aint array_of_displacements[], MPI_Datatype oldtype,
1310                              MPI_Datatype *newtype);
1311 int MPI_Type_create_hvector(int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype,
1312                             MPI_Datatype *newtype);
1313 int MPI_Type_create_indexed_block(int count, int blocklength, const int array_of_displacements[],
1314                                   MPI_Datatype oldtype, MPI_Datatype *newtype);
1315 int MPI_Type_create_hindexed_block(int count, int blocklength,
1316                                    const MPI_Aint array_of_displacements[],
1317                                    MPI_Datatype oldtype, MPI_Datatype *newtype);
1318 int MPI_Type_create_resized(MPI_Datatype oldtype, MPI_Aint lb, MPI_Aint extent,
1319                             MPI_Datatype *newtype);
1320 int MPI_Type_create_struct(int count, const int array_of_blocklengths[],
1321                            const MPI_Aint array_of_displacements[],
1322                            const MPI_Datatype array_of_types[], MPI_Datatype *newtype);
1323 int MPI_Type_create_subarray(int ndims, const int array_of_sizes[],
1324                              const int array_of_subsizes[], const int array_of_starts[],
1325                              int order, MPI_Datatype oldtype, MPI_Datatype *newtype);
1326 int MPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint *lb, MPI_Aint *extent);
1327 int MPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint *true_lb, MPI_Aint *true_extent);
1328 int MPI_Unpack_external(const char datarep[], const void *inbuf, MPI_Aint insize,
1329                         MPI_Aint *position, void *outbuf, int outcount, MPI_Datatype datatype)
1330                         MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,7);
1331 int MPI_Win_create_errhandler(MPI_Win_errhandler_function *win_errhandler_fn,
1332                               MPI_Errhandler *errhandler);
1333 int MPI_Win_get_errhandler(MPI_Win win, MPI_Errhandler *errhandler);
1334 int MPI_Win_set_errhandler(MPI_Win win, MPI_Errhandler errhandler);
1335
1336 /* Fortran 90-related functions.  These routines are available only if
1337    Fortran 90 support is enabled 
1338 */
1339 int MPI_Type_create_f90_integer(int range, MPI_Datatype *newtype);
1340 int MPI_Type_create_f90_real(int precision, int range, MPI_Datatype *newtype);
1341 int MPI_Type_create_f90_complex(int precision, int range, MPI_Datatype *newtype);
1342
1343 int MPI_Reduce_local(const void *inbuf, void *inoutbuf, int count, MPI_Datatype datatype,
1344                      MPI_Op op)
1345                      MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1346 int MPI_Op_commutative(MPI_Op op, int *commute);
1347 int MPI_Reduce_scatter_block(const void *sendbuf, void *recvbuf, int recvcount,
1348                              MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
1349                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
1350                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1351 int MPI_Dist_graph_create_adjacent(MPI_Comm comm_old, int indegree, const int sources[],
1352                                    const int sourceweights[], int outdegree,
1353                                    const int destinations[], const int destweights[],
1354                                    MPI_Info info, int reorder, MPI_Comm *comm_dist_graph);
1355 int MPI_Dist_graph_create(MPI_Comm comm_old, int n, const int sources[], const int degrees[],
1356                           const int destinations[], const int weights[], MPI_Info info,
1357                           int reorder, MPI_Comm *comm_dist_graph);
1358 int MPI_Dist_graph_neighbors_count(MPI_Comm comm, int *indegree, int *outdegree, int *weighted);
1359 int MPI_Dist_graph_neighbors(MPI_Comm comm, int maxindegree, int sources[], int sourceweights[],
1360                              int maxoutdegree, int destinations[], int destweights[]);
1361
1362 /* Matched probe functionality */
1363 int MPI_Improbe(int source, int tag, MPI_Comm comm, int *flag, MPI_Message *message,
1364                 MPI_Status *status);
1365 int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message,
1366                MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1367 int MPI_Mprobe(int source, int tag, MPI_Comm comm, MPI_Message *message, MPI_Status *status);
1368 int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message,
1369               MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1370
1371 /* Nonblocking collectives */
1372 int MPI_Comm_idup(MPI_Comm comm, MPI_Comm *newcomm, MPI_Request *request);
1373 int MPI_Ibarrier(MPI_Comm comm, MPI_Request *request);
1374 int MPI_Ibcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm,
1375                MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1376 int MPI_Igather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1377                 int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm,
1378                 MPI_Request *request)
1379                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1380 int MPI_Igatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1381                  const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root,
1382                  MPI_Comm comm, MPI_Request *request)
1383                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1384 int MPI_Iscatter(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1385                  int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm,
1386                  MPI_Request *request)
1387                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1388 int MPI_Iscatterv(const void *sendbuf, const int sendcounts[], const int displs[],
1389                   MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype,
1390                   int root, MPI_Comm comm, MPI_Request *request)
1391                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,7);
1392 int MPI_Iallgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1393                    int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
1394                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1395 int MPI_Iallgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1396                     const int recvcounts[], const int displs[], MPI_Datatype recvtype,
1397                     MPI_Comm comm, MPI_Request *request)
1398                     MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1399 int MPI_Ialltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1400                   int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
1401                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1402 int MPI_Ialltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[],
1403                    MPI_Datatype sendtype, void *recvbuf, const int recvcounts[],
1404                    const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm,
1405                    MPI_Request *request)
1406                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
1407 int MPI_Ialltoallw(const void *sendbuf, const int sendcounts[], const int sdispls[],
1408                    const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[],
1409                    const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm,
1410                    MPI_Request *request);
1411 int MPI_Ireduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1412                 MPI_Op op, int root, MPI_Comm comm, MPI_Request *request)
1413                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1414 int MPI_Iallreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1415                    MPI_Op op, MPI_Comm comm, MPI_Request *request)
1416                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1417 int MPI_Ireduce_scatter(const void *sendbuf, void *recvbuf, const int recvcounts[],
1418                         MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request)
1419                         MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1420 int MPI_Ireduce_scatter_block(const void *sendbuf, void *recvbuf, int recvcount,
1421                               MPI_Datatype datatype, MPI_Op op, MPI_Comm comm,
1422                               MPI_Request *request)
1423                               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
1424                               MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1425 int MPI_Iscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op,
1426               MPI_Comm comm, MPI_Request *request)
1427               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1428 int MPI_Iexscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1429                 MPI_Op op, MPI_Comm comm, MPI_Request *request)
1430                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1431
1432 /* Neighborhood collectives */
1433 int MPI_Ineighbor_allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
1434                             void *recvbuf, int recvcount, MPI_Datatype recvtype,
1435                             MPI_Comm comm, MPI_Request *request)
1436                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1437                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1438 int MPI_Ineighbor_allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
1439                              void *recvbuf, const int recvcounts[], const int displs[],
1440                              MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
1441                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1442                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1443 int MPI_Ineighbor_alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
1444                            void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm,
1445                            MPI_Request *request)
1446                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1447                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1448 int MPI_Ineighbor_alltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[],
1449                             MPI_Datatype sendtype, void *recvbuf, const int recvcounts[],
1450                             const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm,
1451                             MPI_Request *request)
1452                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
1453                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
1454 int MPI_Ineighbor_alltoallw(const void *sendbuf, const int sendcounts[],
1455                             const MPI_Aint sdispls[], const MPI_Datatype sendtypes[],
1456                             void *recvbuf, const int recvcounts[], const MPI_Aint rdispls[],
1457                             const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Request *request);
1458 int MPI_Neighbor_allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
1459                            void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
1460                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1461                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1462 int MPI_Neighbor_allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
1463                             void *recvbuf, const int recvcounts[], const int displs[],
1464                             MPI_Datatype recvtype, MPI_Comm comm)
1465                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1466                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1467 int MPI_Neighbor_alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
1468                           void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
1469                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1470                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1471 int MPI_Neighbor_alltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[],
1472                            MPI_Datatype sendtype, void *recvbuf, const int recvcounts[],
1473                            const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm)
1474                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
1475                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
1476 int MPI_Neighbor_alltoallw(const void *sendbuf, const int sendcounts[], const MPI_Aint sdispls[],
1477                            const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[],
1478                            const MPI_Aint rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm);
1479
1480 /* Shared memory */
1481 int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key, MPI_Info info, MPI_Comm *newcomm);
1482
1483 /* MPI-3 "large count" routines */
1484 int MPI_Get_elements_x(const MPI_Status *status, MPI_Datatype datatype, MPI_Count *count);
1485 int MPI_Status_set_elements_x(MPI_Status *status, MPI_Datatype datatype, MPI_Count count);
1486 int MPI_Type_get_extent_x(MPI_Datatype datatype, MPI_Count *lb, MPI_Count *extent);
1487 int MPI_Type_get_true_extent_x(MPI_Datatype datatype, MPI_Count *lb, MPI_Count *extent);
1488 int MPI_Type_size_x(MPI_Datatype datatype, MPI_Count *size);
1489
1490 /* Noncollective communicator creation */
1491 int MPI_Comm_create_group(MPI_Comm comm, MPI_Group group, int tag, MPI_Comm *newcomm);
1492
1493
1494 /* MPI_T interface */
1495 /* The MPI_T routines are available only in C bindings - tell tools that they
1496    can skip these prototypes */
1497 /* Begin Skip Prototypes */
1498 int MPI_T_init_thread(int required, int *provided);
1499 int MPI_T_finalize(void);
1500 int MPI_T_enum_get_info(MPI_T_enum enumtype, int *num, char *name, int *name_len);
1501 int MPI_T_enum_get_item(MPI_T_enum enumtype, int indx, int *value, char *name, int *name_len);
1502 int MPI_T_cvar_get_num(int *num_cvar);
1503 int MPI_T_cvar_get_info(int cvar_index, char *name, int *name_len, int *verbosity,
1504                         MPI_Datatype *datatype, MPI_T_enum *enumtype, char *desc, int *desc_len,
1505                         int *binding, int *scope);
1506 int MPI_T_cvar_handle_alloc(int cvar_index, void *obj_handle, MPI_T_cvar_handle *handle,
1507                             int *count);
1508 int MPI_T_cvar_handle_free(MPI_T_cvar_handle *handle);
1509 int MPI_T_cvar_read(MPI_T_cvar_handle handle, void *buf);
1510 int MPI_T_cvar_write(MPI_T_cvar_handle handle, const void *buf);
1511 int MPI_T_pvar_get_num(int *num_pvar);
1512 int MPI_T_pvar_get_info(int pvar_index, char *name, int *name_len, int *verbosity, int *var_class,
1513                         MPI_Datatype *datatype, MPI_T_enum *enumtype, char *desc, int *desc_len,
1514                         int *binding, int *readonly, int *continuous, int *atomic);
1515 int MPI_T_pvar_session_create(MPI_T_pvar_session *session);
1516 int MPI_T_pvar_session_free(MPI_T_pvar_session *session);
1517 int MPI_T_pvar_handle_alloc(MPI_T_pvar_session session, int pvar_index, void *obj_handle,
1518                             MPI_T_pvar_handle *handle, int *count);
1519 int MPI_T_pvar_handle_free(MPI_T_pvar_session session, MPI_T_pvar_handle *handle);
1520 int MPI_T_pvar_start(MPI_T_pvar_session session, MPI_T_pvar_handle handle);
1521 int MPI_T_pvar_stop(MPI_T_pvar_session session, MPI_T_pvar_handle handle);
1522 int MPI_T_pvar_read(MPI_T_pvar_session session, MPI_T_pvar_handle handle, void *buf);
1523 int MPI_T_pvar_write(MPI_T_pvar_session session, MPI_T_pvar_handle handle, const void *buf);
1524 int MPI_T_pvar_reset(MPI_T_pvar_session session, MPI_T_pvar_handle handle);
1525 int MPI_T_pvar_readreset(MPI_T_pvar_session session, MPI_T_pvar_handle handle, void *buf);
1526 int MPI_T_category_get_num(int *num_cat);
1527 int MPI_T_category_get_info(int cat_index, char *name, int *name_len, char *desc, int *desc_len,
1528                             int *num_cvars, int *num_pvars, int *num_categories);
1529 int MPI_T_category_get_cvars(int cat_index, int len, int indices[]);
1530 int MPI_T_category_get_pvars(int cat_index, int len, int indices[]);
1531 int MPI_T_category_get_categories(int cat_index, int len, int indices[]);
1532 int MPI_T_category_changed(int *stamp);
1533 /* End Skip Prototypes */
1534
1535
1536 /* Non-standard but public extensions to MPI */
1537 /* Fault Tolerance Extensions */
1538 int MPIX_Comm_failure_ack(MPI_Comm comm);
1539 int MPIX_Comm_failure_get_acked(MPI_Comm comm, MPI_Group *failedgrp);
1540 int MPIX_Comm_revoke(MPI_Comm comm);
1541 int MPIX_Comm_shrink(MPI_Comm comm, MPI_Comm *newcomm);
1542 int MPIX_Comm_agree(MPI_Comm comm, int *flag);
1543
1544 /* MPI_Aint addressing arithmetic */
1545 MPI_Aint MPIX_Aint_add(MPI_Aint base, MPI_Aint disp);
1546 MPI_Aint MPIX_Aint_diff(MPI_Aint addr1, MPI_Aint addr2);
1547
1548 /* End Prototypes */
1549 #endif /* MPICH_SUPPRESS_PROTOTYPES */
1550
1551
1552 /* Here are the bindings of the profiling routines */
1553 #if !defined(MPI_BUILD_PROFILING)
1554 int PMPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1555               MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1556 int PMPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag,
1557               MPI_Comm comm, MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1558 int PMPI_Get_count(const MPI_Status *status, MPI_Datatype datatype, int *count);
1559 int PMPI_Bsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1560                MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1561 int PMPI_Ssend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1562                MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1563 int PMPI_Rsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1564                MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1565 int PMPI_Buffer_attach(void *buffer, int size);
1566 int PMPI_Buffer_detach(void *buffer_addr, int *size);
1567 int PMPI_Isend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1568                MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1569 int PMPI_Ibsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1570                 MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1571 int PMPI_Issend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1572                 MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1573 int PMPI_Irsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1574                 MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1575 int PMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int source, int tag,
1576                MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1577 int PMPI_Wait(MPI_Request *request, MPI_Status *status);
1578 int PMPI_Test(MPI_Request *request, int *flag, MPI_Status *status);
1579 int PMPI_Request_free(MPI_Request *request);
1580 int PMPI_Waitany(int count, MPI_Request array_of_requests[], int *indx, MPI_Status *status);
1581 int PMPI_Testany(int count, MPI_Request array_of_requests[], int *indx, int *flag,
1582                  MPI_Status *status);
1583 int PMPI_Waitall(int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[]);
1584 int PMPI_Testall(int count, MPI_Request array_of_requests[], int *flag,
1585                  MPI_Status array_of_statuses[]);
1586 int PMPI_Waitsome(int incount, MPI_Request array_of_requests[], int *outcount,
1587                   int array_of_indices[], MPI_Status array_of_statuses[]);
1588 int PMPI_Testsome(int incount, MPI_Request array_of_requests[], int *outcount,
1589                   int array_of_indices[], MPI_Status array_of_statuses[]);
1590 int PMPI_Iprobe(int source, int tag, MPI_Comm comm, int *flag, MPI_Status *status);
1591 int PMPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *status);
1592 int PMPI_Cancel(MPI_Request *request);
1593 int PMPI_Test_cancelled(const MPI_Status *status, int *flag);
1594 int PMPI_Send_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1595                    MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1596 int PMPI_Bsend_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1597                     MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1598 int PMPI_Ssend_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1599                     MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1600 int PMPI_Rsend_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag,
1601                     MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1602 int PMPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int source, int tag,
1603                    MPI_Comm comm, MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1604 int PMPI_Start(MPI_Request *request);
1605 int PMPI_Startall(int count, MPI_Request array_of_requests[]);
1606 int PMPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest,
1607                   int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype,
1608                   int source, int recvtag, MPI_Comm comm, MPI_Status *status)
1609                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1610                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(6,8);
1611 int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, int dest,
1612                           int sendtag, int source, int recvtag, MPI_Comm comm,
1613                           MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1614 int PMPI_Type_contiguous(int count, MPI_Datatype oldtype, MPI_Datatype *newtype);
1615 int PMPI_Type_vector(int count, int blocklength, int stride, MPI_Datatype oldtype,
1616                      MPI_Datatype *newtype);
1617 int PMPI_Type_hvector(int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype,
1618                       MPI_Datatype *newtype);
1619 int PMPI_Type_indexed(int count, const int *array_of_blocklengths,
1620                       const int *array_of_displacements, MPI_Datatype oldtype,
1621                       MPI_Datatype *newtype);
1622 int PMPI_Type_hindexed(int count, const int *array_of_blocklengths,
1623                        const MPI_Aint *array_of_displacements, MPI_Datatype oldtype,
1624                        MPI_Datatype *newtype);
1625 int PMPI_Type_struct(int count, const int *array_of_blocklengths,
1626                      const MPI_Aint *array_of_displacements,
1627                      const MPI_Datatype *array_of_types, MPI_Datatype *newtype);
1628 int PMPI_Address(const void *location, MPI_Aint *address);
1629 int PMPI_Type_extent(MPI_Datatype datatype, MPI_Aint *extent);
1630 int PMPI_Type_size(MPI_Datatype datatype, int *size);
1631 int PMPI_Type_lb(MPI_Datatype datatype, MPI_Aint *displacement);
1632 int PMPI_Type_ub(MPI_Datatype datatype, MPI_Aint *displacement);
1633 int PMPI_Type_commit(MPI_Datatype *datatype);
1634 int PMPI_Type_free(MPI_Datatype *datatype);
1635 int PMPI_Get_elements(const MPI_Status *status, MPI_Datatype datatype, int *count);
1636 int PMPI_Pack(const void *inbuf, int incount, MPI_Datatype datatype, void *outbuf,
1637               int outsize, int *position, MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1638 int PMPI_Unpack(const void *inbuf, int insize, int *position, void *outbuf, int outcount,
1639                 MPI_Datatype datatype, MPI_Comm comm) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1640 int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *size);
1641 int PMPI_Barrier(MPI_Comm comm);
1642 int PMPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
1643                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1644 int PMPI_Gather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1645                 int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
1646                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1647 int PMPI_Gatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1648                  const int *recvcounts, const int *displs, MPI_Datatype recvtype, int root,
1649                  MPI_Comm comm)
1650                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1651 int PMPI_Scatter(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1652                  int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
1653                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1654 int PMPI_Scatterv(const void *sendbuf, const int *sendcounts, const int *displs,
1655                   MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype,
1656                   int root, MPI_Comm comm)
1657                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,7);
1658 int PMPI_Allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1659                    int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
1660                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1661 int PMPI_Allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1662                     const int *recvcounts, const int *displs, MPI_Datatype recvtype, MPI_Comm comm)
1663                     MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
1664 int PMPI_Alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
1665                   int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
1666                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1667 int PMPI_Alltoallv(const void *sendbuf, const int *sendcounts, const int *sdispls,
1668                    MPI_Datatype sendtype, void *recvbuf, const int *recvcounts,
1669                    const int *rdispls, MPI_Datatype recvtype, MPI_Comm comm)
1670                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
1671 int PMPI_Alltoallw(const void *sendbuf, const int sendcounts[], const int sdispls[],
1672                    const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[],
1673                    const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm);
1674 int PMPI_Exscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1675                 MPI_Op op, MPI_Comm comm)
1676                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1677 int PMPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1678                 MPI_Op op, int root, MPI_Comm comm)
1679                 MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1680 int PMPI_Op_create(MPI_User_function *user_fn, int commute, MPI_Op *op);
1681 int PMPI_Op_free(MPI_Op *op);
1682 int PMPI_Allreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
1683                    MPI_Op op, MPI_Comm comm)
1684                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1685 int PMPI_Reduce_scatter(const void *sendbuf, void *recvbuf, const int recvcounts[],
1686                         MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
1687                         MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1688 int PMPI_Scan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op,
1689               MPI_Comm comm)
1690               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1691 int PMPI_Group_size(MPI_Group group, int *size);
1692 int PMPI_Group_rank(MPI_Group group, int *rank);
1693 int PMPI_Group_translate_ranks(MPI_Group group1, int n, const int ranks1[], MPI_Group group2,
1694                                int ranks2[]);
1695 int PMPI_Group_compare(MPI_Group group1, MPI_Group group2, int *result);
1696 int PMPI_Comm_group(MPI_Comm comm, MPI_Group *group);
1697 int PMPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
1698 int PMPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
1699 int PMPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
1700 int PMPI_Group_incl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup);
1701 int PMPI_Group_excl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup);
1702 int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup);
1703 int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup);
1704 int PMPI_Group_free(MPI_Group *group);
1705 int PMPI_Comm_size(MPI_Comm comm, int *size);
1706 int PMPI_Comm_rank(MPI_Comm comm, int *rank);
1707 int PMPI_Comm_compare(MPI_Comm comm1, MPI_Comm comm2, int *result);
1708 int PMPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm);
1709 int PMPI_Comm_dup_with_info(MPI_Comm comm, MPI_Info info, MPI_Comm *newcomm);
1710 int PMPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm);
1711 int PMPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm);
1712 int PMPI_Comm_free(MPI_Comm *comm);
1713 int PMPI_Comm_test_inter(MPI_Comm comm, int *flag);
1714 int PMPI_Comm_remote_size(MPI_Comm comm, int *size);
1715 int PMPI_Comm_remote_group(MPI_Comm comm, MPI_Group *group);
1716 int PMPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm,
1717                           int remote_leader, int tag, MPI_Comm *newintercomm);
1718 int PMPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm);
1719 int PMPI_Keyval_create(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn,
1720                        int *keyval, void *extra_state);
1721 int PMPI_Keyval_free(int *keyval);
1722 int PMPI_Attr_put(MPI_Comm comm, int keyval, void *attribute_val);
1723 int PMPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag);
1724 int PMPI_Attr_delete(MPI_Comm comm, int keyval);
1725 int PMPI_Topo_test(MPI_Comm comm, int *status);
1726 int PMPI_Cart_create(MPI_Comm comm_old, int ndims, const int dims[], const int periods[],
1727                      int reorder, MPI_Comm *comm_cart);
1728 int PMPI_Dims_create(int nnodes, int ndims, int dims[]);
1729 int PMPI_Graph_create(MPI_Comm comm_old, int nnodes, const int indx[], const int edges[],
1730                       int reorder, MPI_Comm *comm_graph);
1731 int PMPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges);
1732 int PMPI_Graph_get(MPI_Comm comm, int maxindex, int maxedges, int indx[], int edges[]);
1733 int PMPI_Cartdim_get(MPI_Comm comm, int *ndims);
1734 int PMPI_Cart_get(MPI_Comm comm, int maxdims, int dims[], int periods[], int coords[]);
1735 int PMPI_Cart_rank(MPI_Comm comm, const int coords[], int *rank);
1736 int PMPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int coords[]);
1737 int PMPI_Graph_neighbors_count(MPI_Comm comm, int rank, int *nneighbors);
1738 int PMPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int neighbors[]);
1739 int PMPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest);
1740 int PMPI_Cart_sub(MPI_Comm comm, const int remain_dims[], MPI_Comm *newcomm);
1741 int PMPI_Cart_map(MPI_Comm comm, int ndims, const int dims[], const int periods[], int *newrank);
1742 int PMPI_Graph_map(MPI_Comm comm, int nnodes, const int indx[], const int edges[], int *newrank);
1743 int PMPI_Get_processor_name(char *name, int *resultlen);
1744 int PMPI_Get_version(int *version, int *subversion);
1745 int PMPI_Get_library_version(char *version, int *resultlen);
1746 int PMPI_Errhandler_create(MPI_Handler_function *function, MPI_Errhandler *errhandler);
1747 int PMPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler);
1748 int PMPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler);
1749 int PMPI_Errhandler_free(MPI_Errhandler *errhandler);
1750 int PMPI_Error_string(int errorcode, char *string, int *resultlen);
1751 int PMPI_Error_class(int errorcode, int *errorclass);
1752 double PMPI_Wtime(void);
1753 double PMPI_Wtick(void);
1754 int PMPI_Init(int *argc, char ***argv);
1755 int PMPI_Finalize(void);
1756 int PMPI_Initialized(int *flag);
1757 int PMPI_Abort(MPI_Comm comm, int errorcode);
1758
1759 /* Note that we may need to define a @PCONTROL_LIST@ depending on whether
1760    stdargs are supported */
1761 int PMPI_Pcontrol(const int level, ...);
1762
1763 /* Process Creation and Management */
1764 int PMPI_Close_port(const char *port_name);
1765 int PMPI_Comm_accept(const char *port_name, MPI_Info info, int root, MPI_Comm comm,
1766                      MPI_Comm *newcomm);
1767 int PMPI_Comm_connect(const char *port_name, MPI_Info info, int root, MPI_Comm comm,
1768                       MPI_Comm *newcomm);
1769 int PMPI_Comm_disconnect(MPI_Comm *comm);
1770 int PMPI_Comm_get_parent(MPI_Comm *parent);
1771 int PMPI_Comm_join(int fd, MPI_Comm *intercomm);
1772 int PMPI_Comm_spawn(const char *command, char *argv[], int maxprocs, MPI_Info info, int root,
1773                     MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]);
1774 int PMPI_Comm_spawn_multiple(int count, char *array_of_commands[], char **array_of_argv[],
1775                              const int array_of_maxprocs[], const MPI_Info array_of_info[],
1776                              int root, MPI_Comm comm, MPI_Comm *intercomm, int array_of_errcodes[]);
1777 int PMPI_Lookup_name(const char *service_name, MPI_Info info, char *port_name);
1778 int PMPI_Open_port(MPI_Info info, char *port_name);
1779 int PMPI_Publish_name(const char *service_name, MPI_Info info, const char *port_name);
1780 int PMPI_Unpublish_name(const char *service_name, MPI_Info info, const char *port_name);
1781 int PMPI_Comm_set_info(MPI_Comm comm, MPI_Info info);
1782 int PMPI_Comm_get_info(MPI_Comm comm, MPI_Info *info);
1783
1784 /* One-Sided Communications */
1785 int PMPI_Accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
1786                     int target_rank, MPI_Aint target_disp, int target_count,
1787                     MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
1788                     MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1789 int PMPI_Get(void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
1790              int target_rank, MPI_Aint target_disp, int target_count,
1791              MPI_Datatype target_datatype, MPI_Win win) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1792 int PMPI_Put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype,
1793              int target_rank, MPI_Aint target_disp, int target_count,
1794              MPI_Datatype target_datatype, MPI_Win win) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1795 int PMPI_Win_complete(MPI_Win win);
1796 int PMPI_Win_create(void *base, MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm,
1797                     MPI_Win *win);
1798 int PMPI_Win_fence(int assert, MPI_Win win);
1799 int PMPI_Win_free(MPI_Win *win);
1800 int PMPI_Win_get_group(MPI_Win win, MPI_Group *group);
1801 int PMPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win);
1802 int PMPI_Win_post(MPI_Group group, int assert, MPI_Win win);
1803 int PMPI_Win_start(MPI_Group group, int assert, MPI_Win win);
1804 int PMPI_Win_test(MPI_Win win, int *flag);
1805 int PMPI_Win_unlock(int rank, MPI_Win win);
1806 int PMPI_Win_wait(MPI_Win win);
1807
1808 /* MPI-3 One-Sided Communication Routines */
1809 int PMPI_Win_allocate(MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm, void *baseptr,
1810                       MPI_Win *win);
1811 int PMPI_Win_allocate_shared(MPI_Aint size, int disp_unit, MPI_Info info, MPI_Comm comm,
1812                              void *baseptr, MPI_Win *win);
1813 int PMPI_Win_shared_query(MPI_Win win, int rank, MPI_Aint *size, int *disp_unit, void *baseptr);
1814 int PMPI_Win_create_dynamic(MPI_Info info, MPI_Comm comm, MPI_Win *win);
1815 int PMPI_Win_attach(MPI_Win win, void *base, MPI_Aint size);
1816 int PMPI_Win_detach(MPI_Win win, const void *base);
1817 int PMPI_Win_get_info(MPI_Win win, MPI_Info *info_used);
1818 int PMPI_Win_set_info(MPI_Win win, MPI_Info info);
1819 int PMPI_Get_accumulate(const void *origin_addr, int origin_count,
1820                          MPI_Datatype origin_datatype, void *result_addr, int result_count,
1821                          MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
1822                          int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win)
1823                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1824                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1825 int PMPI_Fetch_and_op(const void *origin_addr, void *result_addr,
1826                        MPI_Datatype datatype, int target_rank, MPI_Aint target_disp,
1827                        MPI_Op op, MPI_Win win)
1828                        MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1829 int PMPI_Compare_and_swap(const void *origin_addr, const void *compare_addr,
1830                            void *result_addr, MPI_Datatype datatype, int target_rank,
1831                            MPI_Aint target_disp, MPI_Win win)
1832                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
1833                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4)
1834                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(3,4);
1835 int PMPI_Rput(const void *origin_addr, int origin_count,
1836                MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp,
1837                int target_count, MPI_Datatype target_datatype, MPI_Win win,
1838                MPI_Request *request)
1839                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1840 int PMPI_Rget(void *origin_addr, int origin_count,
1841                MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp,
1842                int target_count, MPI_Datatype target_datatype, MPI_Win win,
1843                MPI_Request *request)
1844                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1845 int PMPI_Raccumulate(const void *origin_addr, int origin_count,
1846                       MPI_Datatype origin_datatype, int target_rank, MPI_Aint target_disp,
1847                       int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win,
1848                       MPI_Request *request)
1849                       MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
1850 int PMPI_Rget_accumulate(const void *origin_addr, int origin_count,
1851                           MPI_Datatype origin_datatype, void *result_addr, int result_count,
1852                           MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
1853                           int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Win win,
1854                           MPI_Request *request)
1855                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
1856                           MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
1857 int PMPI_Win_lock_all(int assert, MPI_Win win);
1858 int PMPI_Win_unlock_all(MPI_Win win);
1859 int PMPI_Win_flush(int rank, MPI_Win win);
1860 int PMPI_Win_flush_all(MPI_Win win);
1861 int PMPI_Win_flush_local(int rank, MPI_Win win);
1862 int PMPI_Win_flush_local_all(MPI_Win win);
1863 int PMPI_Win_sync(MPI_Win win);
1864  
1865 /* External Interfaces */
1866 int PMPI_Add_error_class(int *errorclass);
1867 int PMPI_Add_error_code(int errorclass, int *errorcode);
1868 int PMPI_Add_error_string(int errorcode, const char *string);
1869 int PMPI_Comm_call_errhandler(MPI_Comm comm, int errorcode);
1870 int PMPI_Comm_create_keyval(MPI_Comm_copy_attr_function *comm_copy_attr_fn,
1871                             MPI_Comm_delete_attr_function *comm_delete_attr_fn, int *comm_keyval,
1872                             void *extra_state);
1873 int PMPI_Comm_delete_attr(MPI_Comm comm, int comm_keyval);
1874 int PMPI_Comm_free_keyval(int *comm_keyval);
1875 int PMPI_Comm_get_attr(MPI_Comm comm, int comm_keyval, void *attribute_val, int *flag);
1876 int PMPI_Comm_get_name(MPI_Comm comm, char *comm_name, int *resultlen);
1877 int PMPI_Comm_set_attr(MPI_Comm comm, int comm_keyval, void *attribute_val);
1878 int PMPI_Comm_set_name(MPI_Comm comm, const char *comm_name);
1879 int PMPI_File_call_errhandler(MPI_File fh, int errorcode);
1880 int PMPI_Grequest_complete(MPI_Request request);
1881 int PMPI_Grequest_start(MPI_Grequest_query_function *query_fn, MPI_Grequest_free_function *free_fn,
1882                         MPI_Grequest_cancel_function *cancel_fn, void *extra_state,
1883                         MPI_Request *request);
1884 int PMPI_Init_thread(int *argc, char ***argv, int required, int *provided);
1885 int PMPI_Is_thread_main(int *flag);
1886 int PMPI_Query_thread(int *provided);
1887 int PMPI_Status_set_cancelled(MPI_Status *status, int flag);
1888 int PMPI_Status_set_elements(MPI_Status *status, MPI_Datatype datatype, int count);
1889 int PMPI_Type_create_keyval(MPI_Type_copy_attr_function *type_copy_attr_fn,
1890                             MPI_Type_delete_attr_function *type_delete_attr_fn,
1891                             int *type_keyval, void *extra_state);
1892 int PMPI_Type_delete_attr(MPI_Datatype datatype, int type_keyval);
1893 int PMPI_Type_dup(MPI_Datatype oldtype, MPI_Datatype *newtype);
1894 int PMPI_Type_free_keyval(int *type_keyval);
1895 int PMPI_Type_get_attr(MPI_Datatype datatype, int type_keyval, void *attribute_val, int *flag);
1896 int PMPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses,
1897                            int max_datatypes, int array_of_integers[],
1898                            MPI_Aint array_of_addresses[], MPI_Datatype array_of_datatypes[]);
1899 int PMPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses,
1900                            int *num_datatypes, int *combiner);
1901 int PMPI_Type_get_name(MPI_Datatype datatype, char *type_name, int *resultlen);
1902 int PMPI_Type_set_attr(MPI_Datatype datatype, int type_keyval, void *attribute_val);
1903 int PMPI_Type_set_name(MPI_Datatype datatype, const char *type_name);
1904 int PMPI_Type_match_size(int typeclass, int size, MPI_Datatype *datatype);
1905 int PMPI_Win_call_errhandler(MPI_Win win, int errorcode);
1906 int PMPI_Win_create_keyval(MPI_Win_copy_attr_function *win_copy_attr_fn,
1907                            MPI_Win_delete_attr_function *win_delete_attr_fn, int *win_keyval,
1908                            void *extra_state);
1909 int PMPI_Win_delete_attr(MPI_Win win, int win_keyval);
1910 int PMPI_Win_free_keyval(int *win_keyval);
1911 int PMPI_Win_get_attr(MPI_Win win, int win_keyval, void *attribute_val, int *flag);
1912 int PMPI_Win_get_name(MPI_Win win, char *win_name, int *resultlen);
1913 int PMPI_Win_set_attr(MPI_Win win, int win_keyval, void *attribute_val);
1914 int PMPI_Win_set_name(MPI_Win win, const char *win_name);
1915
1916 int PMPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr);
1917 int PMPI_Comm_create_errhandler(MPI_Comm_errhandler_function *comm_errhandler_fn,
1918                                 MPI_Errhandler *errhandler);
1919 int PMPI_Comm_get_errhandler(MPI_Comm comm, MPI_Errhandler *errhandler);
1920 int PMPI_Comm_set_errhandler(MPI_Comm comm, MPI_Errhandler errhandler);
1921 int PMPI_File_create_errhandler(MPI_File_errhandler_function *file_errhandler_fn,
1922                                 MPI_Errhandler *errhandler);
1923 int PMPI_File_get_errhandler(MPI_File file, MPI_Errhandler *errhandler);
1924 int PMPI_File_set_errhandler(MPI_File file, MPI_Errhandler errhandler);
1925 int PMPI_Finalized(int *flag);
1926 int PMPI_Free_mem(void *base);
1927 int PMPI_Get_address(const void *location, MPI_Aint *address);
1928 int PMPI_Info_create(MPI_Info *info);
1929 int PMPI_Info_delete(MPI_Info info, const char *key);
1930 int PMPI_Info_dup(MPI_Info info, MPI_Info *newinfo);
1931 int PMPI_Info_free(MPI_Info *info);
1932 int PMPI_Info_get(MPI_Info info, const char *key, int valuelen, char *value, int *flag);
1933 int PMPI_Info_get_nkeys(MPI_Info info, int *nkeys);
1934 int PMPI_Info_get_nthkey(MPI_Info info, int n, char *key);
1935 int PMPI_Info_get_valuelen(MPI_Info info, const char *key, int *valuelen, int *flag);
1936 int PMPI_Info_set(MPI_Info info, const char *key, const char *value);
1937 int PMPI_Pack_external(const char datarep[], const void *inbuf, int incount,
1938                        MPI_Datatype datatype, void *outbuf, MPI_Aint outsize, MPI_Aint *position)
1939                        MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1940 int PMPI_Pack_external_size(const char datarep[], int incount, MPI_Datatype datatype,
1941                             MPI_Aint *size);
1942 int PMPI_Request_get_status(MPI_Request request, int *flag, MPI_Status *status);
1943 int PMPI_Status_c2f(const MPI_Status *c_status, MPI_Fint *f_status);
1944 int PMPI_Status_f2c(const MPI_Fint *f_status, MPI_Status *c_status);
1945 int PMPI_Type_create_darray(int size, int rank, int ndims, const int array_of_gsizes[],
1946                             const int array_of_distribs[], const int array_of_dargs[],
1947                             const int array_of_psizes[], int order, MPI_Datatype oldtype,
1948                             MPI_Datatype *newtype);
1949 int PMPI_Type_create_hindexed(int count, const int array_of_blocklengths[],
1950                               const MPI_Aint array_of_displacements[], MPI_Datatype oldtype,
1951                               MPI_Datatype *newtype);
1952 int PMPI_Type_create_hvector(int count, int blocklength, MPI_Aint stride, MPI_Datatype oldtype,
1953                              MPI_Datatype *newtype);
1954 int PMPI_Type_create_indexed_block(int count, int blocklength, const int array_of_displacements[],
1955                                    MPI_Datatype oldtype, MPI_Datatype *newtype);
1956 int PMPI_Type_create_hindexed_block(int count, int blocklength,
1957                                     const MPI_Aint array_of_displacements[],
1958                                     MPI_Datatype oldtype, MPI_Datatype *newtype);
1959 int PMPI_Type_create_resized(MPI_Datatype oldtype, MPI_Aint lb, MPI_Aint extent,
1960                              MPI_Datatype *newtype);
1961 int PMPI_Type_create_struct(int count, const int array_of_blocklengths[],
1962                             const MPI_Aint array_of_displacements[],
1963                             const MPI_Datatype array_of_types[], MPI_Datatype *newtype);
1964 int PMPI_Type_create_subarray(int ndims, const int array_of_sizes[],
1965                               const int array_of_subsizes[], const int array_of_starts[],
1966                               int order, MPI_Datatype oldtype, MPI_Datatype *newtype);
1967 int PMPI_Type_get_extent(MPI_Datatype datatype, MPI_Aint *lb, MPI_Aint *extent);
1968 int PMPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint *true_lb, MPI_Aint *true_extent);
1969 int PMPI_Unpack_external(const char datarep[], const void *inbuf, MPI_Aint insize,
1970                          MPI_Aint *position, void *outbuf, int outcount, MPI_Datatype datatype)
1971                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,7);
1972 int PMPI_Win_create_errhandler(MPI_Win_errhandler_function *win_errhandler_fn,
1973                                MPI_Errhandler *errhandler);
1974 int PMPI_Win_get_errhandler(MPI_Win win, MPI_Errhandler *errhandler);
1975 int PMPI_Win_set_errhandler(MPI_Win win, MPI_Errhandler errhandler);
1976
1977 /* Fortran 90-related functions.  These routines are available only if
1978    Fortran 90 support is enabled 
1979 */
1980 int PMPI_Type_create_f90_integer(int r, MPI_Datatype *newtype);
1981 int PMPI_Type_create_f90_real(int p, int r, MPI_Datatype *newtype);
1982 int PMPI_Type_create_f90_complex(int p, int r, MPI_Datatype *newtype);
1983
1984 int PMPI_Reduce_local(const void *inbuf, void *inoutbuf, int count, MPI_Datatype datatype,
1985                       MPI_Op op)
1986                       MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1987 int PMPI_Op_commutative(MPI_Op op, int *commute);
1988 int PMPI_Reduce_scatter_block(const void *sendbuf, void *recvbuf, int recvcount,
1989                               MPI_Datatype datatype, MPI_Op op, MPI_Comm comm)
1990                               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
1991                               MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
1992 int PMPI_Dist_graph_create_adjacent(MPI_Comm comm_old, int indegree, const int sources[],
1993                                     const int sourceweights[], int outdegree,
1994                                     const int destinations[], const int destweights[],
1995                                     MPI_Info info, int reorder, MPI_Comm *comm_dist_graph);
1996 int PMPI_Dist_graph_create(MPI_Comm comm_old, int n, const int sources[], const int degrees[],
1997                            const int destinations[], const int weights[], MPI_Info info,
1998                            int reorder, MPI_Comm *comm_dist_graph);
1999 int PMPI_Dist_graph_neighbors_count(MPI_Comm comm, int *indegree, int *outdegree, int *weighted);
2000 int PMPI_Dist_graph_neighbors(MPI_Comm comm, int maxindegree, int sources[], int sourceweights[],
2001                               int maxoutdegree, int destinations[], int destweights[]);
2002
2003 /* Matched probe functionality */
2004 int PMPI_Improbe(int source, int tag, MPI_Comm comm, int *flag, MPI_Message *message,
2005                  MPI_Status *status);
2006 int PMPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message,
2007                 MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
2008 int PMPI_Mprobe(int source, int tag, MPI_Comm comm, MPI_Message *message, MPI_Status *status);
2009 int PMPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message,
2010                MPI_Status *status) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
2011
2012 /* Nonblocking collectives */
2013 int PMPI_Comm_idup(MPI_Comm comm, MPI_Comm *newcomm, MPI_Request *request);
2014 int PMPI_Ibarrier(MPI_Comm comm, MPI_Request *request);
2015 int PMPI_Ibcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm,
2016                 MPI_Request *request) MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3);
2017 int PMPI_Igather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
2018                  int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm,
2019                  MPI_Request *request)
2020                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2021 int PMPI_Igatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
2022                   const int recvcounts[], const int displs[], MPI_Datatype recvtype, int root,
2023                   MPI_Comm comm, MPI_Request *request)
2024                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
2025 int PMPI_Iscatter(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
2026                   int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm,
2027                   MPI_Request *request)
2028                   MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2029 int PMPI_Iscatterv(const void *sendbuf, const int sendcounts[], const int displs[],
2030                    MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype,
2031                    int root, MPI_Comm comm, MPI_Request *request)
2032                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,7);
2033 int PMPI_Iallgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
2034                     int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
2035                     MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2036 int PMPI_Iallgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
2037                      const int recvcounts[], const int displs[], MPI_Datatype recvtype,
2038                      MPI_Comm comm, MPI_Request *request)
2039                      MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
2040 int PMPI_Ialltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf,
2041                    int recvcount, MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
2042                    MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3) MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2043 int PMPI_Ialltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[],
2044                     MPI_Datatype sendtype, void *recvbuf, const int recvcounts[],
2045                     const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm,
2046                     MPI_Request *request)
2047                     MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
2048 int PMPI_Ialltoallw(const void *sendbuf, const int sendcounts[], const int sdispls[],
2049                     const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[],
2050                     const int rdispls[], const MPI_Datatype recvtypes[], MPI_Comm comm,
2051                     MPI_Request *request);
2052 int PMPI_Ireduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
2053                  MPI_Op op, int root, MPI_Comm comm, MPI_Request *request)
2054                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
2055 int PMPI_Iallreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
2056                     MPI_Op op, MPI_Comm comm, MPI_Request *request)
2057                     MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
2058 int PMPI_Ireduce_scatter(const void *sendbuf, void *recvbuf, const int recvcounts[],
2059                          MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, MPI_Request *request)
2060                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
2061                          MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
2062 int PMPI_Ireduce_scatter_block(const void *sendbuf, void *recvbuf, int recvcount,
2063                                MPI_Datatype datatype, MPI_Op op, MPI_Comm comm,
2064                                MPI_Request *request)
2065                                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
2066                                MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
2067 int PMPI_Iscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op,
2068                MPI_Comm comm, MPI_Request *request)
2069                MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
2070 int PMPI_Iexscan(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
2071                  MPI_Op op, MPI_Comm comm, MPI_Request *request)
2072                  MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4) MPICH_ATTR_POINTER_WITH_TYPE_TAG(2,4);
2073
2074 /* Neighborhood collectives */
2075 int PMPI_Ineighbor_allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
2076                              void *recvbuf, int recvcount, MPI_Datatype recvtype,
2077                              MPI_Comm comm, MPI_Request *request)
2078                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
2079                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2080 int PMPI_Ineighbor_allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
2081                               void *recvbuf, const int recvcounts[], const int displs[],
2082                               MPI_Datatype recvtype, MPI_Comm comm, MPI_Request *request)
2083                               MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
2084                               MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
2085 int PMPI_Ineighbor_alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
2086                             void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm,
2087                             MPI_Request *request)
2088                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
2089                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2090 int PMPI_Ineighbor_alltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[],
2091                              MPI_Datatype sendtype, void *recvbuf, const int recvcounts[],
2092                              const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm,
2093                              MPI_Request *request)
2094                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
2095                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
2096 int PMPI_Ineighbor_alltoallw(const void *sendbuf, const int sendcounts[],
2097                              const MPI_Aint sdispls[], const MPI_Datatype sendtypes[],
2098                              void *recvbuf, const int recvcounts[], const MPI_Aint rdispls[],
2099                              const MPI_Datatype recvtypes[], MPI_Comm comm, MPI_Request *request);
2100 int PMPI_Neighbor_allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
2101                             void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
2102                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
2103                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2104 int PMPI_Neighbor_allgatherv(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
2105                              void *recvbuf, const int recvcounts[], const int displs[],
2106                              MPI_Datatype recvtype, MPI_Comm comm)
2107                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
2108                              MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,7);
2109 int PMPI_Neighbor_alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
2110                            void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)
2111                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,3)
2112                            MPICH_ATTR_POINTER_WITH_TYPE_TAG(4,6);
2113 int PMPI_Neighbor_alltoallv(const void *sendbuf, const int sendcounts[], const int sdispls[],
2114                             MPI_Datatype sendtype, void *recvbuf, const int recvcounts[],
2115                             const int rdispls[], MPI_Datatype recvtype, MPI_Comm comm)
2116                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(1,4)
2117                             MPICH_ATTR_POINTER_WITH_TYPE_TAG(5,8);
2118 int PMPI_Neighbor_alltoallw(const void *sendbuf, const int sendcounts[], const MPI_Aint sdispls[],
2119                             const MPI_Datatype sendtypes[], void *recvbuf, const int recvcounts[],
2120                             const MPI_Aint rdispls[], const MPI_Datatype recvtypes[],
2121                             MPI_Comm comm);
2122
2123 /* Shared memory */
2124 int PMPI_Comm_split_type(MPI_Comm comm, int split_type, int key, MPI_Info info, MPI_Comm *newcomm);
2125
2126 /* Noncollective communicator creation */
2127 int PMPI_Comm_create_group(MPI_Comm comm, MPI_Group group, int tag, MPI_Comm *newcomm);
2128
2129 /* MPI-3 "large count" routines */
2130 int PMPI_Get_elements_x(const MPI_Status *status, MPI_Datatype datatype, MPI_Count *count);
2131 int PMPI_Status_set_elements_x(MPI_Status *status, MPI_Datatype datatype, MPI_Count count);
2132 int PMPI_Type_get_extent_x(MPI_Datatype datatype, MPI_Count *lb, MPI_Count *extent);
2133 int PMPI_Type_get_true_extent_x(MPI_Datatype datatype, MPI_Count *lb, MPI_Count *extent);
2134 int PMPI_Type_size_x(MPI_Datatype datatype, MPI_Count *size);
2135
2136
2137 /* MPI_T interface */
2138 /* The MPI_T routines are available only in C bindings - tell tools that they
2139    can skip these prototypes */
2140 /* Begin Skip Prototypes */
2141 int PMPI_T_init_thread(int required, int *provided);
2142 int PMPI_T_finalize(void);
2143 int PMPI_T_enum_get_info(MPI_T_enum enumtype, int *num, char *name, int *name_len);
2144 int PMPI_T_enum_get_item(MPI_T_enum enumtype, int indx, int *value, char *name, int *name_len);
2145 int PMPI_T_cvar_get_num(int *num_cvar);
2146 int PMPI_T_cvar_get_info(int cvar_index, char *name, int *name_len, int *verbosity,
2147                          MPI_Datatype *datatype, MPI_T_enum *enumtype, char *desc, int *desc_len,
2148                          int *binding, int *scope);
2149 int PMPI_T_cvar_handle_alloc(int cvar_index, void *obj_handle, MPI_T_cvar_handle *handle,
2150                              int *count);
2151 int PMPI_T_cvar_handle_free(MPI_T_cvar_handle *handle);
2152 int PMPI_T_cvar_read(MPI_T_cvar_handle handle, void *buf);
2153 int PMPI_T_cvar_write(MPI_T_cvar_handle handle, const void *buf);
2154 int PMPI_T_pvar_get_num(int *num_pvar);
2155 int PMPI_T_pvar_get_info(int pvar_index, char *name, int *name_len, int *verbosity, int *var_class,
2156                          MPI_Datatype *datatype, MPI_T_enum *enumtype, char *desc, int *desc_len,
2157                          int *binding, int *readonly, int *continuous, int *atomic);
2158 int PMPI_T_pvar_session_create(MPI_T_pvar_session *session);
2159 int PMPI_T_pvar_session_free(MPI_T_pvar_session *session);
2160 int PMPI_T_pvar_handle_alloc(MPI_T_pvar_session session, int pvar_index, void *obj_handle,
2161                              MPI_T_pvar_handle *handle, int *count);
2162 int PMPI_T_pvar_handle_free(MPI_T_pvar_session session, MPI_T_pvar_handle *handle);
2163 int PMPI_T_pvar_start(MPI_T_pvar_session session, MPI_T_pvar_handle handle);
2164 int PMPI_T_pvar_stop(MPI_T_pvar_session session, MPI_T_pvar_handle handle);
2165 int PMPI_T_pvar_read(MPI_T_pvar_session session, MPI_T_pvar_handle handle, void *buf);
2166 int PMPI_T_pvar_write(MPI_T_pvar_session session, MPI_T_pvar_handle handle, const void *buf);
2167 int PMPI_T_pvar_reset(MPI_T_pvar_session session, MPI_T_pvar_handle handle);
2168 int PMPI_T_pvar_readreset(MPI_T_pvar_session session, MPI_T_pvar_handle handle, void *buf);
2169 int PMPI_T_category_get_num(int *num_cat);
2170 int PMPI_T_category_get_info(int cat_index, char *name, int *name_len, char *desc, int *desc_len,
2171                              int *num_cvars, int *num_pvars, int *num_categories);
2172 int PMPI_T_category_get_cvars(int cat_index, int len, int indices[]);
2173 int PMPI_T_category_get_pvars(int cat_index, int len, int indices[]);
2174 int PMPI_T_category_get_categories(int cat_index, int len, int indices[]);
2175 int PMPI_T_category_changed(int *stamp);
2176 /* End Skip Prototypes */
2177
2178
2179 /* Non-standard but public extensions to MPI */
2180 /* Fault Tolerance Extensions */
2181 int PMPIX_Comm_failure_ack(MPI_Comm comm);
2182 int PMPIX_Comm_failure_get_acked(MPI_Comm comm, MPI_Group *failedgrp);
2183 int PMPIX_Comm_revoke(MPI_Comm comm);
2184 int PMPIX_Comm_shrink(MPI_Comm comm, MPI_Comm *newcomm);
2185 int PMPIX_Comm_agree(MPI_Comm comm, int *flag);
2186
2187 /* MPI_Aint addressing arithmetic */
2188 MPI_Aint PMPIX_Aint_add(MPI_Aint base, MPI_Aint disp);
2189 MPI_Aint PMPIX_Aint_diff(MPI_Aint addr1, MPI_Aint addr2);
2190
2191 #endif  /* MPI_BUILD_PROFILING */
2192 /* End of MPI bindings */
2193
2194 /* feature advertisement */
2195 #define MPIIMPL_ADVERTISES_FEATURES 1
2196 #define MPIIMPL_HAVE_MPI_INFO 1                                                 
2197 #define MPIIMPL_HAVE_MPI_COMBINER_DARRAY 1                                      
2198 #define MPIIMPL_HAVE_MPI_TYPE_CREATE_DARRAY 1
2199 #define MPIIMPL_HAVE_MPI_COMBINER_SUBARRAY 1                                    
2200 #define MPIIMPL_HAVE_MPI_TYPE_CREATE_DARRAY 1
2201 #define MPIIMPL_HAVE_MPI_COMBINER_DUP 1                                         
2202 #define MPIIMPL_HAVE_MPI_GREQUEST 1      
2203 #define MPIIMPL_HAVE_STATUS_SET_BYTES 1
2204 #define MPIIMPL_HAVE_STATUS_SET_INFO 1
2205
2206 @HAVE_ROMIO@
2207
2208 #if defined(__cplusplus)
2209 }
2210 /* Add the C++ bindings */
2211 /* 
2212    If MPICH_SKIP_MPICXX is defined, the mpicxx.h file will *not* be included.
2213    This is necessary, for example, when building the C++ interfaces.  It
2214    can also be used when you want to use a C++ compiler to compile C code,
2215    and do not want to load the C++ bindings.  These definitions can
2216    be made by the C++ compilation script
2217  */
2218 #if !defined(MPICH_SKIP_MPICXX)
2219 /* mpicxx.h contains the MPI C++ binding.  In the mpi.h.in file, this 
2220    include is in an autoconf variable in case the compiler is a C++ 
2221    compiler but MPI was built without the C++ bindings */
2222 @INCLUDE_MPICXX_H@
2223 #endif 
2224 #endif
2225
2226
2227 /* Generalized requests extensions */
2228 typedef int MPIX_Grequest_class;
2229 int MPIX_Grequest_class_create(MPI_Grequest_query_function *query_fn,
2230                                MPI_Grequest_free_function *free_fn,
2231                                MPI_Grequest_cancel_function *cancel_fn,
2232                                MPIX_Grequest_poll_function *poll_fn,
2233                                MPIX_Grequest_wait_function *wait_fn,
2234                                MPIX_Grequest_class *greq_class);
2235 int MPIX_Grequest_class_allocate(MPIX_Grequest_class greq_class, void *extra_state,
2236                                  MPI_Request *request);
2237 int MPIX_Grequest_start(MPI_Grequest_query_function *query_fn,
2238                         MPI_Grequest_free_function *free_fn,
2239                         MPI_Grequest_cancel_function *cancel_fn,
2240                         MPIX_Grequest_poll_function *poll_fn,
2241                         MPIX_Grequest_wait_function *wait_fn, void *extra_state,
2242                         MPI_Request *request);
2243
2244 /* RMA Mutexes Extensions */
2245 struct mpixi_mutex_s;
2246 typedef struct mpixi_mutex_s * MPIX_Mutex;
2247 int MPIX_Mutex_create(int count, MPI_Comm comm, MPIX_Mutex *hdl);
2248 int MPIX_Mutex_free(MPIX_Mutex *hdl);
2249 int MPIX_Mutex_lock(MPIX_Mutex hdl, int mutex, int proc);
2250 int MPIX_Mutex_unlock(MPIX_Mutex hdl, int mutex, int proc);
2251
2252
2253 #if !defined(MPI_BUILD_PROFILING)
2254 /* Generalized requests extensions */
2255 int PMPIX_Grequest_class_create(MPI_Grequest_query_function *query_fn,
2256                                 MPI_Grequest_free_function *free_fn,
2257                                 MPI_Grequest_cancel_function *cancel_fn,
2258                                 MPIX_Grequest_poll_function *poll_fn,
2259                                 MPIX_Grequest_wait_function *wait_fn,
2260                                 MPIX_Grequest_class *greq_class);
2261 int PMPIX_Grequest_class_allocate(MPIX_Grequest_class greq_class, void *extra_state,
2262                                   MPI_Request *request);
2263 int PMPIX_Grequest_start(MPI_Grequest_query_function *query_fn,
2264                          MPI_Grequest_free_function *free_fn,
2265                          MPI_Grequest_cancel_function *cancel_fn,
2266                          MPIX_Grequest_poll_function *poll_fn,
2267                          MPIX_Grequest_wait_function *wait_fn, void *extra_state,
2268                          MPI_Request *request);
2269
2270 /* RMA Mutexes Extensions */
2271 int PMPIX_Mutex_create(int count, MPI_Comm comm, MPIX_Mutex *hdl);
2272 int PMPIX_Mutex_free(MPIX_Mutex *hdl);
2273 int PMPIX_Mutex_lock(MPIX_Mutex hdl, int mutex, int proc);
2274 int PMPIX_Mutex_unlock(MPIX_Mutex hdl, int mutex, int proc);
2275 #endif /* MPI_BUILD_PROFILING */
2276
2277 #endif