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+
118#include <mpi.h>
219#include <stdio.h>
320#include <stddef.h>
1330#define MAX_IOVEC 10
1431#define MAX_CHUNK (1024*1024*1024) /* 1GB */
1532
33+ static int verbose = 0 ;
34+
1635static 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 )
1838{
1939 opal_convertor_t * pconv ;
2040 struct iovec iov [MAX_IOVEC ];
@@ -24,24 +44,41 @@ count_length_via_convertor_raw(MPI_Datatype dtype, int count)
2444 pconv = opal_convertor_create ( opal_local_arch , 0 );
2545 opal_convertor_prepare_for_send (pconv , (const struct opal_datatype_t * )dtype , 1 , NULL );
2646 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+ }
2851 packed += length ;
2952 for ( i = 0 ; i < iov_count ; i ++ ) {
3053 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+ }
3158 }
3259 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 );
3462 exit (-1 );
3563 }
3664 iov_count = MAX_IOVEC ; /* number of available iov */
3765 length = MAX_CHUNK ;
3866 }
67+ if ( verbose ) {
68+ printf ("iov_count = %d packed_iovec = %" PRIsize_t " length = %" PRIsize_t "\n" ,
69+ iov_count , packed_iovec , length );
70+ }
3971 packed += length ;
4072 for ( i = 0 ; i < iov_count ; i ++ ) {
4173 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+ }
4278 }
4379 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 );
4582 exit (-1 );
4683 }
4784 return packed_iovec ;
@@ -52,42 +89,86 @@ int main(int argc, char * argv[])
5289
5390 int const per_process = 192 ;
5491 int const per_type = 20000000 ;
92+ int blocklen , stride , count ;
5593
5694 int scounts [2 ] = {per_process , per_process };
5795 int sdispls [2 ] = {3 * per_process , 0 * per_process };
5896 int rcounts [2 ] = {per_process , per_process };
5997 int rdispls [2 ] = {1 * per_process , 2 * per_process };
6098
6199 MPI_Datatype ddt , stype , rtype ;
100+ size_t length , packed ;
62101
63102 opal_init_util (& argc , & argv );
64103 ompi_datatype_init ();
65104
66105 ompi_datatype_create_contiguous ( per_type , MPI_FLOAT , & ddt );
106+
107+ /*
108+ * Large sparse datatype: indexed contiguous
109+ */
67110 ompi_datatype_create_indexed (2 , scounts , sdispls , ddt , & stype );
68111 ompi_datatype_commit (& stype );
69- ompi_datatype_create_indexed (2 , rcounts , rdispls , ddt , & rtype );
70- ompi_datatype_commit (& rtype );
71112
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 );
74114 opal_datatype_type_size (& stype -> super , & length );
75115 if ( length != packed ) {
76116 printf ("Mismatched length of packed data to datatype size (%" PRIsize_t " != %" PRIsize_t ")\n" ,
77117 packed , length );
78118 exit (-2 );
79119 }
120+ ompi_datatype_destroy (& stype );
80121
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 );
82129 opal_datatype_type_size (& rtype -> super , & length );
83130 if ( length != packed ) {
84131 printf ("Mismatched length of packed data to datatype size (%" PRIsize_t " != %" PRIsize_t ")\n" ,
85132 packed , length );
86133 exit (-2 );
87134 }
88-
89- ompi_datatype_destroy (& stype );
90135 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 );
91172
92173 return 0 ;
93174}
0 commit comments