//@HEADER // ************************************************************************ // // Kokkos v. 4.0 // Copyright (2022) National Technology & Engineering // Solutions of Sandia, LLC (NTESS). // // Under the terms of Contract DE-NA0003525 with NTESS, // the U.S. Government retains certain rights in this software. // // Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. // See https://kokkos.org/LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //@HEADER #include #include #include #include namespace Test { template struct NestedView { Kokkos::View member; public: KOKKOS_INLINE_FUNCTION NestedView() : member() {} KOKKOS_INLINE_FUNCTION NestedView &operator=(const Kokkos::View &lhs) { member = lhs; if (member.extent(0)) Kokkos::atomic_add(&member(0), 1); return *this; } KOKKOS_INLINE_FUNCTION ~NestedView() { if (member.extent(0)) { Kokkos::atomic_add(&member(0), -1); } } }; template struct NestedViewFunctor { Kokkos::View *, Space> nested; Kokkos::View array; NestedViewFunctor(const Kokkos::View *, Space> &arg_nested, const Kokkos::View &arg_array) : nested(arg_nested), array(arg_array) {} KOKKOS_INLINE_FUNCTION void operator()(int i) const { nested[i] = array; } }; template void view_nested_view() { Kokkos::View tracking("tracking", 1); typename Kokkos::View::HostMirror host_tracking = Kokkos::create_mirror(tracking); { Kokkos::View *, Space> a("a_nested_view", 2); Kokkos::parallel_for(Kokkos::RangePolicy(0, 2), NestedViewFunctor(a, tracking)); Kokkos::deep_copy(host_tracking, tracking); ASSERT_EQ(2, host_tracking(0)); Kokkos::View *, Space> b("b_nested_view", 2); Kokkos::parallel_for(Kokkos::RangePolicy(0, 2), NestedViewFunctor(b, tracking)); Kokkos::deep_copy(host_tracking, tracking); ASSERT_EQ(4, host_tracking(0)); } Kokkos::deep_copy(host_tracking, tracking); ASSERT_EQ(0, host_tracking(0)); } TEST(TEST_CATEGORY, view_nested_view) { view_nested_view(); } } // namespace Test