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 | */ |
12 | class MPI_IrecvWB |
13 | { |
14 | public: |
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 | |
37 | template<typename T> class MPI_IrecvW |
38 | { |
39 | public: |
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 | */ |
50 | template<> class MPI_IrecvW<int> |
51 | { |
52 | public: |
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 | */ |
62 | template<> class MPI_IrecvW<unsigned int> |
63 | { |
64 | public: |
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 | */ |
74 | template<> class MPI_IrecvW<short> |
75 | { |
76 | public: |
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 | */ |
86 | template<> class MPI_IrecvW<unsigned short> |
87 | { |
88 | public: |
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 | */ |
98 | template<> class MPI_IrecvW<char> |
99 | { |
100 | public: |
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 | */ |
110 | template<> class MPI_IrecvW<unsigned char> |
111 | { |
112 | public: |
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 | */ |
122 | template<> class MPI_IrecvW<size_t> |
123 | { |
124 | public: |
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 | */ |
134 | template<> class MPI_IrecvW<long int> |
135 | { |
136 | public: |
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 | */ |
146 | template<> class MPI_IrecvW<float> |
147 | { |
148 | public: |
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 | */ |
158 | template<> class MPI_IrecvW<double> |
159 | { |
160 | public: |
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 | |