Skip to content

Commit

Permalink
Specialization of AdiosView to accept a Kokkos::View
Browse files Browse the repository at this point in the history
  • Loading branch information
anagainaru committed Aug 23, 2022
1 parent 734403b commit 8b93793
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 36 deletions.
8 changes: 6 additions & 2 deletions bindings/CXX11/adios2/cxx11/ADIOSView.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@

namespace adios2
{
template <class T>
class AdiosView;
template <typename T, class... Parameters>
class AdiosView
{
public:
AdiosView() = delete;
};
}

#endif /* ADIOS2_BINDINGS_CXX11_CXX11_ADIOSVIEW_H_ */
36 changes: 10 additions & 26 deletions bindings/CXX11/adios2/cxx11/Engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,23 +212,15 @@ class Engine
* always sync
*/
template <class T, typename U,
class = typename std::enable_if<!std::is_same<
U, std::vector<typename U::value_type>>::value>::type>
class = typename std::enable_if<
std::is_convertible<U, AdiosView<U>>::value>::type>
void Put(Variable<T> variable, U const &data,
const Mode launch = Mode::Deferred)
{
Put(variable, static_cast<AdiosView<T>>(data), launch);
}

/* Level of indirection needed to be able to pass a Kokkos::View without
* explicitly passing the data type*/
template <class T>
void Put(Variable<T> variable, AdiosView<T> const &data,
const Mode launch = Mode::Deferred)
{
auto mem_space = data.memory_space();
auto adios_data = static_cast<AdiosView<U>>(data);
auto mem_space = adios_data.memory_space();
variable.SetMemorySpace(mem_space);
Put(variable, static_cast<T *>(data.data()), launch);
Put(variable, static_cast<T *>(adios_data.data()), launch);
}

/** Perform all Put calls in Deferred mode up to this point. Specifically,
Expand Down Expand Up @@ -431,23 +423,15 @@ class Engine
* always sync
*/
template <class T, typename U,
class = typename std::enable_if<!std::is_same<
U, std::vector<typename U::value_type>>::value>::type>
class = typename std::enable_if<
std::is_convertible<U, AdiosView<U>>::value>::type>
void Get(Variable<T> variable, U const &data,
const Mode launch = Mode::Deferred)
{
Get(variable, static_cast<AdiosView<T>>(data), launch);
}

/* Level of indirection needed to be able to pass a Kokkos::View without
* explicitly passing the data type*/
template <class T>
void Get(Variable<T> variable, AdiosView<T> const &data,
const Mode launch = Mode::Deferred)
{
auto mem_space = data.memory_space();
auto adios_data = static_cast<AdiosView<U>>(data);
auto mem_space = adios_data.memory_space();
variable.SetMemorySpace(mem_space);
Get(variable, data.data(), launch);
Get(variable, adios_data.data(), launch);
}

/** Perform all Get calls in Deferred mode up to this point */
Expand Down
16 changes: 8 additions & 8 deletions bindings/CXX11/adios2/cxx11/KokkosView.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,23 +29,23 @@ struct memspace_kokkos_to_adios2<Kokkos::CudaSpace>

} // namespace detail

template <class T>
class AdiosView
template <class T, class... Parameters>
class AdiosView<Kokkos::View<T, Parameters...>>
{
T *pointer;
T pointer;
adios2::MemorySpace mem_space;

public:
template <class D, class... P>
AdiosView(Kokkos::View<D, P...> v)
template <class... P>
AdiosView(Kokkos::View<T, P...> v)
{
pointer = v.data();
mem_space = detail::memspace_kokkos_to_adios2<
typename Kokkos::View<D, P...>::memory_space>::value;
typename Kokkos::View<T, P...>::memory_space>::value;
}

T *data() { return pointer; }
T *data() const { return pointer; }
T data() { return pointer; }
T data() const { return pointer; }
adios2::MemorySpace memory_space() { return mem_space; }
adios2::MemorySpace memory_space() const { return mem_space; }
};
Expand Down

0 comments on commit 8b93793

Please sign in to comment.