Loading [MathJax]/extensions/tex2jax.js
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 <mpi_w/message_t.hpp>
6#include <mpi_w/mpi_types.hpp>
7
8#include <common/execinfo.hpp>
9#include <cstddef>
10#include <limits>
11#include <math.h>
12#include <mpi.h>
13#include <optional>
14#include <span>
15#include <stdexcept>
16#include <vector>
17
19{
20
21 inline MPI_Status wait(MPI_Request& request)
22 {
23 MPI_Status status;
24 MPI_Wait(&request, &status);
25 return status;
26 }
27
28 template <POD_t DataType>
29 static int _send_unsafe(
30 MPI_Request& request, DataType* buf, size_t buf_size, size_t dest, size_t tag) noexcept
31 {
32 return MPI_Isend(buf, buf_size, get_type<DataType>(), dest, tag, MPI_COMM_WORLD, &request);
33 }
34 template <POD_t DataType> int send(MPI_Request& request, DataType data, size_t dest, size_t tag)
35 {
36 return _send_unsafe<DataType>(request, &data, 1, dest, tag);
37 }
38
39 template <POD_t DataType>
40 int send_v(MPI_Request& request,
41 std::span<const DataType> data,
42 size_t dest,
43 size_t tag,
44 bool send_size) noexcept
45 {
46 int send_status = MPI_SUCCESS;
47
48 if (send_size)
49 {
50 send_status = send<size_t>(request, data.size(), dest, tag);
51 }
52
53 if (send_status == MPI_SUCCESS)
54 {
55 send_status = _send_unsafe(request, data.data(), data.size(), dest, tag);
56 }
57
58 return send_status;
59 }
60
61 template <POD_t DataType>
62 int recv_span(MPI_Request& request, std::span<DataType> buf, size_t src, size_t tag) noexcept
63 {
64 return MPI_Irecv(
65 buf.data(), buf.size(), get_type<DataType>(), src, tag, MPI_COMM_WORLD, &request);
66 }
67
68} // namespace WrapMPI::Async
69
70#endif
Definition impl_async.hpp:19
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:40
int recv_span(MPI_Request &request, std::span< DataType > buf, size_t src, size_t tag) noexcept
Definition impl_async.hpp:62
static int _send_unsafe(MPI_Request &request, DataType *buf, size_t buf_size, size_t dest, size_t tag) noexcept
Definition impl_async.hpp:29
MPI_Status wait(MPI_Request &request)
Definition impl_async.hpp:21
int send(MPI_Request &request, DataType data, size_t dest, size_t tag)
Definition impl_async.hpp:34
constexpr MPI_Datatype get_type() noexcept
Definition mpi_types.hpp:11