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