This source file includes following definitions.
- ompi_datatype_sndrcv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include "ompi_config.h"
24
25 #include "opal/datatype/opal_datatype.h"
26 #include "opal/datatype/opal_datatype_internal.h"
27 #include "opal/datatype/opal_convertor.h"
28 #include "ompi/datatype/ompi_datatype.h"
29 #include "ompi/datatype/ompi_datatype_internal.h"
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 int32_t ompi_datatype_sndrcv( const void *sbuf, int32_t scount, const ompi_datatype_t* sdtype,
46 void *rbuf, int32_t rcount, const ompi_datatype_t* rdtype)
47 {
48 opal_convertor_t send_convertor, recv_convertor;
49 struct iovec iov;
50 int length, completed;
51 uint32_t iov_count;
52 size_t max_data;
53
54
55 if (0 == rcount || 0 == rdtype->super.size) {
56 return ((0 == scount || 0 == sdtype->super.size) ? MPI_SUCCESS : MPI_ERR_TRUNCATE);
57 }
58
59
60 if (sdtype == rdtype) {
61 int32_t count = ( scount < rcount ? scount : rcount );
62 opal_datatype_copy_content_same_ddt(&(rdtype->super), count, (char*)rbuf, (char*)sbuf);
63 return ((scount > rcount) ? MPI_ERR_TRUNCATE : MPI_SUCCESS);
64 }
65
66
67 if (rdtype->id == OMPI_DATATYPE_MPI_PACKED) {
68 OBJ_CONSTRUCT( &send_convertor, opal_convertor_t );
69 opal_convertor_copy_and_prepare_for_send( ompi_mpi_local_convertor,
70 &(sdtype->super), scount, sbuf, 0,
71 &send_convertor );
72
73 iov_count = 1;
74 iov.iov_base = (IOVBASE_TYPE*)rbuf;
75 iov.iov_len = scount * sdtype->super.size;
76 if( (int32_t)iov.iov_len > rcount ) iov.iov_len = rcount;
77
78 opal_convertor_pack( &send_convertor, &iov, &iov_count, &max_data );
79 OBJ_DESTRUCT( &send_convertor );
80 return ((max_data < (size_t)rcount) ? MPI_ERR_TRUNCATE : MPI_SUCCESS);
81 }
82
83
84 if (sdtype->id == OMPI_DATATYPE_MPI_PACKED) {
85 OBJ_CONSTRUCT( &recv_convertor, opal_convertor_t );
86 opal_convertor_copy_and_prepare_for_recv( ompi_mpi_local_convertor,
87 &(rdtype->super), rcount, rbuf, 0,
88 &recv_convertor );
89
90 iov_count = 1;
91 iov.iov_base = (IOVBASE_TYPE*)sbuf;
92 iov.iov_len = rcount * rdtype->super.size;
93 if( (int32_t)iov.iov_len > scount ) iov.iov_len = scount;
94
95 opal_convertor_unpack( &recv_convertor, &iov, &iov_count, &max_data );
96 OBJ_DESTRUCT( &recv_convertor );
97 return (((size_t)scount > max_data) ? MPI_ERR_TRUNCATE : MPI_SUCCESS);
98 }
99
100 iov.iov_len = length = 64 * 1024;
101 iov.iov_base = (IOVBASE_TYPE*)malloc( length * sizeof(char) );
102
103 OBJ_CONSTRUCT( &send_convertor, opal_convertor_t );
104 opal_convertor_copy_and_prepare_for_send( ompi_mpi_local_convertor,
105 &(sdtype->super), scount, sbuf, 0,
106 &send_convertor );
107 OBJ_CONSTRUCT( &recv_convertor, opal_convertor_t );
108 opal_convertor_copy_and_prepare_for_recv( ompi_mpi_local_convertor,
109 &(rdtype->super), rcount, rbuf, 0,
110 &recv_convertor );
111
112 completed = 0;
113 while( !completed ) {
114 iov.iov_len = length;
115 iov_count = 1;
116 max_data = length;
117 completed |= opal_convertor_pack( &send_convertor, &iov, &iov_count, &max_data );
118 completed |= opal_convertor_unpack( &recv_convertor, &iov, &iov_count, &max_data );
119 }
120 free( iov.iov_base );
121 OBJ_DESTRUCT( &send_convertor );
122 OBJ_DESTRUCT( &recv_convertor );
123
124 return ( (scount * sdtype->super.size) <= (rcount * rdtype->super.size) ? MPI_SUCCESS : MPI_ERR_TRUNCATE );
125 }