1
+ /* -*- Mode: C; c-basic-offset:4 ; -*- */
2
+ /*
3
+ * Copyright (c) 2018 The University of Tennessee and The University
4
+ * of Tennessee Research Foundation. All rights
5
+ * reserved.
6
+ * $COPYRIGHT$
7
+ *
8
+ * Additional copyrights may follow
9
+ *
10
+ * $HEADER$
11
+ */
12
+
13
+ /**
14
+ * This test check the correct OMPI datatype description for
15
+ * extremely large types (over 4GB).
16
+ */
17
+
1
18
#include <mpi.h>
2
19
#include <stdio.h>
3
20
#include <stddef.h>
13
30
#define MAX_IOVEC 10
14
31
#define MAX_CHUNK (1024*1024*1024) /* 1GB */
15
32
33
+ static int verbose = 0 ;
34
+
16
35
static size_t
17
- count_length_via_convertor_raw (MPI_Datatype dtype , int count )
36
+ count_length_via_convertor_raw (char * msg ,
37
+ MPI_Datatype dtype , int count )
18
38
{
19
39
opal_convertor_t * pconv ;
20
40
struct iovec iov [MAX_IOVEC ];
@@ -24,24 +44,41 @@ count_length_via_convertor_raw(MPI_Datatype dtype, int count)
24
44
pconv = opal_convertor_create ( opal_local_arch , 0 );
25
45
opal_convertor_prepare_for_send (pconv , (const struct opal_datatype_t * )dtype , 1 , NULL );
26
46
while ( 0 == opal_convertor_raw (pconv , iov , & iov_count , & length ) ) {
27
- printf ("iov_count = %d packed_iovec = %" PRIsize_t "\n" , iov_count , packed_iovec );
47
+ if ( verbose ) {
48
+ printf ("iov_count = %d packed_iovec = %" PRIsize_t " length = %" PRIsize_t "\n" ,
49
+ iov_count , packed_iovec , length );
50
+ }
28
51
packed += length ;
29
52
for ( i = 0 ; i < iov_count ; i ++ ) {
30
53
packed_iovec += iov [i ].iov_len ;
54
+ if ( verbose ) {
55
+ printf ("[%s] add %" PRIsize_t " bytes -> so far %" PRIsize_t " bytes\n" ,
56
+ msg , iov [i ].iov_len , packed_iovec );
57
+ }
31
58
}
32
59
if ( packed != packed_iovec ) {
33
- printf ( "Packed send amount diverges %" PRIsize_t " != %" PRIsize_t "\n" , packed , packed_iovec );
60
+ printf ( "[%s] Raw data amount diverges %" PRIsize_t " != %" PRIsize_t "\n" ,
61
+ msg , packed , packed_iovec );
34
62
exit (-1 );
35
63
}
36
64
iov_count = MAX_IOVEC ; /* number of available iov */
37
65
length = MAX_CHUNK ;
38
66
}
67
+ if ( verbose ) {
68
+ printf ("iov_count = %d packed_iovec = %" PRIsize_t " length = %" PRIsize_t "\n" ,
69
+ iov_count , packed_iovec , length );
70
+ }
39
71
packed += length ;
40
72
for ( i = 0 ; i < iov_count ; i ++ ) {
41
73
packed_iovec += iov [i ].iov_len ;
74
+ if ( verbose ) {
75
+ printf ("[%s] add %" PRIsize_t " bytes -> so far %" PRIsize_t " bytes\n" ,
76
+ msg , iov [i ].iov_len , packed_iovec );
77
+ }
42
78
}
43
79
if ( packed != packed_iovec ) {
44
- printf ( "Packed send amount diverges %" PRIsize_t " != %" PRIsize_t "\n" , packed , packed_iovec );
80
+ printf ( "[%s] Raw data amount diverges %" PRIsize_t " != %" PRIsize_t "\n" ,
81
+ msg , packed , packed_iovec );
45
82
exit (-1 );
46
83
}
47
84
return packed_iovec ;
@@ -52,42 +89,86 @@ int main(int argc, char * argv[])
52
89
53
90
int const per_process = 192 ;
54
91
int const per_type = 20000000 ;
92
+ int blocklen , stride , count ;
55
93
56
94
int scounts [2 ] = {per_process , per_process };
57
95
int sdispls [2 ] = {3 * per_process , 0 * per_process };
58
96
int rcounts [2 ] = {per_process , per_process };
59
97
int rdispls [2 ] = {1 * per_process , 2 * per_process };
60
98
61
99
MPI_Datatype ddt , stype , rtype ;
100
+ size_t length , packed ;
62
101
63
102
opal_init_util (& argc , & argv );
64
103
ompi_datatype_init ();
65
104
66
105
ompi_datatype_create_contiguous ( per_type , MPI_FLOAT , & ddt );
106
+
107
+ /*
108
+ * Large sparse datatype: indexed contiguous
109
+ */
67
110
ompi_datatype_create_indexed (2 , scounts , sdispls , ddt , & stype );
68
111
ompi_datatype_commit (& stype );
69
- ompi_datatype_create_indexed (2 , rcounts , rdispls , ddt , & rtype );
70
- ompi_datatype_commit (& rtype );
71
112
72
- size_t packed = count_length_via_convertor_raw (stype , 1 );
73
- size_t length ;
113
+ packed = count_length_via_convertor_raw ("1. INDEX" , stype , 1 );
74
114
opal_datatype_type_size (& stype -> super , & length );
75
115
if ( length != packed ) {
76
116
printf ("Mismatched length of packed data to datatype size (%" PRIsize_t " != %" PRIsize_t ")\n" ,
77
117
packed , length );
78
118
exit (-2 );
79
119
}
120
+ ompi_datatype_destroy (& stype );
80
121
81
- packed = count_length_via_convertor_raw (rtype , 1 );
122
+ /*
123
+ * Large contiguous datatype: indexed contiguous
124
+ */
125
+ ompi_datatype_create_indexed (2 , rcounts , rdispls , ddt , & rtype );
126
+ ompi_datatype_commit (& rtype );
127
+
128
+ packed = count_length_via_convertor_raw ("2. INDEX" , rtype , 1 );
82
129
opal_datatype_type_size (& rtype -> super , & length );
83
130
if ( length != packed ) {
84
131
printf ("Mismatched length of packed data to datatype size (%" PRIsize_t " != %" PRIsize_t ")\n" ,
85
132
packed , length );
86
133
exit (-2 );
87
134
}
88
-
89
- ompi_datatype_destroy (& stype );
90
135
ompi_datatype_destroy (& rtype );
136
+ ompi_datatype_destroy (& ddt );
137
+
138
+ /*
139
+ * Large sparse datatype: vector
140
+ */
141
+ count = INT_MAX / 2 ;
142
+ blocklen = stride = 4 ;
143
+ ompi_datatype_create_vector (count , blocklen , stride , MPI_FLOAT , & ddt );
144
+ ompi_datatype_commit (& ddt );
145
+
146
+ packed = count_length_via_convertor_raw ("3. VECTOR" , ddt , 1 );
147
+ opal_datatype_type_size (& ddt -> super , & length );
148
+ if ( length != packed ) {
149
+ printf ("Mismatched length of packed data to datatype size (%" PRIsize_t " != %" PRIsize_t ")\n" ,
150
+ packed , length );
151
+ exit (-2 );
152
+ }
153
+ ompi_datatype_destroy (& ddt );
154
+
155
+ /*
156
+ * Large sparse datatype: contiguous
157
+ */
158
+ MPI_Datatype tmp ;
159
+ ompi_datatype_create_contiguous (stride , MPI_FLOAT , & tmp );
160
+ ompi_datatype_create_contiguous (count , tmp , & ddt );
161
+ ompi_datatype_commit (& ddt );
162
+
163
+ packed = count_length_via_convertor_raw ("4. CONTIG" , ddt , 1 );
164
+ opal_datatype_type_size (& ddt -> super , & length );
165
+ if ( length != packed ) {
166
+ printf ("Mismatched length of packed data to datatype size (%" PRIsize_t " != %" PRIsize_t ")\n" ,
167
+ packed , length );
168
+ exit (-2 );
169
+ }
170
+ ompi_datatype_destroy (& ddt );
171
+ ompi_datatype_destroy (& tmp );
91
172
92
173
return 0 ;
93
174
}
0 commit comments