20#include <kassert/kassert.hpp>
23#include "kamping/communicator.hpp"
24#include "kamping/implementation_helpers.hpp"
29#include "kamping/p2p/helpers.hpp"
61 template <
typename...>
62 typename DefaultContainerType,
63 template <
typename,
template <
typename...>
typename>
65template <
typename... Args>
74 auto send_buf = internal::select_parameter_type<internal::ParameterType::send_buf>(
args...)
84 auto send_type = internal::determine_mpi_send_datatype<send_value_type>(
args...);
88 internal::select_parameter_type_or_default<internal::ParameterType::send_count, default_send_count_type>(
92 .construct_buffer_or_rebind();
93 if constexpr (has_to_be_computed<
decltype(
send_count)>) {
97 auto const&
destination = internal::select_parameter_type<internal::ParameterType::destination>(
args...);
98 constexpr auto rank_type = std::remove_reference_t<
decltype(
destination)>::rank_type;
100 rank_type == RankType::value || rank_type == RankType::null,
101 "Please provide an explicit destination or destination(ranks::null)."
106 auto&&
tag_param = internal::select_parameter_type_or_default<internal::ParameterType::tag, default_tag_buf_type>(
107 std::tuple(this->default_tag()),
113 std::remove_reference_t<
decltype(
tag_param)>::tag_type == TagType::value,
114 "Please provide a tag for the message."
126 using send_mode =
typename std::remove_reference_t<send_mode_obj_type>::send_mode;
129 KASSERT(is_valid_rank_in_comm(
destination, *
this,
true,
false),
"Invalid destination rank.");
131 if constexpr (std::is_same_v<send_mode, internal::standard_mode_t>) {
138 this->mpi_communicator()
140 this->mpi_error_hook(
err,
"MPI_Send");
141 }
else if constexpr (std::is_same_v<send_mode, internal::buffered_mode_t>) {
148 this->mpi_communicator()
150 this->mpi_error_hook(
err,
"MPI_Bsend");
151 }
else if constexpr (std::is_same_v<send_mode, internal::synchronous_mode_t>) {
158 this->mpi_communicator()
160 this->mpi_error_hook(
err,
"MPI_Ssend");
161 }
else if constexpr (std::is_same_v<send_mode, internal::ready_mode_t>) {
168 this->mpi_communicator()
170 this->mpi_error_hook(
err,
"MPI_Rsend");
177 template <
typename...>
179 template <
typename,
template <
typename...>
typename>
181template <
typename...
Args>
183 this->send(std::forward<Args>(
args)...,
send_mode(send_modes::buffered));
189 template <
typename...>
191 template <
typename,
template <
typename...>
typename>
193template <
typename...
Args>
195 this->send(std::forward<Args>(
args)...,
send_mode(send_modes::synchronous));
201 template <
typename...>
203 template <
typename,
template <
typename...>
typename>
205template <
typename...
Args>
207 this->send(std::forward<Args>(
args)...,
send_mode(send_modes::ready));
Wrapper for MPI functions that don't require a communicator. If the template parameter init_finalize_...
Definition environment.hpp:52
STL-compatible allocator for requesting memory using the builtin MPI allocator.
Definition allocator.hpp:32
T value_type
The value type.
Definition allocator.hpp:53
auto send_mode(SendModeTag)
Passes the send mode parameter for point to point communication to the underlying call....
Definition named_parameters.hpp:1201
auto tag(internal::any_tag_t)
Indicates to use MPI_ANY_TAG as tag in the underlying call.
Definition named_parameters.hpp:1066
auto send_count(int count)
Passes count as send count to the underlying call.
Definition named_parameters.hpp:323
auto destination(int rank)
Passes rank as destination rank to the underlying call. This parameter is needed in point-to-point ex...
Definition named_parameters.hpp:1001
auto send_type(MPI_Datatype send_type)
Passes send_type as send type to the underlying call.
Definition named_parameters.hpp:1259
auto send_count_out()
Indicates to deduce the send count and return it to the caller as part of the underlying call's resul...
Definition named_parameters.hpp:349
auto send_buf(internal::ignore_t< Data > ignore)
Generates a dummy send buf that wraps a nullptr.
Definition named_parameters.hpp:53
void bsend(Args... args) const
Convenience wrapper for MPI_Bsend. Calls kamping::Communicator::send() with the appropriate send mode...
Definition send.hpp:182
void send(Args... args) const
Definition send.hpp:66
void rsend(Args... args) const
Convenience wrapper for MPI_Rsend. Calls kamping::Communicator::send() with the appropriate send mode...
Definition send.hpp:206
void ssend(Args... args) const
Convenience wrapper for MPI_Ssend. Calls kamping::Communicator::send() with the appropriate send mode...
Definition send.hpp:194
decltype(auto) select_parameter_type_or_default(std::tuple< DefaultArguments... > default_arguments, Args &... args)
Checks if parameter with requested parameter type exists, if not constructs a default value.
Definition named_parameter_selection.hpp:239
@ send_mode
Tag used to represent the send mode used by a send operation.
Template magic to check named parameters passed to wrappers at compile time.
#define KAMPING_REQUIRED_PARAMETERS(...)
Wrapper to pass (possibly empty) list of parameter type names as required parameters to KAMPING_CHECK...
Definition named_parameter_check.hpp:52
#define KAMPING_OPTIONAL_PARAMETERS(...)
Wrapper to pass (possibly empty) list of parameter type names as optional parameters to KAMPING_CHECK...
Definition named_parameter_check.hpp:58
#define KAMPING_CHECK_PARAMETERS(args, required, optional)
Assertion macro that checks if passed parameters are correct, i.e., all parameter types are unique,...
Definition named_parameter_check.hpp:80
Template magic to implement named parameters in cpp.
File containing the parameter types used by the KaMPIng library.
Factory methods for buffer wrappers.
Internal namespace marking the code that is not user-facing.
Definition collectives_helpers.hpp:20
static constexpr bool buffer_uses_serialization
Checks if DataBufferType is a serialization buffer.
Definition named_parameter_check.hpp:415
Parameter objects return by named parameter factory functions.
Parameter object for send_mode encapsulating the send mode compile-time tag.
Definition parameter_objects.hpp:478