1#ifndef MPI_IRECV_HPP
2#define MPI_IRECV_HPP
3
4
5#include <mpi.h>
6
7/*! \brief Set of wrapping classing for MPI_Irecv
8 *
9 * The purpose of these classes is to correctly choose the right call based on the type we want to receive
10 *
11 */
12class MPI_IrecvWB
13{
14public:
15
16 /*! \brief General recv for general buffer
17 *
18 * \param proc processor from which to receive
19 * \param tag
20 * \param buf buffer where to store the data
21 * \param sz size to receive
22 * \param req MPI request
23 *
24 */
25 static inline void recv(size_t proc , size_t tag ,void * buf, size_t sz, MPI_Request & req)
26 {
27 MPI_SAFE_CALL(MPI_Irecv(buf,sz,MPI_BYTE, proc, tag , MPI_COMM_WORLD,&req));
28 }
29};
30
31/*! \brief General recv for vector of
32 *
33 * \tparam any type
34 *
35 */
36
37template<typename T> class MPI_IrecvW
38{
39public:
40 static inline void recv(size_t proc , size_t tag ,openfpm::vector<T> & v, MPI_Request & req)
41 {
42 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size() * sizeof(T),MPI_BYTE, proc, tag , MPI_COMM_WORLD,&req));
43 }
44};
45
46
47/*! \brief specialization for vector of integer
48 *
49 */
50template<> class MPI_IrecvW<int>
51{
52public:
53 static inline void recv(size_t proc , size_t tag ,openfpm::vector<int> & v, MPI_Request & req)
54 {
55 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_INT, proc, tag , MPI_COMM_WORLD,&req));
56 }
57};
58
59/*! \brief specialization for unsigned integer
60 *
61 */
62template<> class MPI_IrecvW<unsigned int>
63{
64public:
65 static inline void recv(size_t proc , size_t tag ,openfpm::vector<unsigned int> & v, MPI_Request & req)
66 {
67 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED, proc, tag , MPI_COMM_WORLD,&req));
68 }
69};
70
71/*! \brief specialization for short
72 *
73 */
74template<> class MPI_IrecvW<short>
75{
76public:
77 static inline void recv(size_t proc , size_t tag ,openfpm::vector<short> & v, MPI_Request & req)
78 {
79 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_SHORT, proc, tag , MPI_COMM_WORLD,&req));
80 }
81};
82
83/*! \brief specialization for short
84 *
85 */
86template<> class MPI_IrecvW<unsigned short>
87{
88public:
89 static inline void recv(size_t proc , size_t tag ,openfpm::vector<unsigned short> & v, MPI_Request & req)
90 {
91 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED_SHORT, proc, tag , MPI_COMM_WORLD,&req));
92 }
93};
94
95/*! \brief specialization for char
96 *
97 */
98template<> class MPI_IrecvW<char>
99{
100public:
101 static inline void recv(size_t proc , size_t tag ,openfpm::vector<char> & v, MPI_Request & req)
102 {
103 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_CHAR, proc, tag , MPI_COMM_WORLD,&req));
104 }
105};
106
107/*! \brief specialization for char
108 *
109 */
110template<> class MPI_IrecvW<unsigned char>
111{
112public:
113 static inline void recv(size_t proc , size_t tag ,openfpm::vector<unsigned char> & v, MPI_Request & req)
114 {
115 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED_CHAR, proc, tag , MPI_COMM_WORLD,&req));
116 }
117};
118
119/*! \brief specialization for size_t
120 *
121 */
122template<> class MPI_IrecvW<size_t>
123{
124public:
125 static inline void recv(size_t proc , size_t tag ,openfpm::vector<size_t> & v, MPI_Request & req)
126 {
127 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED_LONG, proc, tag , MPI_COMM_WORLD,&req));
128 }
129};
130
131/*! \brief specialization for size_t
132 *
133 */
134template<> class MPI_IrecvW<long int>
135{
136public:
137 static inline void recv(size_t proc , size_t tag ,openfpm::vector<long int> & v, MPI_Request & req)
138 {
139 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_LONG, proc, tag , MPI_COMM_WORLD,&req));
140 }
141};
142
143/*! \brief specialization for float
144 *
145 */
146template<> class MPI_IrecvW<float>
147{
148public:
149 static inline void recv(size_t proc , size_t tag ,openfpm::vector<float> & v, MPI_Request & req)
150 {
151 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_FLOAT, proc, tag , MPI_COMM_WORLD,&req));
152 }
153};
154
155/*! \brief specialization for double
156 *
157 */
158template<> class MPI_IrecvW<double>
159{
160public:
161 static inline void recv(size_t proc , size_t tag ,openfpm::vector<double> & v, MPI_Request & req)
162 {
163 MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_DOUBLE, proc, tag , MPI_COMM_WORLD,&req));
164 }
165};
166
167#endif
168
169