OpenFPM  5.2.0
Project that contain the implementation of distributed structures
MPI_IrecvW.hpp
1 #ifndef MPI_IRECV_HPP
2 #define MPI_IRECV_HPP
3 
4 
5 #include <mpi.h>
6 
13 {
14 public:
15 
25  static inline void recv(size_t proc , size_t tag ,void * buf, size_t sz, MPI_Request & req, MPI_Comm ext_comm)
26  {
27  if (sz < 2147483647)
28  {
29  MPI_SAFE_CALL(MPI_Irecv(buf,sz,MPI_BYTE, proc, tag , ext_comm,&req));
30  }
31  else
32  {
33  MPI_SAFE_CALL(MPI_Irecv(buf,sz >> 8,MPI_DOUBLE, proc, tag , ext_comm,&req));
34  }
35  }
36 };
37 
44 template<typename T> class MPI_IrecvW
45 {
46 public:
47  static inline void recv(size_t proc , size_t tag ,openfpm::vector<T> & v, MPI_Request & req, MPI_Comm ext_comm)
48  {
49  if (v.size() * sizeof(T) < 2147483647)
50  {
51  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size() * sizeof(T),MPI_BYTE, proc, tag , ext_comm,&req));
52  }
53  else
54  {
55  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(),(v.size() * sizeof(T)) >> 8,MPI_DOUBLE, proc, tag , ext_comm,&req));
56  }
57  }
58 };
59 
60 
64 template<> class MPI_IrecvW<int>
65 {
66 public:
67  static inline void recv(size_t proc , size_t tag ,openfpm::vector<int> & v, MPI_Request & req, MPI_Comm ext_comm)
68  {
69  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_INT, proc, tag , ext_comm,&req));
70  }
71 };
72 
76 template<> class MPI_IrecvW<unsigned int>
77 {
78 public:
79  static inline void recv(size_t proc , size_t tag ,openfpm::vector<unsigned int> & v, MPI_Request & req, MPI_Comm ext_comm)
80  {
81  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED, proc, tag , ext_comm,&req));
82  }
83 };
84 
88 template<> class MPI_IrecvW<short>
89 {
90 public:
91  static inline void recv(size_t proc , size_t tag ,openfpm::vector<short> & v, MPI_Request & req, MPI_Comm ext_comm)
92  {
93  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_SHORT, proc, tag , ext_comm,&req));
94  }
95 };
96 
100 template<> class MPI_IrecvW<unsigned short>
101 {
102 public:
103  static inline void recv(size_t proc , size_t tag ,openfpm::vector<unsigned short> & v, MPI_Request & req, MPI_Comm ext_comm)
104  {
105  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED_SHORT, proc, tag , ext_comm,&req));
106  }
107 };
108 
112 template<> class MPI_IrecvW<char>
113 {
114 public:
115  static inline void recv(size_t proc , size_t tag ,openfpm::vector<char> & v, MPI_Request & req, MPI_Comm ext_comm)
116  {
117  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_CHAR, proc, tag , ext_comm,&req));
118  }
119 };
120 
124 template<> class MPI_IrecvW<unsigned char>
125 {
126 public:
127  static inline void recv(size_t proc , size_t tag ,openfpm::vector<unsigned char> & v, MPI_Request & req, MPI_Comm ext_comm)
128  {
129  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED_CHAR, proc, tag , ext_comm,&req));
130  }
131 };
132 
136 template<> class MPI_IrecvW<size_t>
137 {
138 public:
139  static inline void recv(size_t proc , size_t tag ,openfpm::vector<size_t> & v, MPI_Request & req, MPI_Comm ext_comm)
140  {
141  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_UNSIGNED_LONG, proc, tag , ext_comm,&req));
142  }
143 };
144 
148 template<> class MPI_IrecvW<long int>
149 {
150 public:
151  static inline void recv(size_t proc , size_t tag ,openfpm::vector<long int> & v, MPI_Request & req, MPI_Comm ext_comm)
152  {
153  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_LONG, proc, tag , ext_comm,&req));
154  }
155 };
156 
160 template<> class MPI_IrecvW<float>
161 {
162 public:
163  static inline void recv(size_t proc , size_t tag ,openfpm::vector<float> & v, MPI_Request & req, MPI_Comm ext_comm)
164  {
165  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_FLOAT, proc, tag , ext_comm,&req));
166  }
167 };
168 
172 template<> class MPI_IrecvW<double>
173 {
174 public:
175  static inline void recv(size_t proc , size_t tag ,openfpm::vector<double> & v, MPI_Request & req, MPI_Comm ext_comm)
176  {
177  MPI_SAFE_CALL(MPI_Irecv(v.getPointer(), v.size(),MPI_DOUBLE, proc, tag , ext_comm,&req));
178  }
179 };
180 
181 #endif
182 
Set of wrapping classing for MPI_Irecv.
Definition: MPI_IrecvW.hpp:13
static void recv(size_t proc, size_t tag, void *buf, size_t sz, MPI_Request &req, MPI_Comm ext_comm)
General recv for general buffer.
Definition: MPI_IrecvW.hpp:25
General recv for vector of.
Definition: MPI_IrecvW.hpp:45
KeyT const ValueT ValueT OffsetIteratorT OffsetIteratorT int
[in] The number of segments that comprise the sorting data