1#ifndef __IMPL_ASYNC_MPI_HPP__
2#define __IMPL_ASYNC_MPI_HPP__
4#include <common/common.hpp>
5#include <common/execinfo.hpp>
9#include <mpi_w/message_t.hpp>
10#include <mpi_w/mpi_types.hpp>
17 template <POD_t DataType>
19 _send_unsafe(MPI_Request& request,
39 PROFILE_SECTION(
"WrapMPI::wait");
41 MPI_Wait(&request, &status);
46 wait(MPI_Request& request, MPI_Status* status)
48 MPI_Wait(&request, status);
51 template <POD_t DataType>
53 send(MPI_Request& request, DataType data,
size_t dest,
size_t tag)
55 return _send_unsafe<DataType>(request, &data, 1, dest, tag);
58 template <POD_t DataType>
61 std::span<const DataType> data,
64 bool send_size)
noexcept
66 int send_status = MPI_SUCCESS;
70 send_status =
send<size_t>(request, data.size(), dest, tag);
73 if (send_status == MPI_SUCCESS)
75 send_status = _send_unsafe(request, data.data(), data.size(), dest, tag);
81 template <POD_t DataType>
84 std::span<DataType> buf,
88 return MPI_Irecv(buf.data(),
97 template <POD_t DataType>
98 std::optional<DataType>
99 recv(
size_t src, MPI_Request& request,
size_t tag)
noexcept
103 int recv_status = MPI_Irecv(
104 &buf,
sizeof(DataType), MPI_BYTE, src, tag, MPI_COMM_WORLD, &request);
105 if (recv_status != MPI_SUCCESS)
118 throw std::invalid_argument(
"Data pointer is null");
120 if (_size == 0 || _size > std::numeric_limits<size_t>::max())
122 throw std::invalid_argument(
"Error size");
126 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
127 if (root >=
static_cast<size_t>(comm_size))
129 throw std::invalid_argument(
"Root process rank is out of range");
132 return MPI_Ibcast(data,
135 static_cast<int>(root),
Definition impl_async.hpp:14
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:60
int recv_span(MPI_Request &request, std::span< DataType > buf, size_t src, size_t tag) noexcept
Definition impl_async.hpp:83
int broadcast_span(std::span< T > data, size_t root, MPI_Request &request)
Definition impl_async.hpp:142
std::optional< DataType > recv(size_t src, MPI_Request &request, size_t tag) noexcept
Definition impl_async.hpp:99
int _broadcast_unsafe(T *data, size_t _size, size_t root, MPI_Request &request)
Definition impl_async.hpp:114
MPI_Status wait(MPI_Request &request)
Definition impl_async.hpp:37
int send(MPI_Request &request, DataType data, size_t dest, size_t tag)
Definition impl_async.hpp:53
constexpr MPI_Datatype get_type() noexcept
Definition mpi_types.hpp:13