monolish  0.14.2
MONOlithic LIner equation Solvers for Highly-parallel architecture
isend_irecv.hpp
Go to the documentation of this file.
1 #include "../internal/monolish_internal.hpp"
2 #include "../internal/mpi/mpi_util.hpp"
3 
4 namespace monolish {
5 namespace {
6 
8 // Isend
10 
11 // Scalar
12 template <typename T>
13 void Isend_core(T val, int dst, int tag, MPI_Comm comm,
14  std::vector<MPI_Request> &rq) {
15  Logger &logger = Logger::get_instance();
16  logger.util_in(monolish_func);
17 
18 #if defined MONOLISH_USE_MPI
19  MPI_Request request;
20  rq.push_back(request);
21  MPI_Isend(&val, 1, internal::mpi::get_type(val), dst, tag, comm, &rq.back());
22 #endif
23 
24  logger.util_out();
25 }
26 
27 // std::vector
28 template <typename T>
29 void Isend_core(const std::vector<T> &vec, int dst, int tag, MPI_Comm comm,
30  std::vector<MPI_Request> &rq) {
31  Logger &logger = Logger::get_instance();
32  logger.util_in(monolish_func);
33 
34 #if defined MONOLISH_USE_MPI
35  MPI_Request request;
36  rq.push_back(request);
37  MPI_Isend(vec.data(), vec.size(), internal::mpi::get_type(vec.data()[0]), dst,
38  tag, comm, &rq.back());
39 #endif
40 
41  logger.util_out();
42 }
43 
44 // monolish::vector
45 template <typename T>
46 void Isend_core(const monolish::vector<T> &vec, int dst, int tag, MPI_Comm comm,
47  std::vector<MPI_Request> &rq) {
48  Logger &logger = Logger::get_instance();
49  logger.util_in(monolish_func);
50 
51 #if defined MONOLISH_USE_MPI
52  MPI_Isend(vec.data(), vec.size(), internal::mpi::get_type(vec.data()[0]), dst,
53  tag, comm, &rq.back());
54 #endif
55 
56  logger.util_out();
57 }
58 
60 // Irecv
62 
63 // Scalar
64 template <typename T>
65 void Irecv_core(T val, int src, int tag, MPI_Comm comm,
66  std::vector<MPI_Request> &rq) {
67  Logger &logger = Logger::get_instance();
68  logger.util_in(monolish_func);
69 
70 #if defined MONOLISH_USE_MPI
71  MPI_Request request;
72  rq.push_back(request);
73  MPI_Irecv(&val, 1, internal::mpi::get_type(val), src, tag, comm, &rq.back());
74 #endif
75 
76  logger.util_out();
77 }
78 
79 // std::vector
80 template <typename T>
81 void Irecv_core(std::vector<T> &vec, int src, int tag, MPI_Comm comm,
82  std::vector<MPI_Request> &rq) {
83  Logger &logger = Logger::get_instance();
84  logger.util_in(monolish_func);
85 
86 #if defined MONOLISH_USE_MPI
87  MPI_Request request;
88  rq.push_back(request);
89  MPI_Irecv(vec.data(), vec.size(), internal::mpi::get_type(vec.data()[0]), src,
90  tag, comm, &rq.back());
91 #endif
92 
93  logger.util_out();
94 }
95 
96 // monolish::vector
97 template <typename T>
98 void Irecv_core(monolish::vector<T> &vec, int src, int tag, MPI_Comm comm,
99  std::vector<MPI_Request> &rq) {
100  Logger &logger = Logger::get_instance();
101  logger.util_in(monolish_func);
102 
103 #if defined MONOLISH_USE_MPI
104  MPI_Request request;
105  rq.push_back(request);
106  MPI_Irecv(vec.data(), vec.size(), internal::mpi::get_type(vec.data()[0]), src,
107  tag, comm, &rq.back());
108 #endif
109 
110  logger.util_out();
111 }
112 
113 void Waitall_core(std::vector<MPI_Request> &rq) {
114  Logger &logger = Logger::get_instance();
115  logger.util_in(monolish_func);
116 
117 #if defined MONOLISH_USE_MPI
118  std::vector<MPI_Status> stat(rq.size());
119  MPI_Waitall(rq.size(), rq.data(), stat.data());
120  rq.clear();
121 #endif
122 
123  logger.util_out();
124 }
125 
126 } // namespace
127 } // namespace monolish
monolish_func
#define monolish_func
Definition: monolish_logger.hpp:9
monolish::vector::size
auto size() const
get vector size
Definition: monolish_vector.hpp:312
monolish::vector::data
const Float * data() const
returns a direct pointer to the vector
Definition: monolish_vector.hpp:236
MPI_Request
int MPI_Request
Definition: mpi_dummy.hpp:38
monolish
Definition: monolish_matrix_blas.hpp:10
MPI_Comm
struct ompi_communicator_t * MPI_Comm
Definition: mpi_dummy.hpp:40
monolish::vector
vector class
Definition: monolish_coo.hpp:32
monolish::Logger::get_instance
static Logger & get_instance()
Definition: monolish_logger.hpp:42