10 #ifndef TPETRA_DETAILS_DUALVIEWUTIL_HPP
11 #define TPETRA_DETAILS_DUALVIEWUTIL_HPP
13 #include "TpetraCore_config.h"
14 #include "Kokkos_DualView.hpp"
15 #include "Teuchos_ArrayView.hpp"
29 auto view_alloc_no_init(
const std::string& label) -> decltype(Kokkos::view_alloc(label, Kokkos::WithoutInitializing));
35 template <
class ElementType,
class DeviceType>
37 const typename Kokkos::DualView<ElementType*, DeviceType>::t_host& hostView) {
38 using execution_space =
typename DeviceType::execution_space;
39 using dual_view_type = Kokkos::DualView<ElementType*, DeviceType>;
41 if constexpr (Kokkos::SpaceAccessibility<Kokkos::HostSpace, typename DeviceType::memory_space>::accessible) {
43 dv = dual_view_type(hostView, hostView);
45 typename Kokkos::DualView<ElementType*, DeviceType>::t_dev devView;
46 if (dv.extent(0) == hostView.extent(0))
47 devView = dv.view_device();
49 devView = Kokkos::create_mirror_view(DeviceType(), hostView);
52 dv = dual_view_type(devView, hostView);
53 execution_space().fence();
57 template <
class ElementType,
class DeviceType>
58 void makeDualViewFromArrayView(Kokkos::DualView<ElementType*, DeviceType>& dv,
59 const Teuchos::ArrayView<const ElementType>& av,
60 const std::string& label) {
61 using execution_space =
typename DeviceType::execution_space;
62 using dual_view_type = Kokkos::DualView<ElementType*, DeviceType>;
63 using host_view_type =
typename dual_view_type::t_host;
64 using const_host_view_type =
typename host_view_type::const_type;
66 const auto size = av.size();
67 const ElementType* ptr = (size == 0) ?
nullptr : av.getRawPtr();
68 const_host_view_type inView(ptr, size);
76 template <
class ElementType,
class DeviceType>
77 void makeDualViewFromVector(Kokkos::DualView<ElementType*, DeviceType>& dv,
78 const std::vector<ElementType>& vec,
79 const std::string& label) {
80 using dual_view_type = Kokkos::DualView<ElementType*, DeviceType>;
81 using execution_space =
typename DeviceType::execution_space;
82 using host_view_type =
typename dual_view_type::t_host;
83 using const_host_view_type =
typename host_view_type::const_type;
85 const auto size = vec.size();
86 const ElementType* ptr = (size == 0) ?
nullptr : vec.data();
87 const_host_view_type inView(ptr, size);
95 template <
class ElementType,
class DeviceType>
96 void printDualView(std::ostream& out,
97 const Kokkos::DualView<ElementType*, DeviceType>& dv,
98 const std::string& name) {
100 const size_t size = size_t(dv.extent(0));
101 const auto hostView = dv.view_host();
104 for (
size_t k = 0; k < size; ++k) {
106 if (k +
size_t(1) < size) {
117 #endif // TPETRA_DETAILS_DUALVIEWUTIL_HPP
void deep_copy(MultiVector< DS, DL, DG, DN > &dst, const MultiVector< SS, SL, SG, SN > &src)
Copy the contents of the MultiVector src into dst.
auto view_alloc_no_init(const std::string &label) -> decltype(Kokkos::view_alloc(label, Kokkos::WithoutInitializing))
Use in place of the string label as the first argument of Kokkos::View's constructor, in case you want to allocate without initializing.
void makeDualViewFromOwningHostView(Kokkos::DualView< ElementType *, DeviceType > &dv, const typename Kokkos::DualView< ElementType *, DeviceType >::t_host &hostView)
Initialize dv such that its host View is hostView.