BioCMAMC-ST
impl_async.hpp
1#ifndef __IMPL_ASYNC_MPI_HPP__
2#define __IMPL_ASYNC_MPI_HPP__
3
4#include <common/common.hpp>
5#include <common/execinfo.hpp>
6#include <cstddef>
7#include <math.h>
8#include <mpi.h>
9#include <mpi_w/message_t.hpp>
10#include <mpi_w/mpi_types.hpp>
11#include <span>
12// #include <optional>
13// #include <limits>
14// #include <vector>
15// #include <stdexcept>
16
18{
19
20 inline MPI_Status wait(MPI_Request& request)
21 {
22 MPI_Status status;
23 MPI_Wait(&request, &status);
24 return status;
25 }
26
27 template <POD_t DataType>
28 static int _send_unsafe(MPI_Request& request,
29 DataType* buf,
30 size_t buf_size,
31 size_t dest,
32 size_t tag) noexcept
33 {
34 return MPI_Isend(buf,
35 buf_size,
37 dest,
38 tag,
39 MPI_COMM_WORLD,
40 &request);
41 }
42 template <POD_t DataType>
43 int send(MPI_Request& request, DataType data, size_t dest, size_t tag)
44 {
45 return _send_unsafe<DataType>(request, &data, 1, dest, tag);
46 }
47
48 template <POD_t DataType>
49 int send_v(MPI_Request& request,
50 std::span<const DataType> data,
51 size_t dest,
52 size_t tag,
53 bool send_size) noexcept
54 {
55 int send_status = MPI_SUCCESS;
56
57 if (send_size)
58 {
59 send_status = send<size_t>(request, data.size(), dest, tag);
60 }
61
62 if (send_status == MPI_SUCCESS)
63 {
64 send_status = _send_unsafe(request, data.data(), data.size(), dest, tag);
65 }
66
67 return send_status;
68 }
69
70 template <POD_t DataType>
71 int recv_span(MPI_Request& request,
72 std::span<DataType> buf,
73 size_t src,
74 size_t tag) noexcept
75 {
76 return MPI_Irecv(buf.data(),
77 buf.size(),
79 src,
80 tag,
81 MPI_COMM_WORLD,
82 &request);
83 }
84
85} // namespace WrapMPI::Async
86
87#endif
Definition impl_async.hpp:18
int send_v(MPI_Request &request, std::span< const DataType > data, size_t dest, size_t tag, bool send_size) noexcept
Definition impl_async.hpp:49
int recv_span(MPI_Request &request, std::span< DataType > buf, size_t src, size_t tag) noexcept
Definition impl_async.hpp:71
static int _send_unsafe(MPI_Request &request, DataType *buf, size_t buf_size, size_t dest, size_t tag) noexcept
Definition impl_async.hpp:28
MPI_Status wait(MPI_Request &request)
Definition impl_async.hpp:20
int send(MPI_Request &request, DataType data, size_t dest, size_t tag)
Definition impl_async.hpp:43
constexpr MPI_Datatype get_type() noexcept
Definition mpi_types.hpp:11