This source file includes following definitions.
- count_length_via_convertor_raw
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <mpi.h>
19 #include <stdio.h>
20 #include <stddef.h>
21 #include <stdlib.h>
22 #include <string.h>
23
24 #include "ompi_config.h"
25 #include "ompi/datatype/ompi_datatype.h"
26 #include "opal/runtime/opal.h"
27 #include "opal/datatype/opal_convertor.h"
28 #include "opal/datatype/opal_datatype_internal.h"
29
30 #define MAX_IOVEC 10
31 #define MAX_CHUNK (1024*1024*1024)
32
33 static int verbose = 0;
34
35 static size_t
36 count_length_via_convertor_raw(char* msg,
37 MPI_Datatype dtype, int count)
38 {
39 opal_convertor_t* pconv;
40 struct iovec iov[MAX_IOVEC];
41 uint32_t iov_count = MAX_IOVEC, i;
42 size_t length = MAX_CHUNK, packed_iovec = 0, packed = 0;
43
44 pconv = opal_convertor_create( opal_local_arch, 0 );
45 opal_convertor_prepare_for_send(pconv, (const struct opal_datatype_t *)dtype, 1, NULL);
46 while( 0 == opal_convertor_raw(pconv, iov, &iov_count, &length) ) {
47 if( verbose ) {
48 printf("iov_count = %d packed_iovec = %"PRIsize_t" length = %"PRIsize_t"\n",
49 iov_count, packed_iovec, length);
50 }
51 packed += length;
52 for( i = 0; i < iov_count; i++ ) {
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 }
58 }
59 if( packed != packed_iovec ) {
60 printf( "[%s] Raw data amount diverges %"PRIsize_t" != %"PRIsize_t"\n",
61 msg, packed, packed_iovec);
62 exit(-1);
63 }
64 iov_count = MAX_IOVEC;
65 length = MAX_CHUNK;
66 }
67 if( verbose ) {
68 printf("iov_count = %d packed_iovec = %"PRIsize_t" length = %"PRIsize_t"\n",
69 iov_count, packed_iovec, length);
70 }
71 packed += length;
72 for( i = 0; i < iov_count; i++ ) {
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 }
78 }
79 if( packed != packed_iovec ) {
80 printf( "[%s] Raw data amount diverges %"PRIsize_t" != %"PRIsize_t"\n",
81 msg, packed, packed_iovec);
82 exit(-1);
83 }
84 return packed_iovec;
85 }
86
87 int main(int argc, char * argv[])
88 {
89
90 int const per_process = 192;
91 int const per_type = 20000000;
92 int blocklen, stride, count;
93
94 int scounts[2] = {per_process, per_process};
95 int sdispls[2] = {3*per_process, 0*per_process};
96 int rcounts[2] = {per_process, per_process};
97 int rdispls[2] = {1*per_process, 2*per_process};
98
99 MPI_Datatype ddt, stype, rtype;
100 size_t length, packed;
101
102 opal_init_util(&argc, &argv);
103 ompi_datatype_init();
104
105 ompi_datatype_create_contiguous( per_type, MPI_FLOAT, &ddt);
106
107
108
109
110 ompi_datatype_create_indexed(2, scounts, sdispls, ddt, &stype);
111 ompi_datatype_commit(&stype);
112
113 packed = count_length_via_convertor_raw("1. INDEX", stype, 1);
114 opal_datatype_type_size(&stype->super, &length);
115 if( length != packed ) {
116 printf("Mismatched length of packed data to datatype size (%"PRIsize_t" != %"PRIsize_t")\n",
117 packed, length);
118 exit(-2);
119 }
120 ompi_datatype_destroy(&stype);
121
122
123
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);
129 opal_datatype_type_size(&rtype->super, &length);
130 if( length != packed ) {
131 printf("Mismatched length of packed data to datatype size (%"PRIsize_t" != %"PRIsize_t")\n",
132 packed, length);
133 exit(-2);
134 }
135 ompi_datatype_destroy(&rtype);
136 ompi_datatype_destroy(&ddt);
137
138
139
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
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);
172
173 return 0;
174 }