Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Provide
kokkos_swap
as part of Core and deprecate `Experimental::sw…
…ap` in Algorithms (#6697) * Move Kokkos_Swap.hpp header to core * Include only what we use (in <Kokkos_Swap.hpp>) * Rename header guards in <Kokkos_Swap.hpp> (because I can) * Drop useless comment * Fix noexcept specification of Kokkos::swap * Constexprify Kokkos::swap * Fixup type requirements in Kokkos::swap * Drop the inline (because I can) * fixup! Move Kokkos_Swap.hpp header to core * Promote swap to namespace Kokkos:: * Move and update Kokkos::swap unit test to core * Add support for swapping arrays * Fixup size_t * Provide Kokkos::swap overload for a few classes * Rename Kokkos::swap -> Kokkos::kokkos_swap * For backward compatibility provide deprecated Experimental::swap
- Loading branch information
Showing
13 changed files
with
154 additions
and
95 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
//@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 | ||
|
||
#ifndef KOKKOS_SWAP_HPP | ||
#define KOKKOS_SWAP_HPP | ||
|
||
#include <Kokkos_Macros.hpp> | ||
|
||
#include <cstddef> | ||
#include <type_traits> | ||
#include <utility> | ||
|
||
namespace Kokkos { | ||
|
||
template <class T> | ||
KOKKOS_FUNCTION constexpr std::enable_if_t<std::is_move_constructible_v<T> && | ||
std::is_move_assignable_v<T>> | ||
kokkos_swap(T& a, T& b) noexcept(std::is_nothrow_move_constructible_v<T>&& | ||
std::is_nothrow_move_assignable_v<T>) { | ||
T t(std::move(a)); | ||
a = std::move(b); | ||
b = std::move(t); | ||
} | ||
|
||
namespace Impl { | ||
|
||
template <class T> | ||
struct is_swappable { | ||
template <class U> | ||
static decltype(kokkos_swap(std::declval<T&>(), std::declval<T&>())) | ||
test_swap(int); | ||
struct Nope; | ||
template <class U> | ||
static Nope test_swap(long); | ||
static constexpr bool value = | ||
!std::is_same_v<decltype(test_swap<T>(0)), Nope>; | ||
}; | ||
|
||
template <class T> | ||
inline constexpr bool is_nothrow_swappable_v = | ||
noexcept(kokkos_swap(std::declval<T&>(), std::declval<T&>())); | ||
|
||
} // namespace Impl | ||
|
||
template <class T, std::size_t N> | ||
KOKKOS_FUNCTION constexpr std::enable_if_t<Impl::is_swappable<T>::value> | ||
kokkos_swap(T (&a)[N], T (&b)[N]) noexcept(Impl::is_nothrow_swappable_v<T>) { | ||
for (std::size_t i = 0; i < N; ++i) { | ||
kokkos_swap(a[i], b[i]); | ||
} | ||
} | ||
|
||
} // namespace Kokkos | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
//@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 <gtest/gtest.h> | ||
|
||
#include <Kokkos_Core.hpp> | ||
#include <type_traits> | ||
#include <utility> | ||
|
||
namespace { | ||
|
||
template <class ExecutionSpace> | ||
struct TestSwap { | ||
KOKKOS_FUNCTION void operator()(int, int& err) const { | ||
{ | ||
int a = 1; | ||
int b = 2; | ||
Kokkos::kokkos_swap(a, b); | ||
if (!(a == 2 && b == 1)) { | ||
Kokkos::printf("Failed Kokkos::kokkos_swap(int, int)\n"); | ||
++err; | ||
} | ||
} | ||
{ | ||
float a = 1; | ||
float b = 2; | ||
Kokkos::kokkos_swap(a, b); | ||
if (!(a == 2 && b == 1)) { | ||
Kokkos::printf("Failed Kokkos::kokkos_swap(float, float)\n"); | ||
++err; | ||
} | ||
} | ||
{ | ||
int a[3] = {1, 2, 3}; | ||
int b[3] = {4, 5, 6}; | ||
Kokkos::kokkos_swap(a, b); | ||
if (!(a[0] == 4 && a[1] == 5 && a[2] == 6 && b[0] == 1 && b[1] == 2 && | ||
b[2] == 3)) { | ||
Kokkos::printf("Failed Kokkos::kokkos_swap(int[3], int[3])\n"); | ||
++err; | ||
} | ||
} | ||
} | ||
|
||
TestSwap() { | ||
int errors; | ||
Kokkos::parallel_reduce( | ||
"TestSwap", Kokkos::RangePolicy<ExecutionSpace>(0, 1), *this, errors); | ||
EXPECT_EQ(errors, 0); | ||
} | ||
}; | ||
|
||
TEST(TEST_CATEGORY, kokkos_swap) { TestSwap<TEST_EXECSPACE>(); } | ||
|
||
} // namespace |