20#include <kassert/kassert.hpp>
23#include "kamping/communicator.hpp"
25#include "kamping/implementation_helpers.hpp"
31#include "kamping/p2p/helpers.hpp"
63 template <
typename...>
64 typename DefaultContainerType,
65 template <
typename,
template <
typename...>
typename>
67template <
typename... Args>
76 auto&&
send_buf = internal::select_parameter_type<internal::ParameterType::send_buf>(
args...)
86 auto&&
send_type = internal::determine_mpi_send_datatype<send_value_type>(
args...);
90 internal::select_parameter_type_or_default<internal::ParameterType::send_count, default_send_count_type>(
94 .construct_buffer_or_rebind();
95 if constexpr (has_to_be_computed<
decltype(
send_count)>) {
99 auto const&
destination = internal::select_parameter_type<internal::ParameterType::destination>(
args...);
100 constexpr auto rank_type = std::remove_reference_t<
decltype(
destination)>::rank_type;
102 rank_type == RankType::value || rank_type == RankType::null,
103 "Please provide an explicit destination or destination(ranks::null)."
108 auto&&
tag_param = internal::select_parameter_type_or_default<internal::ParameterType::tag, default_tag_buf_type>(
109 std::tuple(this->default_tag()),
115 std::remove_reference_t<
decltype(
tag_param)>::tag_type == TagType::value,
116 "Please provide a tag for the message."
127 using send_mode =
typename std::remove_reference_t<send_mode_obj_type>::send_mode;
130 KASSERT(is_valid_rank_in_comm(
destination, *
this,
true,
false),
"Invalid destination rank.");
132 if constexpr (std::is_same_v<send_mode, internal::standard_mode_t>) {
139 this->mpi_communicator()
141 this->mpi_error_hook(
err,
"MPI_Send");
142 }
else if constexpr (std::is_same_v<send_mode, internal::buffered_mode_t>) {
149 this->mpi_communicator()
151 this->mpi_error_hook(
err,
"MPI_Bsend");
152 }
else if constexpr (std::is_same_v<send_mode, internal::synchronous_mode_t>) {
159 this->mpi_communicator()
161 this->mpi_error_hook(
err,
"MPI_Ssend");
162 }
else if constexpr (std::is_same_v<send_mode, internal::ready_mode_t>) {
169 this->mpi_communicator()
171 this->mpi_error_hook(
err,
"MPI_Rsend");
178 template <
typename...>
180 template <
typename,
template <
typename...>
typename>
182template <
typename...
Args>
184 this->send(std::forward<Args>(
args)...,
send_mode(send_modes::buffered));
190 template <
typename...>
192 template <
typename,
template <
typename...>
typename>
194template <
typename...
Args>
196 this->send(std::forward<Args>(
args)...,
send_mode(send_modes::synchronous));
202 template <
typename...>
204 template <
typename,
template <
typename...>
typename>
206template <
typename...
Args>
208 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 tag(internal::any_tag_t)
Indicates to use MPI_ANY_TAG as tag in the underlying call.
Definition named_parameters.hpp:1064
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:999
auto send_mode(SendModeTag)
Passes the send mode parameter for point to point communication to the underlying call....
Definition named_parameters.hpp:1137
auto send_count(int count)
Passes count as send count to the underlying call.
Definition named_parameters.hpp:321
auto send_type(MPI_Datatype send_type)
Passes send_type as send type to the underlying call.
Definition named_parameters.hpp:1195
auto send_buf(internal::ignore_t< Data > ignore)
Generates a dummy send buf that wraps a nullptr.
Definition named_parameters.hpp:51
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:347
void bsend(Args... args) const
Convenience wrapper for MPI_Bsend. Calls kamping::Communicator::send() with the appropriate send mode...
Definition send.hpp:183
void send(Args... args) const
Definition send.hpp:68
void rsend(Args... args) const
Convenience wrapper for MPI_Rsend. Calls kamping::Communicator::send() with the appropriate send mode...
Definition send.hpp:207
void ssend(Args... args) const
Convenience wrapper for MPI_Ssend. Calls kamping::Communicator::send() with the appropriate send mode...
Definition send.hpp:195
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.
Utility that maps C++ types to types that can be understood by MPI.
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