1 #ifndef MPI_SPACE_WRAPPER_HPP
2 #define MPI_SPACE_WRAPPER_HPP
28 template<
class SendView,
class RecvView,
class Device,
class F>
34 !std::is_same_v<typename SendView::memory_space, typename Device::memory_space>);
39 auto send_mpi = use_in_place ? recv_mpi :
my_mirror_view(send, Device());
45 user_mpi_call(use_in_place ? MPI_IN_PLACE : send_mpi.data(), recv_mpi.data());
53 template<
class SendView,
class Device,
class F>
55 F&& user_mpi_call, Device nd){
64 user_mpi_call(send_mpi.data());
72 template<
class SendView,
class RecvView>
74 using SendSpace =
typename SendView::memory_space;
75 using RecvSpace =
typename RecvView::memory_space;
76 using MPISpace =
typename MPIDeviceType::memory_space;
82 bool use_device_for_mpi =
false;
84 use_device_for_mpi = gpu_aware_mpi_available;
86 use_device_for_mpi = gpu_aware_mpi_available && (send_view_is_on_device || recv_view_is_on_device);
88 use_device_for_mpi = gpu_aware_mpi_available && (send_view_is_on_device && recv_view_is_on_device);
90 return use_device_for_mpi;
94 template<
class SendView>
96 using SendSpace =
typename SendView::memory_space;
97 using MPISpace =
typename MPIDeviceType::memory_space;
101 bool use_device_for_mpi =
false;
103 use_device_for_mpi = gpu_aware_mpi_available;
105 use_device_for_mpi = gpu_aware_mpi_available;
107 use_device_for_mpi =
false;
109 return use_device_for_mpi;
123 template<
class SendView,
class RecvView,
class F>
128 using value_type =
typename SendView::non_const_value_type;
129 using SendSpace =
typename SendView::memory_space;
130 using RecvSpace =
typename RecvView::memory_space;
132 static_assert(std::is_same_v<
typename SendView::non_const_value_type,
133 typename RecvView::non_const_value_type>,
134 "Send/recv value types must match.");
137 const View<value_type*,CLayout, typename SendView::device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged>> send_unm(send_MD.data(), send_MD.size());
138 const View<value_type*,CLayout, typename RecvView::device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged>> recv_unm(recv_MD.data(), recv_MD.size());
139 const View<value_type*,CLayout, typename SendView::device_type> send = send_unm;
140 const View<value_type*,CLayout, typename RecvView::device_type> recv = recv_unm;
146 if(use_device_for_mpi){
162 template<
class SendView,
class F>
166 using value_type =
typename SendView::non_const_value_type;
167 using SendSpace =
typename SendView::memory_space;
170 const View<value_type*,CLayout, typename SendView::device_type, Kokkos::MemoryTraits<Kokkos::Unmanaged>> send_unm(send_MD.data(), send_MD.size());
171 const View<value_type*,CLayout, typename SendView::device_type> send = send_unm;
177 if(use_device_for_mpi){
MPISpaceOptions
Definition: mpi_space_wrapper.hpp:7
void MPI_space_wrapper(const SendView &send_MD, const RecvView &recv_MD, F &&user_mpi_call, MPISpaceOptions option=MPISpaceOptions::MixedPreferGPUMPI, MPISpaceWrapperOptions in_place_option=MPISpaceWrapperOptions::NotInPlace)
Definition: mpi_space_wrapper.hpp:124
MPISpaceWrapperOptions
Definition: mpi_space_wrapper.hpp:14
bool MPI_choose_space(const SendView &send, const RecvView &recv, MPISpaceOptions option)
Definition: mpi_space_wrapper.hpp:73
void MPI_call_space_wrapper(const SendView &send, const RecvView &recv, F &&user_mpi_call, MPISpaceWrapperOptions option_in_place, Device nd)
Definition: mpi_space_wrapper.hpp:29
void mirror_copy(T1 &view_dest, const T2 &view_src)
Definition: my_mirror_view.hpp:122
View< T *, CLayout, Device > my_mirror_view(const View< T *, CLayout, Device > &view, Device nd)
Definition: my_mirror_view.hpp:14
Definition: col_grid.cpp:127
Kokkos::Device< HostExSpace, HostMemSpace > HostType
Definition: space_settings.hpp:57
Kokkos::Device< ExSpace, MemSpace > DeviceType
Definition: space_settings.hpp:48
Definition: mpi_space_wrapper.hpp:22