Adding type MPI_LONG_LONG as a synonym of MPI_LONG_LONG_INT
[charm.git] / src / libs / ck-libs / ampi / ampi.h
1 #ifndef _MPI_H
2 #define _MPI_H
3
4 #include "conv-config.h" 
5
6 /* NON-standard define: this lets people #ifdef on
7    AMPI, e.g. for our bizarre AMPI_Main. */
8 #define AMPI
9
10 /*
11 Silently rename the user's main routine.
12 This is needed so we can call the routine as a new thread,
13 instead of as an actual "main".
14 */
15 #ifdef __cplusplus /* C++ version-- rename "main" as "AMPI_Main_cpp" */
16 #  define main AMPI_Main_cpp
17 int AMPI_Main_cpp(int argc,char **argv); /* prototype for C++ main routine */
18
19 extern "C" {
20 #else /* C version-- rename "main" as "AMPI_Main" */
21 #  define main AMPI_Main
22 #endif
23
24 int AMPI_Main(int argc,char **argv); /* prototype for C main routine */
25
26 typedef int MPI_Datatype;
27 typedef int MPI_Aint;/* should be "long", but must be "int" for f90... */
28 typedef int MPI_Fint;
29
30 /********************** MPI-1.1 prototypes and defines ***************************/
31 /* MPI-1 Errors */
32 #define MPI_SUCCESS                     0
33 #define MPI_ERR_BUFFER                  1
34 #define MPI_ERR_COUNT                   2
35 #define MPI_ERR_TYPE                    3
36 #define MPI_ERR_TAG                     4
37 #define MPI_ERR_COMM                    5
38 #define MPI_ERR_RANK                    6
39 #define MPI_ERR_REQUEST                 7
40 #define MPI_ERR_ROOT                    8
41 #define MPI_ERR_GROUP                   9
42 #define MPI_ERR_OP                      10
43 #define MPI_ERR_TOPOLOGY                11
44 #define MPI_ERR_DIMS                    12
45 #define MPI_ERR_ARG                     13
46 #define MPI_ERR_UNKNOWN                 14
47 #define MPI_ERR_TRUNCATE                15
48 #define MPI_ERR_OTHER                   16
49 #define MPI_ERR_INTERN                  17
50 #define MPI_ERR_IN_STATUS               18
51 #define MPI_ERR_PENDING                 19
52 /* MPI-2 Errors */
53 #define MPI_ERR_ACCESS                  20
54 #define MPI_ERR_AMODE                   21
55 #define MPI_ERR_ASSERT                  22
56 #define MPI_ERR_BAD_FILE                23
57 #define MPI_ERR_BASE                    24
58 #define MPI_ERR_CONVERSION              25
59 #define MPI_ERR_DISP                    26
60 #define MPI_ERR_DUP_DATAREP             27
61 #define MPI_ERR_FILE_EXISTS             28
62 #define MPI_ERR_FILE_IN_USE             29
63 #define MPI_ERR_FILE                    30
64 #define MPI_ERR_INFO_KEY                31
65 #define MPI_ERR_INFO_NOKEY              32
66 #define MPI_ERR_INFO_VALUE              33
67 #define MPI_ERR_INFO                    34
68 #define MPI_ERR_IO                      35
69 #define MPI_ERR_KEYVAL                  36
70 #define MPI_ERR_LOCKTYPE                37
71 #define MPI_ERR_NAME                    38
72 #define MPI_ERR_NO_MEM                  39
73 #define MPI_ERR_NOT_SAME                40
74 #define MPI_ERR_NO_SPACE                41
75 #define MPI_ERR_NO_SUCH_FILE            42
76 #define MPI_ERR_PORT                    43
77 #define MPI_ERR_QUOTA                   44
78 #define MPI_ERR_READ_ONLY               45
79 #define MPI_ERR_RMA_CONFLICT            46
80 #define MPI_ERR_RMA_SYNC                47
81 #define MPI_ERR_SERVICE                 48
82 #define MPI_ERR_SIZE                    49
83 #define MPI_ERR_SPAWN                   50
84 #define MPI_ERR_UNSUPPORTED_DATAREP     51
85 #define MPI_ERR_UNSUPPORTED_OPERATION   52
86 #define MPI_ERR_WIN                     53
87 #define MPI_ERR_LASTCODE                53
88 /* 0=MPI_SUCCESS<MPI_ERRs(...)<MPI_ERR<=MPI_ERR_LASTCODE */
89
90 #define MPI_MAX_PROCESSOR_NAME  256
91 #define MPI_MAX_ERROR_STRING    256
92
93 /* these values have to match values in ampif.h */
94 /* base types */
95 #define MPI_DATATYPE_NULL    -1
96 #define MPI_DOUBLE            0
97 #define MPI_INT               1
98 #define MPI_FLOAT             2
99 #define MPI_COMPLEX           3
100 #define MPI_LOGICAL           4
101 #define MPI_CHAR              5
102 #define MPI_BYTE              6
103 #define MPI_PACKED            7
104 #define MPI_SHORT             8
105 #define MPI_LONG              9
106 #define MPI_UNSIGNED_CHAR     10
107 #define MPI_UNSIGNED_SHORT    11
108 #define MPI_UNSIGNED          12
109 #define MPI_UNSIGNED_LONG     13
110 #define MPI_LONG_DOUBLE       14
111 /* tuple types */
112 #define MPI_FLOAT_INT         15
113 #define MPI_DOUBLE_INT        16
114 #define MPI_LONG_INT          17
115 #define MPI_2INT              18
116 #define MPI_SHORT_INT         19
117 #define MPI_LONG_DOUBLE_INT   20
118 #define MPI_2FLOAT            21
119 #define MPI_2DOUBLE           22
120 /* special types */
121 #define MPI_LB                23
122 #define MPI_UB                24
123 #define MPI_LONG_LONG_INT     25
124 #define MPI_LONG_LONG         MPI_LONG_LONG_INT
125 #define MPI_DOUBLE_COMPLEX    26
126
127 #define MPI_ANY_TAG      (-1)
128 #define MPI_REQUEST_NULL (-1)
129 #define MPI_GROUP_NULL   (-1)
130 #define MPI_GROUP_EMPTY  0
131 #define MPI_COMM_NULL    (-1)
132 #define MPI_TYPE_NULL    (-1)
133 #define MPI_PROC_NULL    (-2)
134 #define MPI_ANY_SOURCE   (-1)
135 #define MPI_KEYVAL_INVALID (-1)
136 #define MPI_INFO_NULL    (-1)
137
138 #define MPI_IN_PLACE ((void *) -1L)
139
140 #define MPI_BOTTOM       0
141 #define MPI_UNDEFINED    (-32766)
142
143 #define MPI_IDENT       0
144 #define MPI_SIMILAR     1
145 #define MPI_CONGRUENT   2
146 #define MPI_UNEQUAL     3
147
148 #define MPI_OP_NULL  (MPI_Op)NULL
149 void MPI_MAX      ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
150 void MPI_MIN      ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
151 void MPI_SUM      ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
152 void MPI_PROD     ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
153 void MPI_LAND     ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
154 void MPI_BAND     ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
155 void MPI_LOR      ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
156 void MPI_BOR      ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
157 void MPI_LXOR     ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
158 void MPI_BXOR     ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
159 void MPI_MAXLOC   ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
160 void MPI_MINLOC   ( void *invec, void *inoutvec, int *len, MPI_Datatype *datatype);
161
162 #define MPI_GRAPH 1
163 #define MPI_CART 2
164
165 /* This is one less than the system-tags defined in ampiimpl.h.
166  * This is so that the tags used by the system dont clash with user-tags.
167  * MPI standard requires this to be at least 2^15.
168  */
169 #define MPI_TAG_UB_VALUE  1073741824
170
171 /** These are the builtin MPI keyvals.  You can pass them to 
172   MPI_Attr_get for any communicator.
173 */
174 #define MPI_TAG_UB -10
175 #define MPI_HOST -11
176 #define MPI_IO -12
177 #define MPI_WTIME_IS_GLOBAL -13
178
179 /** These are AMPI-specific keyvals. They return information about
180 the real (non-virtual) processors. */
181 #define AMPI_KEYVAL_MYPE -14
182 #define AMPI_KEYVAL_NUMPES -15
183 #define AMPI_KEYVAL_MYNODE -16
184 #define AMPI_KEYVAL_NUMNODES -17
185
186
187 /** Communicators give a communication context to a set of processors.
188     An intercommunicator can be used for point to point messaging between two groups.
189     An intracommunicator can be used to send messages within a single group. */
190 typedef int MPI_Comm;
191
192 /** Groups represent an set of processors 0...n-1. They can be created locally */
193 typedef int MPI_Group;
194
195 #define MPI_COMM_FIRST_SPLIT (MPI_Comm)(1000000) /*Communicator from MPI_Comm_split */
196 #define MPI_COMM_FIRST_GROUP (MPI_Comm)(2000000) /*Communicator from MPI_Comm_group */
197 #define MPI_COMM_FIRST_CART  (MPI_Comm)(3000000) /*Communicator from MPI_Cart_create */
198 #define MPI_COMM_FIRST_GRAPH (MPI_Comm)(4000000) /*Communicator from MPI_Graph_create */
199 #define MPI_COMM_FIRST_INTER (MPI_Comm)(5000000) /*Communicator from MPI_Intercomm_create*/
200 #define MPI_COMM_FIRST_INTRA (MPI_Comm)(6000000) /*Communicator from MPI_Intercomm_merge*/
201 #define MPI_COMM_FIRST_RESVD (MPI_Comm)(7000000) /*Communicator reserved for now*/
202 #define MPI_COMM_SELF (MPI_Comm)(8000000)
203 #define MPI_COMM_WORLD (MPI_Comm)(9000000) /*Start of universe*/
204 #define MPI_MAX_COMM_WORLDS 8
205 extern MPI_Comm MPI_COMM_UNIVERSE[MPI_MAX_COMM_WORLDS];
206
207 /* the size of MPI_Status must conform to MPI_STATUS_SIZE in ampif.h */
208 struct AmpiMsg;
209 typedef int MPI_Request;
210 typedef struct {
211   int MPI_TAG, MPI_SOURCE, MPI_COMM, MPI_LENGTH, MPI_ERROR; /* FIXME: MPI_ERROR is never used */
212   struct AmpiMsg *msg;
213 } MPI_Status;
214
215 #define stsempty(sts) (sts).MPI_TAG=(sts).MPI_SOURCE=(sts).MPI_COMM=(sts).MPI_LENGTH=0
216 #define MPI_STATUS_IGNORE (MPI_Status *)0
217
218 typedef int MPI_Errhandler;
219 #define MPI_ERRHANDLER_NULL     0
220 #define MPI_ERRORS_RETURN       1
221 #define MPI_ERRORS_ARE_FATAL    2
222
223 typedef void (MPI_Handler_function)(MPI_Comm *, int *, ...);
224 typedef int  (MPI_Copy_function)(MPI_Comm oldcomm, int keyval,
225                     void *extra_state, void *attribute_val_in,
226                     void *attribute_val_out, int *flag);
227 typedef int  (MPI_Delete_function)(MPI_Comm comm, int keyval,
228                           void *attribute_val, void *extra_state);
229 typedef void (MPI_User_function) (void *invec, void *inoutvec, 
230                                   int *len, MPI_Datatype *datatype);
231 typedef void (*MPI_Op) (void *invec, void *inoutvec, 
232                        int *len, MPI_Datatype *datatype);
233
234 #define MPI_NULL_COPY_FN   MPI_null_copy_fn
235 #define MPI_NULL_DELETE_FN MPI_null_delete_fn
236 #define MPI_DUP_FN         MPI_dup_fn
237 int MPI_NULL_COPY_FN ( MPI_Comm, int, void *, void *, void *, int * );
238 int MPI_NULL_DELETE_FN ( MPI_Comm, int, void *, void * );
239 int MPI_DUP_FN ( MPI_Comm, int, void *, void *, void *, int * );
240
241 #include "pup_c.h"
242
243 typedef void (*MPI_PupFn)(pup_er, void*);
244
245
246 /********************** MPI-2 prototypes and defines ***************************/
247 /* for the datatype decoders */
248 #define MPI_COMBINER_NAMED         1
249 #define MPI_COMBINER_CONTIGUOUS    2
250 #define MPI_COMBINER_VECTOR        3
251 #define MPI_COMBINER_HVECTOR       4
252 #define MPI_COMBINER_INDEXED       5
253 #define MPI_COMBINER_HINDEXED      6
254 #define MPI_COMBINER_STRUCT        7
255
256 /********************** MPI-1.1 Functions ***************************/
257 /***pt2pt***/
258 #define MPI_BSEND_OVERHEAD 0
259 #define MPI_Send AMPI_Send
260 int AMPI_Send(void *msg, int count, MPI_Datatype type, int dest,
261              int tag, MPI_Comm comm);
262 #define MPI_Ssend AMPI_Ssend
263 int AMPI_Ssend(void *msg, int count, MPI_Datatype type, int dest,
264              int tag, MPI_Comm comm);
265 #define MPI_Recv AMPI_Recv
266 int AMPI_Recv(void *msg, int count, int type, int src, int tag,
267              MPI_Comm comm, MPI_Status *status);
268 #define MPI_Get_count AMPI_Get_count
269 int AMPI_Get_count(MPI_Status *sts, MPI_Datatype dtype, int *count);
270 #define AMPI_Bsend AMPI_Send
271 #define AMPI_Rsend AMPI_Send
272 #define MPI_Bsend AMPI_Bsend
273 #define MPI_Rsend AMPI_Rsend   /* FIXME: MPI_Rsend can be posted only after recv */
274 #define MPI_Buffer_attach(buf,len) /*LIE: emtpy*/ /*Silly: default send is buffering in Charm++*/
275 #define MPI_Buffer_detach(buf,len) /*LIE: emtpy*/
276 #define MPI_Isend AMPI_Isend
277 int AMPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest,
278               int tag, MPI_Comm comm, MPI_Request *request);
279 #define MPI_Ibsend AMPI_Isend
280 #define MPI_Issend AMPI_Issend
281 int AMPI_Issend(void *buf, int count, MPI_Datatype datatype, int dest,
282               int tag, MPI_Comm comm, MPI_Request *request);
283 #define MPI_Irsend AMPI_Isend   /* FIXME: see MPI_Rsend */
284 #define MPI_Irecv AMPI_Irecv
285 int AMPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src,
286               int tag, MPI_Comm comm, MPI_Request *request);
287 #define MPI_Wait AMPI_Wait
288 int AMPI_Wait(MPI_Request *request, MPI_Status *sts);
289 #define MPI_Test AMPI_Test
290 int AMPI_Test(MPI_Request *request, int *flag, MPI_Status *sts);
291 #define MPI_Waitany AMPI_Waitany
292 int AMPI_Waitany(int count, MPI_Request *request, int *index, MPI_Status *sts);
293 #define MPI_Testany AMPI_Testany
294 int AMPI_Testany(int count, MPI_Request *request, int *index, int *flag, MPI_Status *status);
295 #define MPI_Waitall AMPI_Waitall
296 int AMPI_Waitall(int count, MPI_Request *request, MPI_Status *sts);
297 #define MPI_Testall AMPI_Testall
298 int AMPI_Testall(int count, MPI_Request *request, int *flag, MPI_Status *sts);
299 #define MPI_Waitsome AMPI_Waitsome
300 int AMPI_Waitsome(int incount, MPI_Request *array_of_requests, int *outcount, 
301                 int *array_of_indices, MPI_Status *array_of_statuses);
302 #define MPI_Testsome AMPI_Testsome
303 int AMPI_Testsome(int incount, MPI_Request *array_of_requests, int *outcount, 
304                 int *array_of_indices, MPI_Status *array_of_statuses);
305 #define MPI_Request_free AMPI_Request_free
306 int AMPI_Request_free(MPI_Request *request);
307 #define MPI_Cancel AMPI_Cancel
308 int AMPI_Cancel(MPI_Request *request);
309 #define MPI_Test_cancelled AMPI_Test_cancelled
310 int AMPI_Test_cancelled(MPI_Status *status, int *flag);  /* FIXME: always returns success */
311 #define MPI_Iprobe AMPI_Iprobe
312 int AMPI_Iprobe(int src, int tag, MPI_Comm comm, int *flag, MPI_Status *sts);
313 #define MPI_Probe AMPI_Probe
314 int AMPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *sts);
315 #define MPI_Send_init AMPI_Send_init
316 int AMPI_Send_init(void *buf, int count, int type, int dest, int tag,
317                   MPI_Comm comm, MPI_Request *req);
318 #define MPI_Ssend_init AMPI_Ssend_init
319 int AMPI_Ssend_init(void *buf, int count, int type, int dest, int tag,
320                   MPI_Comm comm, MPI_Request *req);
321 #define MPI_Bsend_init AMPI_Send_init
322 #define MPI_Rsend_init AMPI_Send_init  /* FIXME: see MPI_Rsend */
323 #define MPI_Recv_init AMPI_Recv_init
324 int AMPI_Recv_init(void *buf, int count, int type, int src, int tag,
325                   MPI_Comm comm, MPI_Request *req);
326 #define MPI_Start AMPI_Start
327 int AMPI_Start(MPI_Request *reqnum);
328 #define MPI_Startall AMPI_Startall
329 int AMPI_Startall(int count, MPI_Request *array_of_requests);
330 #define MPI_Sendrecv AMPI_Sendrecv
331 int AMPI_Sendrecv(void *sbuf, int scount, int stype, int dest,
332                  int stag, void *rbuf, int rcount, int rtype,
333                  int src, int rtag, MPI_Comm comm, MPI_Status *sts);
334 #define MPI_Sendrecv_replace AMPI_Sendrecv_replace
335 int AMPI_Sendrecv_replace(void* buf, int count, MPI_Datatype datatype,
336                          int dest, int sendtag, int source, int recvtag,
337                          MPI_Comm comm, MPI_Status *status);
338 #define MPI_Type_contiguous AMPI_Type_contiguous
339 int AMPI_Type_contiguous(int count, MPI_Datatype oldtype,
340                          MPI_Datatype *newtype);
341 #define MPI_Type_vector AMPI_Type_vector
342 int AMPI_Type_vector(int count, int blocklength, int stride,
343                      MPI_Datatype oldtype, MPI_Datatype *newtype);
344 #define MPI_Type_hvector AMPI_Type_hvector
345 int AMPI_Type_hvector(int count, int blocklength, MPI_Aint stride,
346                       MPI_Datatype oldtype, MPI_Datatype *newtype);
347 #define MPI_Type_indexed AMPI_Type_indexed
348 int AMPI_Type_indexed(int count, int* arrBlength, int* arrDisp,
349                       MPI_Datatype oldtype, MPI_Datatype *newtype);
350 #define MPI_Type_hindexed AMPI_Type_hindexed
351 int AMPI_Type_hindexed(int count, int* arrBlength, MPI_Aint* arrDisp,
352                        MPI_Datatype oldtype, MPI_Datatype *newtype);
353 #define MPI_Type_struct AMPI_Type_struct
354
355 int AMPI_Type_struct(int count, int* arrBLength, MPI_Aint* arrDisp,
356                       MPI_Datatype *oldType, MPI_Datatype *newType);
357 #define MPI_Type_commit AMPI_Type_commit
358 int AMPI_Type_commit(MPI_Datatype *datatype);
359 #define MPI_Type_free AMPI_Type_free
360 int AMPI_Type_free(MPI_Datatype *datatype);
361 #define MPI_Type_extent AMPI_Type_extent
362 int AMPI_Type_extent(MPI_Datatype datatype, MPI_Aint *extent);
363 #define MPI_Type_size AMPI_Type_size
364 int AMPI_Type_size(MPI_Datatype datatype, int *size);
365 #define MPI_Type_lb AMPI_Type_lb
366 int AMPI_Type_lb(MPI_Datatype datatype, MPI_Aint* displacement);
367 #define MPI_Type_ub AMPI_Type_ub
368 int AMPI_Type_ub(MPI_Datatype datatype, MPI_Aint* displacement);
369 #define MPI_Address AMPI_Address
370 int AMPI_Address(void* location, MPI_Aint *address);
371 #define MPI_Get_elements AMPI_Get_elements
372 int AMPI_Get_elements(MPI_Status *status, MPI_Datatype datatype, int *count);
373 #define MPI_Pack AMPI_Pack
374 int AMPI_Pack(void *inbuf, int incount, MPI_Datatype dtype, void *outbuf,
375               int outsize, int *position, MPI_Comm comm);
376 #define MPI_Unpack AMPI_Unpack
377 int AMPI_Unpack(void *inbuf, int insize, int *position, void *outbuf,
378               int outcount, MPI_Datatype dtype, MPI_Comm comm);
379 #define MPI_Pack_size AMPI_Pack_size
380 int AMPI_Pack_size(int incount,MPI_Datatype datatype,MPI_Comm comm,int *sz);
381
382 /***collective***/
383 #define MPI_Barrier AMPI_Barrier
384 int AMPI_Barrier(MPI_Comm comm);
385 #define MPI_Bcast AMPI_Bcast
386 int AMPI_Bcast(void *buf, int count, int type, int root, MPI_Comm comm);
387 #define MPI_Gather AMPI_Gather
388 int AMPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
389                void *recvbuf, int recvcount, MPI_Datatype recvtype,
390                int root, MPI_Comm comm);
391 #define MPI_Gatherv AMPI_Gatherv
392 int AMPI_Gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
393                 void *recvbuf, int *recvcounts, int *displs,
394                 MPI_Datatype recvtype, int root, MPI_Comm comm);
395 #define MPI_Scatter AMPI_Scatter
396 int AMPI_Scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype,
397                 void *recvbuf, int recvcount, MPI_Datatype recvtype,
398                 int root, MPI_Comm comm);
399 #define MPI_Scatterv AMPI_Scatterv
400 int AMPI_Scatterv(void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype,
401                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
402                  int root, MPI_Comm comm);
403 #define MPI_Allgather AMPI_Allgather
404 int AMPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
405                   void *recvbuf, int recvcount, MPI_Datatype recvtype,
406                   MPI_Comm comm);
407 #define MPI_Iallgather AMPI_Iallgather
408 int AMPI_Iallgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
409                   void *recvbuf, int recvcount, MPI_Datatype recvtype,
410                   MPI_Comm comm, MPI_Request* request);
411 #define MPI_Allgatherv AMPI_Allgatherv
412 int AMPI_Allgatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype,
413                    void *recvbuf, int *recvcounts, int *displs,
414                    MPI_Datatype recvtype, MPI_Comm comm) ;
415 #define MPI_Alltoall AMPI_Alltoall
416 int AMPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
417                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
418                  MPI_Comm comm);
419 #define MPI_Alltoall2 AMPI_Alltoall2
420 int AMPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
421                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
422                  MPI_Comm comm);
423 #define MPI_Alltoallv AMPI_Alltoallv
424 int AMPI_Alltoallv(void *sendbuf, int *sendcounts, int *sdispls,
425                   MPI_Datatype sendtype, void *recvbuf, int *recvcounts,
426                   int *rdispls, MPI_Datatype recvtype, MPI_Comm comm);
427 #define MPI_Alltoall_long MPICH_AlltoAll_long
428 int  MPICH_AlltoAll_long(void *sendbuf, int sendcount, MPI_Datatype sendtype,
429                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
430                  MPI_Comm comm);
431 #define MPI_Alltoall_medium MPICH_AlltoAll_medium
432 int  MPICH_AlltoAll_medium(void *sendbuf, int sendcount, MPI_Datatype sendtype,
433                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
434                  MPI_Comm comm);
435 #define MPI_Ialltoall AMPI_Ialltoall
436 int AMPI_Ialltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
437                  void *recvbuf, int recvcount, MPI_Datatype recvtype,
438                  MPI_Comm comm, MPI_Request *request);
439 #define MPI_Reduce AMPI_Reduce
440 int AMPI_Reduce(void *inbuf, void *outbuf, int count, int type,
441                MPI_Op op, int root, MPI_Comm comm);
442 #define MPI_Ireduce AMPI_Ireduce
443 int AMPI_Ireduce(void *sendbuf, void *recvbuf, int count, int type,
444                  MPI_Op op, int root, MPI_Comm comm, MPI_Request *request);
445 #define MPI_Allreduce AMPI_Allreduce
446 int AMPI_Allreduce(void *inbuf, void *outbuf, int count, int type,
447                   MPI_Op op, MPI_Comm comm);
448 #define MPI_Iallreduce AMPI_Iallreduce
449 int AMPI_Iallreduce(void *inbuf, void *outbuf, int count, int type,
450                   MPI_Op op, MPI_Comm comm, MPI_Request *request);
451 #define MPI_Reduce_scatter AMPI_Reduce_scatter
452 int AMPI_Reduce_scatter(void* sendbuf, void* recvbuf, int *recvcounts,
453                        MPI_Datatype datatype, MPI_Op op, MPI_Comm comm);
454 #define MPI_Scan AMPI_Scan
455 int AMPI_Scan(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, 
456                 MPI_Op op, MPI_Comm comm );
457 #define MPI_Op_create AMPI_Op_create
458 int AMPI_Op_create(MPI_User_function *function, int commute, MPI_Op *op);
459 #define MPI_Op_free AMPI_Op_free
460 int AMPI_Op_free(MPI_Op *op);
461
462 /***groups,contexts and communicators***/
463 #define MPI_Group_size AMPI_Group_size
464 int AMPI_Group_size(MPI_Group group, int *size);
465 #define MPI_Group_rank AMPI_Group_rank
466 int AMPI_Group_rank(MPI_Group group, int *rank);
467 #define MPI_Group_translate_ranks AMPI_Group_translate_ranks
468 int AMPI_Group_translate_ranks(MPI_Group group1, int n, int *ranks1, MPI_Group group2, int *ranks2);
469 #define MPI_Group_compare AMPI_Group_compare
470 int AMPI_Group_compare(MPI_Group group1,MPI_Group group2, int *result);
471
472 #define MPI_Comm_group AMPI_Comm_group
473 int AMPI_Comm_group(MPI_Comm comm, MPI_Group *group);
474 #define MPI_Group_union AMPI_Group_union
475 int AMPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
476 #define MPI_Group_intersection AMPI_Group_intersection
477 int AMPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
478 #define MPI_Group_difference AMPI_Group_difference
479 int AMPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group *newgroup);
480 #define MPI_Group_incl AMPI_Group_incl
481 int AMPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group *newgroup);
482 #define MPI_Group_excl AMPI_Group_excl
483 int AMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group *newgroup);
484 #define MPI_Group_range_incl AMPI_Group_range_incl
485 int AMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup);
486 #define MPI_Group_range_excl AMPI_Group_range_excl
487 int AMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], MPI_Group *newgroup);
488 #define MPI_Group_free AMPI_Group_free
489 int AMPI_Group_free(MPI_Group *group);
490 #define MPI_Comm_create AMPI_Comm_create
491 int AMPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm* newcomm);
492
493 #define MPI_Comm_size AMPI_Comm_size
494 int AMPI_Comm_size(MPI_Comm comm, int *size);
495 #define MPI_Comm_rank AMPI_Comm_rank
496 int AMPI_Comm_rank(MPI_Comm comm, int *rank);
497 #define MPI_Comm_compare AMPI_Comm_compare
498 int AMPI_Comm_compare(MPI_Comm comm1,MPI_Comm comm2, int *result);
499 #define MPI_Comm_split AMPI_Comm_split
500 int AMPI_Comm_split(MPI_Comm src, int color, int key, MPI_Comm *dest);
501 #define MPI_Comm_dup AMPI_Comm_dup
502 int AMPI_Comm_dup(MPI_Comm src, MPI_Comm *dest);
503 #define MPI_Comm_free AMPI_Comm_free
504 int AMPI_Comm_free(MPI_Comm *comm);
505 #define MPI_Comm_test_inter AMPI_Comm_test_inter
506 int AMPI_Comm_test_inter(MPI_Comm comm, int *flag);
507 #define MPI_Comm_remote_size AMPI_Comm_remote_size
508 int AMPI_Comm_remote_size(MPI_Comm comm, int *size);
509 #define MPI_Comm_remote_group AMPI_Comm_remote_group
510 int AMPI_Comm_remote_group(MPI_Comm comm, MPI_Group *group);
511 #define MPI_Intercomm_create AMPI_Intercomm_create
512 int AMPI_Intercomm_create(MPI_Comm local_comm, int local_leader, MPI_Comm peer_comm, 
513                         int remote_leader, int tag, MPI_Comm *newintercomm);
514 #define MPI_Intercomm_merge AMPI_Intercomm_merge
515 int AMPI_Intercomm_merge(MPI_Comm intercomm, int high, MPI_Comm *newintracomm);
516 #define MPI_Keyval_create AMPI_Keyval_create
517 int AMPI_Keyval_create(MPI_Copy_function *copy_fn, MPI_Delete_function *delete_fn, 
518                         int *keyval, void* extra_state);
519 #define MPI_Keyval_free AMPI_Keyval_free
520 int AMPI_Keyval_free(int *keyval);
521 #define MPI_Attr_put AMPI_Attr_put
522 int AMPI_Attr_put(MPI_Comm comm, int keyval, void* attribute_val);
523 #define MPI_Attr_get AMPI_Attr_get
524 int AMPI_Attr_get(MPI_Comm comm, int keyval, void *attribute_val, int *flag);
525 #define MPI_Attr_delete AMPI_Attr_delete
526 int AMPI_Attr_delete(MPI_Comm comm, int keyval);
527
528 /***topologies***/
529 #define MPI_Cart_create AMPI_Cart_create
530 int AMPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims, int *periods,
531                     int reorder, MPI_Comm *comm_cart);
532 #define MPI_Graph_create AMPI_Graph_create
533 int AMPI_Graph_create(MPI_Comm comm_old, int nnodes, int *index, int *edges,
534                      int reorder, MPI_Comm *comm_graph);
535 #define MPI_Topo_test AMPI_Topo_test
536 int AMPI_Topo_test(MPI_Comm comm, int *status);
537 #define MPI_Cart_map AMPI_Cart_map
538 int AMPI_Cart_map(MPI_Comm comm, int ndims, int *dims, int *periods, int *newrank);
539 #define MPI_Graph_map AMPI_Graph_map
540 int AMPI_Graph_map(MPI_Comm comm, int nnodes, int *index, int *edges, int *newrank);
541 #define MPI_Cartdim_get AMPI_Cartdim_get
542 int AMPI_Cartdim_get(MPI_Comm comm, int *ndims);
543 #define MPI_Cart_get AMPI_Cart_get
544 int AMPI_Cart_get(MPI_Comm comm, int maxdims, int *dims, int *periods, int *coords);
545 #define MPI_Cart_rank AMPI_Cart_rank
546 int AMPI_Cart_rank(MPI_Comm comm, int *coords, int *rank);
547 #define MPI_Cart_coords AMPI_Cart_coords
548 int AMPI_Cart_coords(MPI_Comm comm, int rank, int maxdims, int *coords);
549 #define MPI_Cart_shift AMPI_Cart_shift
550 int AMPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest);
551 #define MPI_Graphdims_get AMPI_Graphdims_get
552 int AMPI_Graphdims_get(MPI_Comm comm, int *nnodes, int *nedges);
553 #define MPI_Graph_get AMPI_Graph_get
554 int AMPI_Graph_get(MPI_Comm comm, int maxindex, int maxedges, int *index, int *edges);
555 #define MPI_Graph_neighbors_count AMPI_Graph_neighbors_count
556 int AMPI_Graph_neighbors_count(MPI_Comm comm, int rank, int *nneighbors);
557 #define MPI_Graph_neighbors AMPI_Graph_neighbors
558 int AMPI_Graph_neighbors(MPI_Comm comm, int rank, int maxneighbors, int *neighbors);
559 #define MPI_Dims_create AMPI_Dims_create
560 int AMPI_Dims_create(int nnodes, int ndims, int *dims);
561 #define MPI_Cart_sub AMPI_Cart_sub
562 int AMPI_Cart_sub(MPI_Comm comm, int *remain_dims, MPI_Comm *newcomm);
563
564 /***environment management***/
565 #define MPI_Get_processor_name AMPI_Get_processor_name
566 int AMPI_Get_processor_name(char *name, int *resultlen);
567 #define MPI_Errhandler_create AMPI_Errhandler_create
568 int AMPI_Errhandler_create(MPI_Handler_function *function, MPI_Errhandler *errhandler);
569 #define MPI_Errhandler_set AMPI_Errhandler_set
570 int AMPI_Errhandler_set(MPI_Comm comm, MPI_Errhandler errhandler);
571 #define MPI_Errhandler_get AMPI_Errhandler_get
572 int AMPI_Errhandler_get(MPI_Comm comm, MPI_Errhandler *errhandler);
573 #define MPI_Errhandler_free AMPI_Errhandler_free
574 int AMPI_Errhandler_free(MPI_Errhandler *errhandler);
575 #define MPI_Error_string AMPI_Error_string
576 int AMPI_Error_string(int errorcode, char *string, int *resultlen);
577 #define MPI_Error_class AMPI_Error_class
578 int AMPI_Error_class(int errorcode, int *errorclass);
579 #define MPI_Wtime AMPI_Wtime
580 double AMPI_Wtime(void);
581 #define MPI_Wtick AMPI_Wtick
582 double AMPI_Wtick(void);
583 #define MPI_Init AMPI_Init
584 int AMPI_Init(int *argc, char*** argv);
585 #define MPI_Initialized AMPI_Initialized
586 int AMPI_Initialized(int *isInit);
587 #define MPI_Finalize AMPI_Finalize
588 int AMPI_Finalize(void);
589 #define MPI_Finalized AMPI_Finalized
590 int AMPI_Finalized(int *);
591 #define MPI_Abort AMPI_Abort
592 int AMPI_Abort(MPI_Comm comm, int errorcode);
593
594 /*** Profiling ***/
595 /* int AMPI_Pcontrol(const int level, ...); */
596
597 /***extras***/
598 #define MPI_Yield AMPI_Yield
599 int AMPI_Yield(int comm);
600 #define MPI_Resume AMPI_Resume
601 int AMPI_Resume(int dest, int comm);
602 #define MPI_Print AMPI_Print
603 void AMPI_Print(char *str);
604
605 /* for load balancing */
606 #define MPI_Register AMPI_Register
607 int AMPI_Register(void *, MPI_PupFn);
608
609 #define MPI_Start_measure AMPI_Start_measure
610 void AMPI_Start_measure();
611 #define MPI_Stop_measure AMPI_Stop_measure
612 void AMPI_Stop_measure();
613 #define MPI_Set_load AMPI_Set_load
614 void AMPI_Set_load(double load);
615
616 #define MPI_Migrate AMPI_Migrate
617 void AMPI_Migrate(void);
618
619 #define MPI_Evacuate AMPI_Evacuate
620 void AMPI_Evacuate(void);
621
622 #define MPI_Migrateto AMPI_Migrateto
623 void AMPI_Migrateto(int destPE);
624
625 #define MPI_Async_Migrate AMPI_Async_Migrate
626 void AMPI_Async_Migrate(void);
627 #define MPI_Allow_Migrate AMPI_Allow_Migrate
628 void AMPI_Allow_Migrate(void);
629 #define MPI_Setmigratable AMPI_Setmigratable
630 void AMPI_Setmigratable(int comm, int mig);
631 #define MPI_Checkpoint AMPI_Checkpoint
632 void AMPI_Checkpoint(char *dname);
633 #define MPI_MemCheckpoint AMPI_MemCheckpoint
634 void AMPI_MemCheckpoint();
635 #define MPI_Get_userdata AMPI_Get_userdata
636 void *AMPI_Get_userdata(int);
637 #define MPI_Datatype_iscontig AMPI_Datatype_iscontig
638 void AMPI_Datatype_iscontig(MPI_Datatype datatype, int *flag);
639 /*Create a new threads array and attach to it*/
640 typedef void (*MPI_MainFn) (int,char**);
641 #define MPI_Register_main AMPI_Register_main
642 void AMPI_Register_main(MPI_MainFn mainFn, const char *name);
643 /* Execute this shell command (just like "system()") */
644 int AMPI_System(const char *cmd);
645
646 /*** MPI-2 Functions (Unsorted, no Fortran support) ***/
647 #define MPI_Type_get_envelope AMPI_Type_get_envelope
648 int AMPI_Type_get_envelope(MPI_Datatype datatype, int *num_integers, int *num_addresses,
649                           int *num_datatypes, int *combiner);
650 #define MPI_Type_get_contents AMPI_Type_get_contents
651 int AMPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses,
652                           int max_datatypes, int array_of_integers[], MPI_Aint array_of_addresses[],
653                           MPI_Datatype array_of_datatypes[]);
654
655 #if CMK_CUDA
656 typedef struct workRequest workRequest;
657
658 /* AMPI GPU Request interface */
659 int AMPI_GPU_Iinvoke(workRequest *to_call, MPI_Request *request);
660 int AMPI_GPU_Invoke(workRequest *to_call);
661 #endif
662
663 /*********************One sided communication routines *****************/ 
664 /*  MPI_Win : an index into a list in ampiParent (just like MPI_Group) */
665 /* name length for COMM, TYPE and WIN */
666 #define MPI_MAX_OBJECT_NAME 255
667 #define MPI_MAX_INFO_KEY 255
668 #define MPI_MAX_INFO_VAL 1024
669 #define MPI_LOCK_SHARED  54   
670 #define MPI_LOCK_EXCLUSIVE 55
671 #define MPI_WIN_NULL -1
672
673 typedef int MPI_Info;
674 typedef int MPI_Win;
675
676 #define MPI_Win_create AMPI_Win_create
677 int AMPI_Win_create(void *base, MPI_Aint size, int disp_unit,
678                MPI_Info info, MPI_Comm comm, MPI_Win *newwin);
679 #define MPI_Win_free AMPI_Win_free
680 int AMPI_Win_free(MPI_Win *win);
681 #define MPI_Win_delete_attr AMPI_Win_delete_attr
682 int AMPI_Win_delete_attr(MPI_Win win, int key);
683 #define MPI_Win_get_group AMPI_Win_get_group
684 int AMPI_Win_get_group(MPI_Win win, MPI_Group *group);
685 #define MPI_Win_set_name AMPI_Win_set_name
686 int AMPI_Win_set_name(MPI_Win win, char *name);
687 #define MPI_Win_get_name AMPI_Win_get_name
688 int AMPI_Win_get_name(MPI_Win win, char *name, int *length);
689 #define MPI_Win_fence AMPI_Win_fence
690 int AMPI_Win_fence(int assertion, MPI_Win win);
691 #define MPI_Win_lock AMPI_Win_lock
692 int AMPI_Win_lock(int lock_type, int rank, int assert, MPI_Win win);
693 #define MPI_Win_unlock AMPI_Win_unlock
694 int AMPI_Win_unlock(int rank, MPI_Win win);
695 #define MPI_Win_post AMPI_Win_post
696 int AMPI_Win_post(MPI_Group group, int assertion, MPI_Win win);
697 #define MPI_Win_wait AMPI_Win_wait
698 int AMPI_Win_wait(MPI_Win win);
699 #define MPI_Win_start AMPI_Win_start
700 int AMPI_Win_start(MPI_Group group, int assertion, MPI_Win win);
701 #define MPI_Win_complete AMPI_Win_complete
702 int AMPI_Win_complete(MPI_Win win);
703 #define MPI_Alloc_mem AMPI_Alloc_mem
704 int AMPI_Alloc_mem(MPI_Aint size, MPI_Info info, void *baseptr);
705 #define MPI_Free_mem AMPI_Free_mem
706 int AMPI_Free_mem(void *base);
707 #define MPI_Put AMPI_Put
708 int AMPI_Put(void *orgaddr, int orgcnt, MPI_Datatype orgtype, int rank, 
709         MPI_Aint targdisp, int targcnt, MPI_Datatype targtype, MPI_Win win);
710 #define MPI_Get AMPI_Get
711 int AMPI_Get(void *orgaddr, int orgcnt, MPI_Datatype orgtype, int rank, 
712         MPI_Aint targdisp, int targcnt, MPI_Datatype targtype, MPI_Win win);
713 #define MPI_Accumulate AMPI_Accumulate
714 int AMPI_Accumulate(void *orgaddr, int orgcnt, MPI_Datatype orgtype, int rank,
715                    MPI_Aint targdisp, int targcnt, MPI_Datatype targtype,
716                    MPI_Op op, MPI_Win win);
717
718 #define MPI_IGet AMPI_IGet
719 int AMPI_IGet(MPI_Aint orgdisp, int orgcnt, MPI_Datatype orgtype, int rank,
720         MPI_Aint targdisp, int targcnt, MPI_Datatype targtype, MPI_Win win,
721         MPI_Request *request);
722 #define MPI_IGet_Wait AMPI_IGet_Wait
723 int AMPI_IGet_Wait(MPI_Request *request, MPI_Status *status, MPI_Win win);
724 #define MPI_IGet_Free AMPI_IGet_Free
725 int AMPI_IGet_Free(MPI_Request *request, MPI_Status *status, MPI_Win win);
726 char* MPI_IGet_Data(MPI_Status status);
727
728 #define MPI_Info_create AMPI_Info_create
729 int AMPI_Info_create(MPI_Info *info);
730 #define MPI_Info_set AMPI_Info_set
731 int AMPI_Info_set(MPI_Info info, char *key, char *value);
732 #define MPI_Info_delete AMPI_Info_delete
733 int AMPI_Info_delete(MPI_Info info, char *key);
734 #define MPI_Info_get AMPI_Info_get
735 int AMPI_Info_get(MPI_Info info, char *key, int valuelen, char *value, int *flag);
736 #define MPI_Info_get_valuelen AMPI_Info_get_valuelen
737 int AMPI_Info_get_valuelen(MPI_Info info, char *key, int *valuelen, int *flag);
738 #define MPI_Info_get_nkeys AMPI_Info_get_nkeys
739 int AMPI_Info_get_nkeys(MPI_Info info, int *nkeys);
740 #define MPI_Info_get_nthkey AMPI_Info_get_nthkey
741 int AMPI_Info_get_nthkey(MPI_Info info, int n, char *key);
742 #define MPI_Info_dup AMPI_Info_dup
743 int AMPI_Info_dup(MPI_Info info, MPI_Info *newinfo);
744 #define MPI_Info_free AMPI_Info_free
745 int AMPI_Info_free(MPI_Info *info);
746
747 #define MPI_Comm_c2f(comm) (MPI_Fint)(comm)
748 #define MPI_Comm_f2c(comm) (MPI_Comm)(comm)
749 #define MPI_Type_c2f(datatype) (MPI_Fint)(datatype)
750 #define MPI_Type_f2c(datatype) (MPI_Datatype)(datatype)
751 #define MPI_Group_c2f(group) (MPI_Fint)(group)
752 #define MPI_Group_f2c(group) (MPI_Group)(group)
753 #define MPI_Info_c2f(info) (MPI_Fint)(info)
754 #define MPI_Info_f2c(info) (MPI_Info)(info)
755 #define MPI_Request_f2c(request) (MPI_Request)(request)
756 #define MPI_Request_c2f(request) (MPI_Fint)(request)
757 #define MPI_Op_c2f(op) (MPI_Fint)(op)
758 #define MPI_Op_f2c(op) (MPI_Op)(op)
759 #define MPI_Errhandler_c2f(errhandler) (MPI_Fint)(errhandler)
760 #define MPI_Errhandler_f2c(errhandler) (MPI_Errhandler)(errhandler)
761 #define MPI_Win_c2f(win)   (MPI_Fint)(win)
762 #define MPI_Win_f2c(win)   (MPI_Win)(win)
763
764 void AMPI_Install_Idle_Timer();
765 void AMPI_Uninstall_Idle_Timer();
766
767 extern int traceRegisterFunction(const char *name, int idx);
768 extern void traceBeginFuncProj(char *,char *,int);
769 extern void traceEndFuncProj(char *);
770 extern void traceBeginFuncIndexProj(int, char *, int);
771 extern void traceEndFuncIndexProj(int);
772
773 #if CMK_BIGSIM_CHARM
774 #define MPI_Set_startevent AMPI_Set_startevent
775 int AMPI_Set_startevent(MPI_Comm comm);
776 #endif
777
778 /* Determine approximate depth of stack at the point of this call */
779 extern long ampiCurrentStackUsage();
780
781
782 /*
783 #define TRACEFUNC(code,name) traceBeginFuncProj(name,__FILE__,__LINE__); \
784 code;\
785 traceEndFuncProj(name);
786 #define REGISTER_FUNCTION(x) traceRegisterFunction(x, -999);
787 #define REG_FUNC_WITHID(x, id) traceRegisterFunction(x, id);
788 */
789
790 #define _TRACE_REGISTER_FUNCTION_ID(x, id) traceRegisterFunction(x, id);
791 #define _TRACE_BEGIN_FUNCTION_ID(id) traceBeginFuncIndexProj(id, __FILE__, __LINE__);
792 #define _TRACE_END_FUNCTION_ID(id) traceEndFuncIndexProj(id);
793
794 #define _TRACE_REGISTER_FUNCTION_NAME(x) traceRegisterFunction(x, -999);
795 #define _TRACE_BEGIN_FUNCTION_NAME(name) traceBeginFuncProj(name, __FILE__, __LINE__);
796 #define _TRACE_END_FUNCTION_NAME(name) traceEndFuncProj(name);
797
798 void beginTraceBigSim(char* msg);
799 void endTraceBigSim(char* msg, char* param);
800
801 #include "ampiProjections.h"
802 #ifdef __cplusplus
803 }
804 #endif
805
806 #endif
807