//@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 namespace Test { __global__ void test_abort() { Kokkos::abort("test_abort"); } __global__ void test_hip_spaces_int_value(int *ptr) { if (*ptr == 42) { *ptr = 2 * 42; } } TEST(hip, space_access) { static_assert(Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( Kokkos::Impl::MemorySpaceAccess::assignable); static_assert(!Kokkos::Impl::MemorySpaceAccess::assignable); #if !defined(KOKKOS_ENABLE_IMPL_HIP_UNIFIED_MEMORY) static_assert(!Kokkos::Impl::MemorySpaceAccess::accessible); #else static_assert(Kokkos::Impl::MemorySpaceAccess::accessible); #endif static_assert( !Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( Kokkos::Impl::MemorySpaceAccess::accessible); //-------------------------------------- static_assert(Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( !Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( Kokkos::Impl::MemorySpaceAccess::accessible); static_assert( !Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( !Kokkos::Impl::MemorySpaceAccess::accessible); static_assert( Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( Kokkos::Impl::MemorySpaceAccess::accessible); //-------------------------------------- static_assert( Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( !Kokkos::Impl::MemorySpaceAccess::assignable); static_assert(Kokkos::Impl::MemorySpaceAccess::accessible); static_assert(!Kokkos::Impl::MemorySpaceAccess::assignable); static_assert(!Kokkos::Impl::MemorySpaceAccess::accessible); static_assert( !Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( Kokkos::Impl::MemorySpaceAccess::accessible); //-------------------------------------- static_assert( Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( !Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( !Kokkos::Impl::MemorySpaceAccess::accessible); static_assert(!Kokkos::Impl::MemorySpaceAccess::assignable); static_assert(Kokkos::Impl::MemorySpaceAccess::accessible); static_assert( !Kokkos::Impl::MemorySpaceAccess::assignable); static_assert( Kokkos::Impl::MemorySpaceAccess::accessible); //-------------------------------------- static_assert( !Kokkos::SpaceAccessibility::accessible); static_assert( Kokkos::SpaceAccessibility::accessible); static_assert( Kokkos::SpaceAccessibility::accessible); static_assert( Kokkos::SpaceAccessibility::accessible); #if !defined(KOKKOS_ENABLE_IMPL_HIP_UNIFIED_MEMORY) static_assert(!Kokkos::SpaceAccessibility::accessible); #else static_assert(Kokkos::SpaceAccessibility::accessible); #endif static_assert( Kokkos::SpaceAccessibility::accessible); static_assert( Kokkos::SpaceAccessibility::accessible); #if !defined(KOKKOS_ENABLE_IMPL_HIP_UNIFIED_MEMORY) static_assert(std::is_same::Space, Kokkos::HostSpace>::value); #else static_assert(std::is_same::Space, Kokkos::Device>::value); #endif static_assert( std::is_same::Space, Kokkos::HIPHostPinnedSpace>::value); static_assert( std::is_same::Space, Kokkos::Device>::value); static_assert( Kokkos::SpaceAccessibility::Space, Kokkos::HostSpace>::accessible); static_assert(Kokkos::SpaceAccessibility< Kokkos::Impl::HostMirror::Space, Kokkos::HostSpace>::accessible); static_assert(Kokkos::SpaceAccessibility< Kokkos::Impl::HostMirror::Space, Kokkos::HostSpace>::accessible); static_assert(Kokkos::SpaceAccessibility< Kokkos::Impl::HostMirror::Space, Kokkos::HostSpace>::accessible); } template struct TestViewHIPAccessible { enum { N = 1000 }; using V = Kokkos::View; V m_base; struct TagInit {}; struct TagTest {}; KOKKOS_INLINE_FUNCTION void operator()(const TagInit &, const int i) const { m_base[i] = i + 1; } KOKKOS_INLINE_FUNCTION void operator()(const TagTest &, const int i, long &error_count) const { if (m_base[i] != i + 1) ++error_count; } TestViewHIPAccessible() : m_base("base", N) {} static void run() { TestViewHIPAccessible self; Kokkos::parallel_for( Kokkos::RangePolicy(0, N), self); typename MemSpace::execution_space().fence(); // Next access is a different execution space, must complete prior kernel. long error_count = -1; Kokkos::parallel_reduce(Kokkos::RangePolicy(0, N), self, error_count); EXPECT_EQ(error_count, 0); } }; TEST(hip, impl_view_accessible) { TestViewHIPAccessible::run(); TestViewHIPAccessible::run(); TestViewHIPAccessible::run(); TestViewHIPAccessible::run(); TestViewHIPAccessible::run(); } } // namespace Test