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