1 /*
2 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
3 * University Research and Technology
4 * Corporation. All rights reserved.
5 * Copyright (c) 2004-2015 The University of Tennessee and The University
6 * of Tennessee Research Foundation. All rights
7 * reserved.
8 * Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
9 * University of Stuttgart. All rights reserved.
10 * Copyright (c) 2004-2005 The Regents of the University of California.
11 * All rights reserved.
12 * Copyright (c) 2014-2017 Research Organization for Information Science
13 * and Technology (RIST). All rights reserved.
14 * $COPYRIGHT$
15 *
16 * Additional copyrights may follow
17 *
18 * $HEADER$
19 */
20
21 #ifndef MCA_COLL_BASE_UTIL_EXPORT_H
22 #define MCA_COLL_BASE_UTIL_EXPORT_H
23
24 #include "ompi_config.h"
25
26 #include "mpi.h"
27 #include "ompi/mca/mca.h"
28 #include "ompi/datatype/ompi_datatype.h"
29 #include "ompi/request/request.h"
30 #include "ompi/mca/pml/pml.h"
31
32 BEGIN_C_DECLS
33
34 /**
35 * A MPI_like function doing a send and a receive simultaneously.
36 * If one of the communications results in a zero-byte message the
37 * communication is ignored, and no message will cross to the peer.
38 */
39 int ompi_coll_base_sendrecv_actual( const void* sendbuf, size_t scount,
40 ompi_datatype_t* sdatatype,
41 int dest, int stag,
42 void* recvbuf, size_t rcount,
43 ompi_datatype_t* rdatatype,
44 int source, int rtag,
45 struct ompi_communicator_t* comm,
46 ompi_status_public_t* status );
47
48
49 /**
50 * Similar to the function above this implementation of send-receive
51 * do not generate communications for zero-bytes messages. Thus, it is
52 * improper to use in the context of some algorithms for collective
53 * communications.
54 */
55 static inline int
56 ompi_coll_base_sendrecv( void* sendbuf, size_t scount, ompi_datatype_t* sdatatype,
57 int dest, int stag,
58 void* recvbuf, size_t rcount, ompi_datatype_t* rdatatype,
59 int source, int rtag,
60 struct ompi_communicator_t* comm,
61 ompi_status_public_t* status, int myid )
62 {
63 if ((dest == source) && (source == myid)) {
64 return (int) ompi_datatype_sndrcv(sendbuf, (int32_t) scount, sdatatype,
65 recvbuf, (int32_t) rcount, rdatatype);
66 }
67 return ompi_coll_base_sendrecv_actual (sendbuf, scount, sdatatype,
68 dest, stag,
69 recvbuf, rcount, rdatatype,
70 source, rtag, comm, status);
71 }
72
73 /**
74 * ompi_mirror_perm: Returns mirror permutation of nbits low-order bits
75 * of x [*].
76 * [*] Warren Jr., Henry S. Hacker's Delight (2ed). 2013.
77 * Chapter 7. Rearranging Bits and Bytes.
78 */
79 unsigned int ompi_mirror_perm(unsigned int x, int nbits);
80
81 /*
82 * ompi_rounddown: Rounds a number down to nearest multiple.
83 * rounddown(10,4) = 8, rounddown(6,3) = 6, rounddown(14,3) = 12
84 */
85 int ompi_rounddown(int num, int factor);
86
87 END_C_DECLS
88 #endif /* MCA_COLL_BASE_UTIL_EXPORT_H */