This source file includes following definitions.
- main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include "ompi_config.h"
16 #include "opal/datatype/opal_convertor.h"
17 #include "ompi/datatype/ompi_datatype.h"
18 #include "opal/datatype/opal_datatype_checksum.h"
19 #include "opal/runtime/opal.h"
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <time.h>
24
25 #define SIZE 1024
26
27 typedef struct {
28 int useful;
29 int useless;
30 } my_data_t;
31
32 int main( int argc, char* argv[] )
33 {
34 MPI_Datatype sparse;
35 int *array, *packed;
36 my_data_t* sparse_array;
37 int i;
38 uint32_t iov_count;
39 size_t max_data;
40 uint32_t pack_checksum, contiguous_checksum, sparse_checksum, manual_checksum;
41 struct iovec iov[2];
42 opal_convertor_t* convertor;
43
44 opal_init_util (NULL, NULL);
45 ompi_datatype_init();
46 srandom( (int)time(NULL) );
47
48
49 ompi_datatype_create_vector( SIZE, 1, 2, MPI_INT, &sparse );
50 ompi_datatype_commit( &sparse );
51
52 sparse_array = (my_data_t*)malloc( sizeof(my_data_t) * SIZE );
53 array = (int*)malloc( sizeof(int) * SIZE );
54 packed = (int*)malloc( sizeof(int) * SIZE );
55
56
57
58
59 for( i = 0; i < SIZE; i++ ) {
60 sparse_array[i].useful = random();
61 sparse_array[i].useless = 0;
62 }
63
64
65
66
67
68 convertor = opal_convertor_create( opal_local_arch, 0 );
69 opal_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, NULL );
70 opal_convertor_prepare_for_send( convertor, &(sparse->super), SIZE, sparse_array );
71
72 iov[0].iov_base = packed;
73 iov[0].iov_len = sizeof(int) * SIZE;
74 max_data = iov[0].iov_len;
75
76 iov_count = 1;
77 opal_convertor_pack( convertor, iov, &iov_count, &max_data );
78 pack_checksum = convertor->checksum;
79
80 OBJ_RELEASE(convertor);
81
82
83
84
85
86 convertor = opal_convertor_create( opal_local_arch, 0 );
87 opal_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, NULL );
88 opal_convertor_prepare_for_send( convertor, &(ompi_mpi_int.dt.super), SIZE, packed );
89
90 iov[0].iov_base = array;
91 iov[0].iov_len = sizeof(int) * SIZE;
92 max_data = iov[0].iov_len;
93
94 iov_count = 1;
95 opal_convertor_pack( convertor, iov, &iov_count, &max_data );
96 contiguous_checksum = convertor->checksum;
97
98 OBJ_RELEASE(convertor);
99
100
101
102
103
104
105 convertor = opal_convertor_create( opal_local_arch, 0 );
106 opal_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, NULL );
107 opal_convertor_prepare_for_recv( convertor, &(sparse->super), SIZE, sparse_array );
108
109 max_data = sizeof(int) * SIZE;
110 iov[0].iov_base = array;
111 iov[0].iov_len = max_data / 2;
112 iov[1].iov_base = (char*)array + iov[0].iov_len;
113 iov[1].iov_len = max_data - iov[0].iov_len;
114
115 iov_count = 2;
116 opal_convertor_unpack( convertor, iov, &iov_count, &max_data );
117 sparse_checksum = convertor->checksum;
118
119 OBJ_RELEASE(convertor);
120
121
122
123
124 OBJ_RELEASE(sparse);
125
126
127
128
129 printf( "contiguous checksum %x\n", contiguous_checksum );
130 printf( "packed checksum %x\n", pack_checksum );
131 printf( "sparse checksum %x\n", sparse_checksum );
132 if( (sparse_checksum != contiguous_checksum) ||
133 (pack_checksum != sparse_checksum) ) {
134 printf( "ERROR!!! the checksum algorithm does not work as expected\n" );
135 return 1;
136 }
137 printf( "COOL the 3 checksum match\n" );
138
139
140
141
142
143 {
144 uint32_t ui1 = 0;
145 size_t ui2 = 0;
146 manual_checksum = OPAL_CSUM_PARTIAL( packed, sizeof(int) * SIZE, &ui1, &ui2 );
147 }
148 printf( "manual checksum %x\n", manual_checksum );
149
150 free(sparse_array);
151 free(array);
152 free(packed);
153
154
155 ompi_datatype_finalize();
156 opal_finalize_util ();
157
158 return 0;
159 }