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"
30 decltype (Kokkos::view_alloc (label, Kokkos::WithoutInitializing));
36 template<
class ElementType,
class DeviceType>
39 (Kokkos::DualView<ElementType*, DeviceType>& dv,
40 const typename Kokkos::DualView<ElementType*, DeviceType>::t_host& hostView)
42 using execution_space =
typename DeviceType::execution_space;
43 using dual_view_type = Kokkos::DualView<ElementType*, DeviceType>;
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();
56 template<
class ElementType,
class DeviceType>
58 makeDualViewFromArrayView (Kokkos::DualView<ElementType*, DeviceType>& dv,
59 const Teuchos::ArrayView<const ElementType>& av,
60 const std::string& label)
62 using execution_space =
typename DeviceType::execution_space;
63 using dual_view_type = Kokkos::DualView<ElementType*, DeviceType>;
64 using host_view_type =
typename dual_view_type::t_host;
65 using const_host_view_type =
typename host_view_type::const_type;
67 const auto size = av.size ();
68 const ElementType* ptr = (size == 0) ?
nullptr : av.getRawPtr ();
69 const_host_view_type inView (ptr, size);
77 template<
class ElementType,
class DeviceType>
79 makeDualViewFromVector (Kokkos::DualView<ElementType*, DeviceType>& dv,
80 const std::vector<ElementType>& vec,
81 const std::string& label)
83 using dual_view_type = Kokkos::DualView<ElementType*, DeviceType>;
84 using execution_space =
typename DeviceType::execution_space;
85 using host_view_type =
typename dual_view_type::t_host;
86 using const_host_view_type =
typename host_view_type::const_type;
88 const auto size = vec.size ();
89 const ElementType* ptr = (size == 0) ?
nullptr : vec.data ();
90 const_host_view_type inView (ptr, size);
98 template<
class ElementType,
class DeviceType>
100 printDualView (std::ostream& out,
101 const Kokkos::DualView<ElementType*, DeviceType>& dv,
102 const std::string& name)
105 const size_t size = size_t (dv.extent (0));
106 const auto hostView = dv.view_host ();
109 for (
size_t k = 0; k < size; ++k) {
111 if (k +
size_t (1) < size) {
122 #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) ->
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.