//@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 #ifndef KOKKOS_ENABLE_CXX17 #include #endif template void test_atomic_accessor() { using value_type = std::remove_const_t; Kokkos::View v("V", 100); Kokkos::parallel_for( Kokkos::RangePolicy(0, v.extent(0)), KOKKOS_LAMBDA(int i) { v(i) = i; }); int errors; using acc_t = Kokkos::Impl::AtomicAccessorRelaxed; acc_t acc{}; typename acc_t::data_handle_type ptr = v.data(); Kokkos::parallel_reduce( Kokkos::RangePolicy(0, v.extent(0)), KOKKOS_LAMBDA(int i, int& error) { if (acc.access(ptr, i) != ptr[i]) error++; if (acc.offset(ptr, i) != ptr + i) error++; static_assert(std::is_same_v); static_assert( std::is_same_v>); static_assert(std::is_same_v); static_assert(std::is_same_v); static_assert(std::is_same_v); static_assert(std::is_same_v); static_assert(std::is_nothrow_move_constructible_v); static_assert(std::is_nothrow_move_assignable_v); static_assert(std::is_nothrow_swappable_v); static_assert(std::is_trivially_copyable_v); static_assert(std::is_trivially_default_constructible_v); static_assert(std::is_trivially_constructible_v); static_assert(std::is_trivially_move_constructible_v); static_assert(std::is_trivially_assignable_v); static_assert(std::is_trivially_move_assignable_v); #ifndef KOKKOS_ENABLE_CXX17 static_assert(std::copyable); static_assert(std::is_empty_v); #endif }, errors); ASSERT_EQ(errors, 0); } void test_atomic_accessor_conversion() { using ExecutionSpace = TEST_EXECSPACE; using T = float; using acc_t = Kokkos::Impl::AtomicAccessorRelaxed; using const_acc_t = Kokkos::Impl::AtomicAccessorRelaxed; using int_acc_t = Kokkos::Impl::AtomicAccessorRelaxed; using defacc_t = Kokkos::default_accessor; using const_defacc_t = Kokkos::default_accessor; using int_defacc_t = Kokkos::default_accessor; Kokkos::parallel_for( Kokkos::RangePolicy(0, 1), KOKKOS_LAMBDA(int) { static_assert(std::is_constructible_v); static_assert(std::is_convertible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(std::is_constructible_v); static_assert(std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(std::is_constructible_v); static_assert(std::is_constructible_v); static_assert(std::is_constructible_v); static_assert(std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(std::is_convertible_v); static_assert(std::is_convertible_v); static_assert(std::is_convertible_v); static_assert(std::is_convertible_v); static_assert(!std::is_convertible_v); static_assert(!std::is_convertible_v); static_assert(!std::is_convertible_v); }); } TEST(TEST_CATEGORY, mdspan_atomic_accessor) { using ExecutionSpace = TEST_EXECSPACE; test_atomic_accessor(); test_atomic_accessor(); }