This source file includes following definitions.
- mca_coll_basic_alltoallv_inter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #include "ompi_config.h"
27 #include "coll_basic.h"
28
29 #include "mpi.h"
30 #include "ompi/constants.h"
31 #include "ompi/datatype/ompi_datatype.h"
32 #include "ompi/mca/coll/coll.h"
33 #include "ompi/mca/coll/base/coll_tags.h"
34 #include "ompi/mca/pml/pml.h"
35
36
37
38
39
40
41
42
43
44 int
45 mca_coll_basic_alltoallv_inter(const void *sbuf, const int *scounts, const int *sdisps,
46 struct ompi_datatype_t *sdtype, void *rbuf,
47 const int *rcounts, const int *rdisps,
48 struct ompi_datatype_t *rdtype,
49 struct ompi_communicator_t *comm,
50 mca_coll_base_module_t *module)
51 {
52 int i;
53 int rsize;
54 int err;
55 char *psnd;
56 char *prcv;
57 size_t nreqs;
58 MPI_Aint sndextent;
59 MPI_Aint rcvextent;
60
61 ompi_request_t **preq;
62
63
64
65 rsize = ompi_comm_remote_size(comm);
66
67 ompi_datatype_type_extent(sdtype, &sndextent);
68 ompi_datatype_type_extent(rdtype, &rcvextent);
69
70
71 nreqs = rsize * 2;
72 preq = ompi_coll_base_comm_get_reqs(module->base_data, nreqs);
73 if( NULL == preq ) { return OMPI_ERR_OUT_OF_RESOURCE; }
74
75
76
77 for (i = 0; i < rsize; ++i) {
78 prcv = ((char *) rbuf) + (rdisps[i] * rcvextent);
79 if (rcounts[i] > 0) {
80 err = MCA_PML_CALL(irecv(prcv, rcounts[i], rdtype,
81 i, MCA_COLL_BASE_TAG_ALLTOALLV, comm,
82 &preq[i]));
83 if (MPI_SUCCESS != err) {
84 ompi_coll_base_free_reqs(preq, i + 1);
85 return err;
86 }
87 }
88 }
89
90
91 for (i = 0; i < rsize; ++i) {
92 psnd = ((char *) sbuf) + (sdisps[i] * sndextent);
93 if (scounts[i] > 0) {
94 err = MCA_PML_CALL(isend(psnd, scounts[i], sdtype,
95 i, MCA_COLL_BASE_TAG_ALLTOALLV,
96 MCA_PML_BASE_SEND_STANDARD, comm,
97 &preq[rsize + i]));
98 if (MPI_SUCCESS != err) {
99 ompi_coll_base_free_reqs(preq, rsize + i + 1);
100 return err;
101 }
102 }
103 }
104
105 err = ompi_request_wait_all(nreqs, preq, MPI_STATUSES_IGNORE);
106 if (MPI_SUCCESS != err) {
107 ompi_coll_base_free_reqs(preq, nreqs);
108 }
109
110
111 return err;
112 }