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