This source file includes following definitions.
- mca_coll_inter_reduce_inter
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 #include "coll_inter.h"
25
26 #include <stdio.h>
27
28 #include "mpi.h"
29 #include "ompi/constants.h"
30 #include "ompi/mca/coll/coll.h"
31 #include "ompi/mca/coll/base/coll_tags.h"
32 #include "ompi/op/op.h"
33 #include "ompi/mca/pml/pml.h"
34
35
36
37
38
39
40
41
42 int
43 mca_coll_inter_reduce_inter(const void *sbuf, void *rbuf, int count,
44 struct ompi_datatype_t *dtype,
45 struct ompi_op_t *op,
46 int root, struct ompi_communicator_t *comm,
47 mca_coll_base_module_t *module)
48 {
49 int rank, err;
50
51
52 rank = ompi_comm_rank(comm);
53
54 if (MPI_PROC_NULL == root) {
55
56 err = OMPI_SUCCESS;
57 } else if (MPI_ROOT != root) {
58 ptrdiff_t gap, span;
59 char *free_buffer = NULL;
60 char *pml_buffer = NULL;
61
62
63 span = opal_datatype_span(&dtype->super, count, &gap);
64
65 free_buffer = (char*)malloc(span);
66 if (NULL == free_buffer) {
67 return OMPI_ERR_OUT_OF_RESOURCE;
68 }
69 pml_buffer = free_buffer - gap;
70
71 err = comm->c_local_comm->c_coll->coll_reduce(sbuf, pml_buffer, count,
72 dtype, op, 0, comm->c_local_comm,
73 comm->c_local_comm->c_coll->coll_reduce_module);
74 if (0 == rank) {
75
76 err = MCA_PML_CALL(send(pml_buffer, count, dtype, root,
77 MCA_COLL_BASE_TAG_REDUCE,
78 MCA_PML_BASE_SEND_STANDARD, comm));
79 if (OMPI_SUCCESS != err) {
80 return err;
81 }
82 }
83
84 if (NULL != free_buffer) {
85 free(free_buffer);
86 }
87 } else {
88
89 err = MCA_PML_CALL(recv(rbuf, count, dtype, 0,
90 MCA_COLL_BASE_TAG_REDUCE, comm,
91 MPI_STATUS_IGNORE));
92 if (OMPI_SUCCESS != err) {
93 return err;
94 }
95 }
96
97 return err;
98 }