forked from 1100110/OpenMPI
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathpackage.d.in
More file actions
2530 lines (2434 loc) · 119 KB
/
package.d.in
File metadata and controls
2530 lines (2434 loc) · 119 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2013 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2007-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2008-2009 Sun Microsystems, Inc. All rights reserved.
* Copyright (c) 2009-2012 Oak Rigde National Laboratory. All rights reserved.
* Copyright (c) 2011 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2012-2014 Los Alamos Nat Security, LLC. All rights reserved.
* Copyright (c) 2011-2013 INRIA. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
module mpi;
import core.stdc.config;
extern (C):
nothrow @nogc:
// BEGIN AUTO
// END AUTO
enum OPEN_MPI = 1;
/*
* To accomodate programs written for MPI implementations that use a
* straight ROMIO import
*/
static if(OMPI_PROVIDE_MPI_FILE_INTERFACE)
{
alias MPIO_Request = MPI_Request;
alias MPIO_Test = MPI_Test;
alias MPIO_Wait = MPI_Wait;
}
/*
* When initializing global pointers to Open MPI internally-defined
* structs, some compilers warn about type-punning to incomplete
* types. Therefore, when full struct definitions are unavailable
* (when not building Open MPI), cast to an opaque (void *) pointer to
* disable any strict-aliasing optimizations. Don't cast to (void *)
* when building Open MPI so that we actually get the benefit of type
* checking (because we *do* have the full type definitions available
* when building OMPI).
*/
//#if !OMPI_BUILDING
//#define OMPI_PREDEFINED_GLOBAL(type, global) ((type) ((void *) &(global)))
//#else
//#define OMPI_PREDEFINED_GLOBAL(type, global) ((type) &(global))
//#endif
To OMPI_PREDEFINED_GLOBAL(To, alias global)()
{
return cast(To)&global;
}
/*
* MPI_Status
*/
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
{
struct ompi_status_public_t {
int MPI_SOURCE;
int MPI_TAG;
int MPI_ERROR;
int _count;
int _cancelled;
}
}
else
{
struct ompi_status_public_t {
/* These fields are publicly defined in the MPI specification.
User applications may freely read from these fields. */
int MPI_SOURCE;
int MPI_TAG;
int MPI_ERROR;
/* The following two fields are internal to the Open MPI
implementation and should not be accessed by MPI applications.
They are subject to change at any time. These are not the
droids you're looking for. */
private
{
int _cancelled;
size_t _ucount;
}
}
}
/*
* Typedefs (aliases)
*/
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
alias MPI_Aint = OMPI_PTRDIFF_TYPE;
else
alias MPI_Aint = OPAL_PTRDIFF_TYPE;
alias MPI_Offset = OMPI_MPI_OFFSET_TYPE;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
alias MPI_Count = OMPI_MPI_COUNT_TYPE;
struct ompi_communicator_t;
struct ompi_datatype_t;
struct ompi_errhandler_t;
static if(OMPI_PROVIDE_MPI_FILE_INTERFACE)
struct ompi_file_t;
struct ompi_group_t;
struct ompi_info_t;
struct ompi_op_t;
struct ompi_request_t;
struct ompi_message_t;
//struct ompi_status_public_t;
struct ompi_win_t;
struct mca_base_var_enum_t;
struct ompi_mpit_cvar_handle_t;
struct mca_base_pvar_handle_t;
struct mca_base_pvar_session_t;
alias MPI_Comm = ompi_communicator_t*;
alias MPI_Datatype = ompi_datatype_t*;
alias MPI_Errhandler = ompi_errhandler_t*;
static if(OMPI_PROVIDE_MPI_FILE_INTERFACE)
alias MPI_File = ompi_file_t*;
alias MPI_Group = ompi_group_t*;
alias MPI_Info = ompi_info_t*;
alias MPI_Op = ompi_op_t*;
alias MPI_Request = ompi_request_t*;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
alias MPI_Message = ompi_message_t*;
alias MPI_Status = ompi_status_public_t;
alias MPI_Win = ompi_win_t*;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
{
alias MPI_T_enum = mca_base_var_enum_t*;
alias MPI_T_cvar_handle = ompi_mpit_cvar_handle_t*;
alias MPI_T_pvar_handle = mca_base_pvar_handle_t*;
alias MPI_T_pvar_session = mca_base_pvar_session_t*;
}
/*
* User typedefs
*/
alias MPI_Copy_function = int function(MPI_Comm, int, void *, void *, void *, int *);
alias MPI_Delete_function = int function(MPI_Comm, int, void *, void *);
alias MPI_Datarep_extent_function = int function(MPI_Datatype, MPI_Aint *, void *);
alias MPI_Datarep_conversion_function = int function(void *, MPI_Datatype, int, void *, MPI_Offset, void *);
alias MPI_Comm_errhandler_function = void function(MPI_Comm *, int *, ...);
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
alias MPI_Comm_errhandler_fn = MPI_Comm_errhandler_function;
else
deprecated alias MPI_Comm_errhandler_fn = MPI_Comm_errhandler_function;
/* This is a little hackish, but errhandler.h needs space for a
MPI_File_errhandler_fn. While it could just be removed, this
allows us to maintain a stable ABI within OMPI, at least for
apps that don't use MPI I/O. */
static if(OMPI_PROVIDE_MPI_FILE_INTERFACE)
{
alias ompi_file_errhandler_fn = void function(MPI_File *, int *, ...);
alias MPI_File_errhandler_function = ompi_file_errhandler_fn;
}
else
{
struct ompi_file_t;
alias ompi_file_errhandler_fn = void function(ompi_file_t**, int*, ...);
}
alias MPI_Win_errhandler_function = void function(MPI_Win*, int*, ...);
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
alias MPI_Win_errhandler_fn = MPI_Win_errhandler_function;
else
deprecated alias MPI_Win_errhandler_fn = MPI_Win_errhandler_function;
alias MPI_Handler_function = void function(MPI_Comm *, int *, ...);
alias MPI_User_function = void function(void*, void*, int*, MPI_Datatype*);
alias MPI_Comm_copy_attr_function = int function(MPI_Comm, int, void *, void *, void *, int *);
alias MPI_Comm_delete_attr_function = int function(MPI_Comm, int, void *, void *);
alias MPI_Type_copy_attr_function = int function(MPI_Datatype, int, void *, void *, void *, int *);
alias MPI_Type_delete_attr_function = int function(MPI_Datatype, int, void *, void *);
alias MPI_Win_copy_attr_function = int function(MPI_Win, int, void *, void *, void *, int *);
alias MPI_Win_delete_attr_function = int function(MPI_Win, int, void *, void *);
alias MPI_Grequest_query_function = int function(void *, MPI_Status *);
alias MPI_Grequest_free_function = int function(void *);
alias MPI_Grequest_cancel_function = int function(void *, int);
/*
* Miscellaneous constants
*/
enum MPI_ANY_SOURCE = -1; /* match any source rank */
enum MPI_PROC_NULL = -2; /* rank of null process */
enum MPI_ROOT = -4; /* special value for intercomms */
enum MPI_ANY_TAG = -1; /* match any message tag */
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
{
enum MPI_MAX_PROCESSOR_NAME = 256; /* max proc. name length */
enum MPI_MAX_ERROR_STRING = 256; /* max error message length */
enum MPI_MAX_OBJECT_NAME = 64; /* max object name length */
}
else
{
enum MPI_MAX_PROCESSOR_NAME = OPAL_MAX_PROCESSOR_NAME; /* max proc. name length */
enum MPI_MAX_ERROR_STRING = OPAL_MAX_ERROR_STRING; /* max error message length */
enum MPI_MAX_OBJECT_NAME = OPAL_MAX_OBJECT_NAME; /* max object name length */
}
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
enum MPI_MAX_LIBRARY_VERSION_STRING = 256; /* max length of library version string */
enum MPI_UNDEFINED = -32766; /* undefined stuff */
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
enum MPI_DIST_GRAPH = 3;
enum MPI_CART = 1; /* cartesian topology */
enum MPI_GRAPH = 2; /* graph topology */
enum MPI_KEYVAL_INVALID = -1; /* invalid key value */
/*
* More constants
*/
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
{
enum MPI_UNWEIGHTED = cast(void*) 2; /* unweighted graph */
enum MPI_WEIGHTS_EMPTY = cast(void*) 3; /* empty weights */
}
enum MPI_BOTTOM = cast(void*) 0; /* base reference address */
enum MPI_IN_PLACE = cast(void*) 1; /* in place buffer */
enum MPI_BSEND_OVERHEAD = 128; /* size of bsend header + ptr */
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
{
enum MPI_MAX_INFO_KEY = 36; /* max info key length */
enum MPI_MAX_INFO_VAL = 256; /* max info value length */
}
else
{
enum MPI_MAX_INFO_KEY = OPAL_MAX_INFO_KEY; /* max info key length */
enum MPI_MAX_INFO_VAL = OPAL_MAX_INFO_VAL; /* max info value length */
}
enum MPI_ARGV_NULL = cast(char**) 0; /* NULL argument vector */
enum MPI_ARGVS_NULL = cast(char***) 0; /* NULL argument vectors */
enum MPI_ERRCODES_IGNORE = cast(int*) 0; /* don't return error codes */
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
enum MPI_MAX_PORT_NAME = 1024;
else
enum MPI_MAX_PORT_NAME = OPAL_MAX_PORT_NAME; /* max port name length */
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 8)
enum MPI_MAX_NAME_LEN = MPI_MAX_PORT_NAME;
enum MPI_ORDER_C = 0; /* C row major order */
enum MPI_ORDER_FORTRAN = 1; /* Fortran column major order */
enum MPI_DISTRIBUTE_BLOCK = 0; /* block distribution */
enum MPI_DISTRIBUTE_CYCLIC = 1; /* cyclic distribution */
enum MPI_DISTRIBUTE_NONE = 2; /* not distributed */
enum MPI_DISTRIBUTE_DFLT_DARG = -1; /* default distribution arg */
static if(OMPI_PROVIDE_MPI_FILE_INTERFACE)
{
/*
* Since these values are arbitrary to Open MPI; we might as well make
* them the same as ROMIO for ease of mapping. These values taken
* from ROMIO's mpio.h file.
*/
enum MPI_MODE_CREATE = 1; /* ADIO_CREATE */
enum MPI_MODE_RDONLY = 2; /* ADIO_RDONLY */
enum MPI_MODE_WRONLY = 4; /* ADIO_WRONLY */
enum MPI_MODE_RDWR = 8; /* ADIO_RDWR */
enum MPI_MODE_DELETE_ON_CLOSE = 16; /* ADIO_DELETE_ON_CLOSE */
enum MPI_MODE_UNIQUE_OPEN = 32; /* ADIO_UNIQUE_OPEN */
enum MPI_MODE_EXCL = 64; /* ADIO_EXCL */
enum MPI_MODE_APPEND = 128; /* ADIO_APPEND */
enum MPI_MODE_SEQUENTIAL = 256; /* ADIO_SEQUENTIAL */
enum MPI_DISPLACEMENT_CURRENT = -54278278;
enum MPI_SEEK_SET = 600;
enum MPI_SEEK_CUR = 602;
enum MPI_SEEK_END = 604;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
enum MPI_MAX_DATAREP_STRING = 128;
else
enum MPI_MAX_DATAREP_STRING = OPAL_MAX_DATAREP_STRING;
}
/*
* MPI-2 One-Sided Communications asserts
*/
enum MPI_MODE_NOCHECK = 1;
enum MPI_MODE_NOPRECEDE = 2;
enum MPI_MODE_NOPUT = 4;
enum MPI_MODE_NOSTORE = 8;
enum MPI_MODE_NOSUCCEED = 16;
enum MPI_LOCK_EXCLUSIVE = 1;
enum MPI_LOCK_SHARED = 2;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
{
enum MPI_WIN_FLAVOR_CREATE = 1;
enum MPI_WIN_FLAVOR_ALLOCATE = 2;
enum MPI_WIN_FLAVOR_DYNAMIC = 3;
enum MPI_WIN_FLAVOR_SHARED = 4;
enum MPI_WIN_UNIFIED = 0;
enum MPI_WIN_SEPARATE = 1;
}
/*
* Predefined attribute keyvals
*
* DO NOT CHANGE THE ORDER WITHOUT ALSO CHANGING THE ORDER IN
* src/attribute/attribute_predefined.c and mpif.h.in.
*/
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
enum {
/* MPI-1 */
MPI_TAG_UB,
MPI_HOST,
MPI_IO,
MPI_WTIME_IS_GLOBAL,
/* MPI-2 */
MPI_APPNUM,
MPI_LASTUSEDCODE,
MPI_UNIVERSE_SIZE,
MPI_WIN_BASE,
MPI_WIN_SIZE,
MPI_WIN_DISP_UNIT,
MPI_WIN_CREATE_FLAVOR,
MPI_WIN_MODEL,
/* Even though these four are IMPI attributes, they need to be there
for all MPI jobs */
IMPI_CLIENT_SIZE,
IMPI_CLIENT_COLOR,
IMPI_HOST_SIZE,
IMPI_HOST_COLOR
}
else enum {
/* MPI-1 */
MPI_TAG_UB,
MPI_HOST,
MPI_IO,
MPI_WTIME_IS_GLOBAL,
/* MPI-2 */
MPI_APPNUM,
MPI_LASTUSEDCODE,
MPI_UNIVERSE_SIZE,
MPI_WIN_BASE,
MPI_WIN_SIZE,
MPI_WIN_DISP_UNIT,
/* Even though these four are IMPI attributes, they need to be there
for all MPI jobs */
IMPI_CLIENT_SIZE,
IMPI_CLIENT_COLOR,
IMPI_HOST_SIZE,
IMPI_HOST_COLOR
}
/*
* Error classes and codes
* Do not change the values of these without also modifying mpif.h.in.
*/
enum MPI_SUCCESS = 0;
enum MPI_ERR_BUFFER = 1;
enum MPI_ERR_COUNT = 2;
enum MPI_ERR_TYPE = 3;
enum MPI_ERR_TAG = 4;
enum MPI_ERR_COMM = 5;
enum MPI_ERR_RANK = 6;
enum MPI_ERR_REQUEST = 7;
enum MPI_ERR_ROOT = 8;
enum MPI_ERR_GROUP = 9;
enum MPI_ERR_OP = 10;
enum MPI_ERR_TOPOLOGY = 11;
enum MPI_ERR_DIMS = 12;
enum MPI_ERR_ARG = 13;
enum MPI_ERR_UNKNOWN = 14;
enum MPI_ERR_TRUNCATE = 15;
enum MPI_ERR_OTHER = 16;
enum MPI_ERR_INTERN = 17;
enum MPI_ERR_IN_STATUS = 18;
enum MPI_ERR_PENDING = 19;
enum MPI_ERR_ACCESS = 20;
enum MPI_ERR_AMODE = 21;
enum MPI_ERR_ASSERT = 22;
enum MPI_ERR_BAD_FILE = 23;
enum MPI_ERR_BASE = 24;
enum MPI_ERR_CONVERSION = 25;
enum MPI_ERR_DISP = 26;
enum MPI_ERR_DUP_DATAREP = 27;
enum MPI_ERR_FILE_EXISTS = 28;
enum MPI_ERR_FILE_IN_USE = 29;
enum MPI_ERR_FILE = 30;
enum MPI_ERR_INFO_KEY = 31;
enum MPI_ERR_INFO_NOKEY = 32;
enum MPI_ERR_INFO_VALUE = 33;
enum MPI_ERR_INFO = 34;
enum MPI_ERR_IO = 35;
enum MPI_ERR_KEYVAL = 36;
enum MPI_ERR_LOCKTYPE = 37;
enum MPI_ERR_NAME = 38;
enum MPI_ERR_NO_MEM = 39;
enum MPI_ERR_NOT_SAME = 40;
enum MPI_ERR_NO_SPACE = 41;
enum MPI_ERR_NO_SUCH_FILE = 42;
enum MPI_ERR_PORT = 43;
enum MPI_ERR_QUOTA = 44;
enum MPI_ERR_READ_ONLY = 45;
enum MPI_ERR_RMA_CONFLICT = 46;
enum MPI_ERR_RMA_SYNC = 47;
enum MPI_ERR_SERVICE = 48;
enum MPI_ERR_SIZE = 49;
enum MPI_ERR_SPAWN = 50;
enum MPI_ERR_UNSUPPORTED_DATAREP = 51;
enum MPI_ERR_UNSUPPORTED_OPERATION = 52;
enum MPI_ERR_WIN = 53;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
{
enum MPI_T_ERR_MEMORY = 54;
enum MPI_T_ERR_NOT_INITIALIZED = 55;
enum MPI_T_ERR_CANNOT_INIT = 56;
enum MPI_T_ERR_INVALID_INDEX = 57;
enum MPI_T_ERR_INVALID_ITEM = 58;
enum MPI_T_ERR_INVALID_HANDLE = 59;
enum MPI_T_ERR_OUT_OF_HANDLES = 60;
enum MPI_T_ERR_OUT_OF_SESSIONS = 61;
enum MPI_T_ERR_INVALID_SESSION = 62;
enum MPI_T_ERR_CVAR_SET_NOT_NOW = 63;
enum MPI_T_ERR_CVAR_SET_NEVER = 64;
enum MPI_T_ERR_PVAR_NO_STARTSTOP = 65;
enum MPI_T_ERR_PVAR_NO_WRITE = 66;
enum MPI_T_ERR_PVAR_NO_ATOMIC = 67;
enum MPI_ERR_RMA_RANGE = 68;
enum MPI_ERR_RMA_ATTACH = 69;
enum MPI_ERR_RMA_FLAVOR = 70;
enum MPI_ERR_RMA_SHARED = 71;
/* for 1.8 these intentially overlap other error codes because MPI_ERR_LASTCODE
can not be changed in a release series*/
enum MPI_T_ERR_INVALID = 70;
enum MPI_T_ERR_INVALID_NAME = 71;
/* Per MPI-3 p349 47, MPI_ERR_LASTCODE must be >= the last predefined
MPI_ERR_<foo> code. So just set it equal to the last code --
MPI_ERR_RMA_SHARED, in this case. */
enum MPI_ERR_LASTCODE = MPI_ERR_RMA_SHARED;
}
else static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION <= 8)
enum MPI_ERR_LASTCODE = 54;
enum MPI_ERR_SYSRESOURCE = -2;
/*
* Comparison results. Don't change the order of these, the group
* comparison functions rely on it.
* Do not change the order of these without also modifying mpif.h.in.
*/
enum
{
MPI_IDENT,
MPI_CONGRUENT,
MPI_SIMILAR,
MPI_UNEQUAL
}
/*
* MPI_Init_thread constants
* Do not change the order of these without also modifying mpif.h.in.
*/
enum
{
MPI_THREAD_SINGLE,
MPI_THREAD_FUNNELED,
MPI_THREAD_SERIALIZED,
MPI_THREAD_MULTIPLE
}
/*
* Datatype combiners.
* Do not change the order of these without also modifying mpif.h.in.
*/
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
enum
{
MPI_COMBINER_NAMED,
MPI_COMBINER_DUP,
MPI_COMBINER_CONTIGUOUS,
MPI_COMBINER_VECTOR,
MPI_COMBINER_HVECTOR_INTEGER,
MPI_COMBINER_HVECTOR,
MPI_COMBINER_INDEXED,
MPI_COMBINER_HINDEXED_INTEGER,
MPI_COMBINER_HINDEXED,
MPI_COMBINER_INDEXED_BLOCK,
MPI_COMBINER_STRUCT_INTEGER,
MPI_COMBINER_STRUCT,
MPI_COMBINER_SUBARRAY,
MPI_COMBINER_DARRAY,
MPI_COMBINER_F90_REAL,
MPI_COMBINER_F90_COMPLEX,
MPI_COMBINER_F90_INTEGER,
MPI_COMBINER_RESIZED,
MPI_COMBINER_HINDEXED_BLOCK
}
else enum
{
MPI_COMBINER_NAMED,
MPI_COMBINER_DUP,
MPI_COMBINER_CONTIGUOUS,
MPI_COMBINER_VECTOR,
MPI_COMBINER_HVECTOR_INTEGER,
MPI_COMBINER_HVECTOR,
MPI_COMBINER_INDEXED,
MPI_COMBINER_HINDEXED_INTEGER,
MPI_COMBINER_HINDEXED,
MPI_COMBINER_INDEXED_BLOCK,
MPI_COMBINER_STRUCT_INTEGER,
MPI_COMBINER_STRUCT,
MPI_COMBINER_SUBARRAY,
MPI_COMBINER_DARRAY,
MPI_COMBINER_F90_REAL,
MPI_COMBINER_F90_COMPLEX,
MPI_COMBINER_F90_INTEGER,
MPI_COMBINER_RESIZED,
}
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
{
/*
* Communicator split type constants.
* Do not change the order of these without also modifying mpif.h.in
* (see also mpif-common.h.fin).
*/
enum {
MPI_COMM_TYPE_SHARED
}
/*
* MPIT Verbosity Levels
*/
enum {
MPI_T_VERBOSITY_USER_BASIC,
MPI_T_VERBOSITY_USER_DETAIL,
MPI_T_VERBOSITY_USER_ALL,
MPI_T_VERBOSITY_TUNER_BASIC,
MPI_T_VERBOSITY_TUNER_DETAIL,
MPI_T_VERBOSITY_TUNER_ALL,
MPI_T_VERBOSITY_MPIDEV_BASIC,
MPI_T_VERBOSITY_MPIDEV_DETAIL,
MPI_T_VERBOSITY_MPIDEV_ALL
}
/*
* MPIT Scopes
*/
enum {
MPI_T_SCOPE_CONSTANT,
MPI_T_SCOPE_READONLY,
MPI_T_SCOPE_LOCAL,
MPI_T_SCOPE_GROUP,
MPI_T_SCOPE_GROUP_EQ,
MPI_T_SCOPE_ALL,
MPI_T_SCOPE_ALL_EQ
}
/*
* MPIT Object Binding
*/
enum {
MPI_T_BIND_NO_OBJECT,
MPI_T_BIND_MPI_COMM,
MPI_T_BIND_MPI_DATATYPE,
MPI_T_BIND_MPI_ERRHANDLER,
MPI_T_BIND_MPI_FILE,
MPI_T_BIND_MPI_GROUP,
MPI_T_BIND_MPI_OP,
MPI_T_BIND_MPI_REQUEST,
MPI_T_BIND_MPI_WIN,
MPI_T_BIND_MPI_MESSAGE,
MPI_T_BIND_MPI_INFO
}
/*
* MPIT pvar classes
*/
enum {
MPI_T_PVAR_CLASS_STATE,
MPI_T_PVAR_CLASS_LEVEL,
MPI_T_PVAR_CLASS_SIZE,
MPI_T_PVAR_CLASS_PERCENTAGE,
MPI_T_PVAR_CLASS_HIGHWATERMARK,
MPI_T_PVAR_CLASS_LOWWATERMARK,
MPI_T_PVAR_CLASS_COUNTER,
MPI_T_PVAR_CLASS_AGGREGATE,
MPI_T_PVAR_CLASS_TIMER,
MPI_T_PVAR_CLASS_GENERIC
}
}//MPI 1.8+
/*
* NULL handles
*/
alias MPI_GROUP_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Group, ompi_mpi_group_null);
alias MPI_COMM_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Comm, ompi_mpi_comm_null);
alias MPI_REQUEST_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Request, ompi_request_null);
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
alias MPI_MESSAGE_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Message, ompi_message_null);
alias MPI_OP_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_null);
alias MPI_ERRHANDLER_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Errhandler, ompi_mpi_errhandler_null);
alias MPI_INFO_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Info, ompi_mpi_info_null);
alias MPI_WIN_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Win, ompi_mpi_win_null);
static if(OMPI_PROVIDE_MPI_FILE_INTERFACE)
{
alias MPI_FILE_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_File, ompi_mpi_file_null);
}
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
{
enum MPI_T_ENUM_NULL = cast(MPI_T_enum) null;
/*
* MPI_INFO_ENV handle
*/
alias MPI_INFO_ENV = OMPI_PREDEFINED_GLOBAL!(MPI_Info, ompi_mpi_info_env);
}
enum MPI_STATUS_IGNORE = cast(MPI_Status*) 0;
enum MPI_STATUSES_IGNORE = cast(MPI_Status*) 0;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
{
/*
* Special MPI_T handles
*/
enum MPI_T_PVAR_ALL_HANDLES = cast(MPI_T_pvar_handle) -1;
enum MPI_T_PVAR_HANDLE_NULL = cast(MPI_T_pvar_handle) 0;
enum MPI_T_CVAR_HANDLE_NULL = cast(MPI_T_cvar_handle) 0;
}
/* MPI-2 specifies that the name "MPI_TYPE_NULL_DELETE_FN" (and all
related friends) must be accessible in C, C++, and Fortran. This is
unworkable if the back-end Fortran compiler uses all caps for its
linker symbol convention -- it results in two functions with
different signatures that have the same name (i.e., both C and
Fortran use the symbol MPI_TYPE_NULL_DELETE_FN). So we have to
#define the C names to be something else, so that they names are
*accessed* through MPI_TYPE_NULL_DELETE_FN, but their actual symbol
name is different.
However, this file is included when the fortran wrapper functions
are compiled in Open MPI, so we do *not* want these #defines in
this case (i.e., we need the Fortran wrapper function to be
compiled as MPI_TYPE_NULL_DELETE_FN). So add some #if kinds of
protection for this case. */
static if ((OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8
&& !is(typeof(OMPI_COMPILING_FORTRAN_WRAPPERS)))
||
(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 8
&& !is(typeof(OMPI_COMPILING_F77_WRAPPERS))))
{
alias MPI_NULL_DELETE_FN = OMPI_C_MPI_NULL_DELETE_FN;
alias MPI_NULL_COPY_FN = OMPI_C_MPI_NULL_COPY_FN;
alias MPI_DUP_FN = OMPI_C_MPI_DUP_FN;
alias MPI_TYPE_NULL_DELETE_FN = OMPI_C_MPI_TYPE_NULL_DELETE_FN;
alias MPI_TYPE_NULL_COPY_FN = OMPI_C_MPI_TYPE_NULL_COPY_FN;
alias MPI_TYPE_DUP_FN = OMPI_C_MPI_TYPE_DUP_FN;
alias MPI_COMM_NULL_DELETE_FN = OMPI_C_MPI_COMM_NULL_DELETE_FN;
alias MPI_COMM_NULL_COPY_FN = OMPI_C_MPI_COMM_NULL_COPY_FN;
alias MPI_COMM_DUP_FN = OMPI_C_MPI_COMM_DUP_FN;
alias MPI_WIN_NULL_DELETE_FN = OMPI_C_MPI_WIN_NULL_DELETE_FN;
alias MPI_WIN_NULL_COPY_FN = OMPI_C_MPI_WIN_NULL_COPY_FN;
alias MPI_WIN_DUP_FN = OMPI_C_MPI_WIN_DUP_FN;
/* MPI_CONVERSION_FN_NULL is a sentinel value, but it has to be large
enough to be the same size as a valid function pointer. It
therefore shares many characteristics between Fortran constants and
Fortran sentinel functions. For example, it shares the problem of
having Fortran compilers have all-caps versions of the symbols that
must be able to be present, and therefore has to be in this
conditional block in mpi.h. */
enum MPI_CONVERSION_FN_NULL = cast(MPI_Datarep_conversion_function*) 0;
}
else
{
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
enum _TEST_ = OMPI_COMPILING_FORTRAN_WRAPPERS;
else static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 8)
enum _TEST_ = OMPI_COMPILING_F77_WRAPPERS;
}
int OMPI_C_MPI_TYPE_NULL_DELETE_FN( MPI_Datatype datatype,
int type_keyval,
void* attribute_val_out,
void* extra_state );
int OMPI_C_MPI_TYPE_NULL_COPY_FN( MPI_Datatype datatype,
int type_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
int OMPI_C_MPI_TYPE_DUP_FN( MPI_Datatype datatype,
int type_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
int OMPI_C_MPI_COMM_NULL_DELETE_FN( MPI_Comm comm,
int comm_keyval,
void* attribute_val_out,
void* extra_state );
int OMPI_C_MPI_COMM_NULL_COPY_FN( MPI_Comm comm,
int comm_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
int OMPI_C_MPI_COMM_DUP_FN( MPI_Comm comm, int comm_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
int OMPI_C_MPI_NULL_DELETE_FN( MPI_Comm comm, int comm_keyval,
void* attribute_val_out,
void* extra_state );
int OMPI_C_MPI_NULL_COPY_FN( MPI_Comm comm, int comm_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
int OMPI_C_MPI_DUP_FN( MPI_Comm comm, int comm_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
int OMPI_C_MPI_WIN_NULL_DELETE_FN( MPI_Win window,
int win_keyval,
void* attribute_val_out,
void* extra_state );
int OMPI_C_MPI_WIN_NULL_COPY_FN( MPI_Win window, int win_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
int OMPI_C_MPI_WIN_DUP_FN( MPI_Win window, int win_keyval,
void* extra_state,
void* attribute_val_in,
void* attribute_val_out,
int* flag );
/*
* External variables
*
* The below externs use the ompi_predefined_xxx_t structures to maintain
* back compatibility between MPI library versions.
* See ompi/communicator/communicator.h comments with struct ompi_communicator_t
* for full explanation why we chose to use the ompi_predefined_xxx_t structure.
*/
extern __gshared
{
struct ompi_predefined_communicator_t {}
ompi_predefined_communicator_t ompi_mpi_comm_world;
ompi_predefined_communicator_t ompi_mpi_comm_self;
ompi_predefined_communicator_t ompi_mpi_comm_null;
struct ompi_predefined_group_t {}
ompi_predefined_group_t ompi_mpi_group_empty;
ompi_predefined_group_t ompi_mpi_group_null;
struct ompi_predefined_request_t {}
ompi_predefined_request_t ompi_request_null;
//unecessary and triggers a dmd out-of-order bug
//static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
//{
struct ompi_predefined_message_t {}
ompi_predefined_message_t ompi_message_null;
ompi_predefined_message_t ompi_message_no_proc;
//}
struct ompi_predefined_op_t {}
ompi_predefined_op_t ompi_mpi_op_null;
ompi_predefined_op_t ompi_mpi_op_min;
ompi_predefined_op_t ompi_mpi_op_max;
ompi_predefined_op_t ompi_mpi_op_sum;
ompi_predefined_op_t ompi_mpi_op_prod;
ompi_predefined_op_t ompi_mpi_op_land;
ompi_predefined_op_t ompi_mpi_op_band;
ompi_predefined_op_t ompi_mpi_op_lor;
ompi_predefined_op_t ompi_mpi_op_bor;
ompi_predefined_op_t ompi_mpi_op_lxor;
ompi_predefined_op_t ompi_mpi_op_bxor;
ompi_predefined_op_t ompi_mpi_op_maxloc;
ompi_predefined_op_t ompi_mpi_op_minloc;
ompi_predefined_op_t ompi_mpi_op_replace;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
ompi_predefined_op_t ompi_mpi_op_no_op;
struct ompi_predefined_datatype_t {}
ompi_predefined_datatype_t ompi_mpi_datatype_null;
ompi_predefined_datatype_t ompi_mpi_lb;
ompi_predefined_datatype_t ompi_mpi_ub;
ompi_predefined_datatype_t ompi_mpi_char;
ompi_predefined_datatype_t ompi_mpi_signed_char;
ompi_predefined_datatype_t ompi_mpi_unsigned_char;
ompi_predefined_datatype_t ompi_mpi_byte;
ompi_predefined_datatype_t ompi_mpi_short;
ompi_predefined_datatype_t ompi_mpi_unsigned_short;
ompi_predefined_datatype_t ompi_mpi_int;
ompi_predefined_datatype_t ompi_mpi_unsigned;
ompi_predefined_datatype_t ompi_mpi_long;
ompi_predefined_datatype_t ompi_mpi_unsigned_long;
ompi_predefined_datatype_t ompi_mpi_long_long_int;
ompi_predefined_datatype_t ompi_mpi_unsigned_long_long;
ompi_predefined_datatype_t ompi_mpi_float;
ompi_predefined_datatype_t ompi_mpi_double;
ompi_predefined_datatype_t ompi_mpi_long_double;
ompi_predefined_datatype_t ompi_mpi_wchar;
ompi_predefined_datatype_t ompi_mpi_packed;
/*
* Following are the C++/C99 datatypes
*/
ompi_predefined_datatype_t ompi_mpi_cxx_bool;
ompi_predefined_datatype_t ompi_mpi_cxx_cplex;
ompi_predefined_datatype_t ompi_mpi_cxx_dblcplex;
ompi_predefined_datatype_t ompi_mpi_cxx_ldblcplex;
/*
* Following are the Fortran datatypes
*/
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6
&& OMPI_HAVE_FORTRAN_LOGICAL1)
ompi_predefined_datatype_t ompi_mpi_logic;
else
ompi_predefined_datatype_t ompi_mpi_logical;
ompi_predefined_datatype_t ompi_mpi_character;
ompi_predefined_datatype_t ompi_mpi_integer;
ompi_predefined_datatype_t ompi_mpi_real;
ompi_predefined_datatype_t ompi_mpi_dblprec;
ompi_predefined_datatype_t ompi_mpi_cplex;
ompi_predefined_datatype_t ompi_mpi_dblcplex;
ompi_predefined_datatype_t ompi_mpi_ldblcplex;
/* Aggregate struct datatypes are not const */
ompi_predefined_datatype_t ompi_mpi_2int;
ompi_predefined_datatype_t ompi_mpi_2integer;
ompi_predefined_datatype_t ompi_mpi_2real;
ompi_predefined_datatype_t ompi_mpi_2dblprec;
ompi_predefined_datatype_t ompi_mpi_2cplex;
ompi_predefined_datatype_t ompi_mpi_2dblcplex;
ompi_predefined_datatype_t ompi_mpi_float_int;
ompi_predefined_datatype_t ompi_mpi_double_int;
ompi_predefined_datatype_t ompi_mpi_longdbl_int;
ompi_predefined_datatype_t ompi_mpi_short_int;
ompi_predefined_datatype_t ompi_mpi_long_int;
//OpenMPI used to version these based on OMPI_HAVE_FORTRAN_LOGICALx,
//but it doesn't matter, the actual MPI_LOGICALx symbols are versioned
//and nothing is emitted for unused extern variables
/* Optional MPI2 datatypes, always declared and defined, but not "exported" as MPI_LOGICAL1 */
ompi_predefined_datatype_t ompi_mpi_logical1;
ompi_predefined_datatype_t ompi_mpi_logical2;
ompi_predefined_datatype_t ompi_mpi_logical4;
ompi_predefined_datatype_t ompi_mpi_logical8;
ompi_predefined_datatype_t ompi_mpi_integer1;
ompi_predefined_datatype_t ompi_mpi_integer2;
ompi_predefined_datatype_t ompi_mpi_integer4;
ompi_predefined_datatype_t ompi_mpi_integer8;
ompi_predefined_datatype_t ompi_mpi_integer16;
ompi_predefined_datatype_t ompi_mpi_real2;
ompi_predefined_datatype_t ompi_mpi_real4;
ompi_predefined_datatype_t ompi_mpi_real8;
ompi_predefined_datatype_t ompi_mpi_real16;
ompi_predefined_datatype_t ompi_mpi_complex8;
ompi_predefined_datatype_t ompi_mpi_complex16;
ompi_predefined_datatype_t ompi_mpi_complex32;
/* New datatypes from the MPI 2.2 standard */
ompi_predefined_datatype_t ompi_mpi_int8_t;
ompi_predefined_datatype_t ompi_mpi_uint8_t;
ompi_predefined_datatype_t ompi_mpi_int16_t;
ompi_predefined_datatype_t ompi_mpi_uint16_t;
ompi_predefined_datatype_t ompi_mpi_int32_t;
ompi_predefined_datatype_t ompi_mpi_uint32_t;
ompi_predefined_datatype_t ompi_mpi_int64_t;
ompi_predefined_datatype_t ompi_mpi_uint64_t;
ompi_predefined_datatype_t ompi_mpi_aint;
ompi_predefined_datatype_t ompi_mpi_offset;
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
ompi_predefined_datatype_t ompi_mpi_count;
ompi_predefined_datatype_t ompi_mpi_c_bool;
ompi_predefined_datatype_t ompi_mpi_c_complex;
ompi_predefined_datatype_t ompi_mpi_c_float_complex;
ompi_predefined_datatype_t ompi_mpi_c_double_complex;
ompi_predefined_datatype_t ompi_mpi_c_long_double_complex;
struct ompi_predefined_errhandler_t {}
ompi_predefined_errhandler_t ompi_mpi_errhandler_null;
ompi_predefined_errhandler_t ompi_mpi_errors_are_fatal;
ompi_predefined_errhandler_t ompi_mpi_errors_return;
struct ompi_predefined_win_t {}
ompi_predefined_win_t ompi_mpi_win_null;
struct ompi_predefined_file_t {}
ompi_predefined_file_t ompi_mpi_file_null;
struct ompi_predefined_info_t {}
ompi_predefined_info_t ompi_mpi_info_null;
//unecessary and causes a DMD out-of-order bug
//static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
ompi_predefined_info_t ompi_mpi_info_env;
MPI_Fint* MPI_F_STATUS_IGNORE;
MPI_Fint* MPI_F_STATUSES_IGNORE;
}
/*
* MPI predefined handles
*/
alias MPI_COMM_WORLD = OMPI_PREDEFINED_GLOBAL!(MPI_Comm, ompi_mpi_comm_world);
alias MPI_COMM_SELF = OMPI_PREDEFINED_GLOBAL!(MPI_Comm, ompi_mpi_comm_self);
alias MPI_GROUP_EMPTY = OMPI_PREDEFINED_GLOBAL!(MPI_Group, ompi_mpi_group_empty);
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
alias MPI_MESSAGE_NO_PROC = OMPI_PREDEFINED_GLOBAL!(MPI_Message, ompi_message_no_proc);
alias MPI_MAX = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_max);
alias MPI_MIN = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_min);
alias MPI_SUM = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_sum);
alias MPI_PROD = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_prod);
alias MPI_LAND = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_land);
alias MPI_BAND = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_band);
alias MPI_LOR = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_lor);
alias MPI_BOR = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_bor);
alias MPI_LXOR = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_lxor);
alias MPI_BXOR = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_bxor);
alias MPI_MAXLOC = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_maxloc);
alias MPI_MINLOC = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_minloc);
alias MPI_REPLACE = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_replace);
static if(OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION >= 8)
alias MPI_NO_OP = OMPI_PREDEFINED_GLOBAL!(MPI_Op, ompi_mpi_op_no_op);
/* C datatypes */
alias MPI_DATATYPE_NULL = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_datatype_null);
alias MPI_BYTE = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_byte);
alias MPI_PACKED = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_packed);
alias MPI_CHAR = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_char);
alias MPI_SHORT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_short);
alias MPI_INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_int);
alias MPI_LONG = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_long);
alias MPI_FLOAT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_float);
alias MPI_DOUBLE = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_double);
alias MPI_LONG_DOUBLE = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_long_double);
alias MPI_UNSIGNED_CHAR = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_unsigned_char);
alias MPI_SIGNED_CHAR = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_signed_char);
alias MPI_UNSIGNED_SHORT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_unsigned_short);
alias MPI_UNSIGNED_LONG = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_unsigned_long);
alias MPI_UNSIGNED = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_unsigned);
alias MPI_FLOAT_INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_float_int);
alias MPI_DOUBLE_INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_double_int);
alias MPI_LONG_DOUBLE_INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_longdbl_int);
alias MPI_LONG_INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_long_int);
alias MPI_SHORT_INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_short_int);
alias MPI_2INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_2int);
alias MPI_UB = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_ub);
alias MPI_LB = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_lb);
alias MPI_WCHAR = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_wchar);
static if (OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION < 6)
static if (OMPI_HAVE_LONG_LONG)
private enum _HAVE_LONG = 1;
else
private enum _HAVE_LONG = 0;
else static if (OPAL_HAVE_LONG_LONG)
private enum _HAVE_LONG = 1;
else
private enum _HAVE_LONG = 0;
static if (_HAVE_LONG)
{
alias MPI_LONG_LONG_INT = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_long_long_int);
alias MPI_LONG_LONG = OMPI_PREDEFINED_GLOBAL!(MPI_Datatype, ompi_mpi_long_long_int);