Skip to content

Reviving Kokkos Kernels backend #306

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 9 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ inline auto map_execpolicy_with_check = [](auto&& policy) {
using input_type = remove_cvref_t<decltype(policy)>;
using return_type = remove_cvref_t<decltype(execpolicy_mapper(std::forward<decltype(policy)>(policy)))>;
// Only inline_exec_t is allowed to map to itself.
using inline_type = impl::inline_exec_t;
using inline_type = inline_exec_t;
static_assert(std::is_same_v<input_type, inline_type> ||
! std::is_same_v<input_type, return_type>,
"Specializations of execpolicy_mapper must return "
Expand Down
6 changes: 3 additions & 3 deletions tests/kokkos-based/dot_kokkos.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ auto dot_gold_solution(x_t x, y_t y, T initValue, bool useInit)
template<class x_t, class y_t, class T>
void kokkos_blas1_dot_test_impl(x_t x, y_t y, T initValue, bool useInit)
{
namespace stdla = std::experimental::linalg;
namespace stdla = MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::linalg;

using value_type = typename x_t::value_type;
const std::size_t extent = x.extent(0);
Expand All @@ -35,10 +35,10 @@ void kokkos_blas1_dot_test_impl(x_t x, y_t y, T initValue, bool useInit)

T result = {};
if (useInit){
result = stdla::dot(KokkosKernelsSTD::kokkos_exec<>(),
result = stdla::dot(Kokkos::DefaultExecutionSpace(),
x, y, initValue);
}else{
result = stdla::dot(KokkosKernelsSTD::kokkos_exec<>(),
result = stdla::dot(Kokkos::DefaultExecutionSpace(),
x, y);
}

Expand Down
15 changes: 8 additions & 7 deletions tests/kokkos-based/gtest_fixtures.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,18 @@
#ifndef LINALG_TESTS_KOKKOS_BLAS1_FIXTURES_HPP_
#define LINALG_TESTS_KOKKOS_BLAS1_FIXTURES_HPP_

#include <mdspan/mdspan.hpp>
#include <experimental/linalg>
#include <experimental/mdspan>
#include <Kokkos_Core.hpp>
#include "gtest/gtest.h"
#include <random>

// it is fine to put these here even if this
// is a header since this is limited to tests
using std::experimental::mdspan;
using std::experimental::extents;
using std::experimental::dynamic_extent;
using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan;
using MDSPAN_IMPL_STANDARD_NAMESPACE::extents;
using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent;
using MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::dims;

//
// helper class for generating random numbers
Expand Down Expand Up @@ -170,7 +171,7 @@ class _blas1_signed_fixture : public ::testing::Test
Kokkos::View<value_type*, Kokkos::HostSpace> y_view;
Kokkos::View<value_type*, Kokkos::HostSpace> z_view;

using mdspan_t = mdspan<value_type, extents<dynamic_extent>>;
using mdspan_t = mdspan<value_type, dims<1>>;
mdspan_t x;
mdspan_t y;
mdspan_t z;
Expand Down Expand Up @@ -292,8 +293,8 @@ class _blas2_signed_fixture : public ::testing::Test
Kokkos::View<value_type*, Kokkos::HostSpace> y_e0_view;
Kokkos::View<value_type*, Kokkos::HostSpace> z_e0_view;

using mdspan_r1_t = mdspan<value_type, extents<dynamic_extent>>;
using mdspan_r2_t = mdspan<value_type, extents<dynamic_extent, dynamic_extent>>;
using mdspan_r1_t = mdspan<value_type, dims<1>>;
using mdspan_r2_t = mdspan<value_type, dims<2>>;
mdspan_r2_t A_e0e1; //e0 x e1
mdspan_r2_t B_e0e1; //e0 x e1
mdspan_r2_t A_sym_e0; //e0 x e0, symmetric
Expand Down
54 changes: 27 additions & 27 deletions tests/kokkos-based/helpers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
#ifndef LINALG_TESTS_KOKKOS_HELPERS_HPP_
#define LINALG_TESTS_KOKKOS_HELPERS_HPP_

#include <mdspan/mdspan.hpp>
#include <experimental/linalg>
#include <experimental/mdspan>
#include <random>

#if KOKKOS_VERSION < 30699
Expand Down Expand Up @@ -92,9 +92,9 @@ mdspan_t make_mdspan(ValueType *data, std::size_t ext0, std::size_t ext1) {
template<class A_t, class ValueType = typename A_t::value_type>
void set(A_t A, ValueType value)
{
using size_type = typename std::experimental::extents<>::size_type;
for (size_type i = 0; i < A.extent(0); ++i) {
for (size_type j = 0; j < A.extent(1); ++j) {
using index_type = typename MDSPAN_IMPL_STANDARD_NAMESPACE::extents<size_t>::index_type;
for (index_type i = 0; i < A.extent(0); ++i) {
for (index_type j = 0; j < A.extent(1); ++j) {
A(i, j) = value;
}
}
Expand All @@ -106,13 +106,13 @@ template <typename ElementType,
std::size_t Extent,
typename LayoutPolicy,
typename AccessorPolicy>
auto abs_max(mdspan<ElementType, extents<Extent>, LayoutPolicy, AccessorPolicy> v)
auto abs_max(mdspan<ElementType, extents<size_t, Extent>, LayoutPolicy, AccessorPolicy> v)
{
const auto size = v.extent(0);
if (size == 0) {
throw std::runtime_error("abs_max() requires non-empty input");
}
const auto i = std::experimental::linalg::vector_idx_abs_max(v);
const auto i = MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::linalg::vector_idx_abs_max(v);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see comments elsewhere on use of namespace macros vs. hard-coding "Kokkos"; thanks!

if (i >= size) { // shouldn't happen: empty case is handled above
throw std::runtime_error("Fatal: vector_idx_abs_max() failed");
}
Expand All @@ -124,7 +124,7 @@ template <typename ElementType,
std::size_t Extent1,
typename LayoutPolicy,
typename AccessorPolicy>
auto abs_max(mdspan<ElementType, extents<Extent0, Extent1>, LayoutPolicy, AccessorPolicy> A)
auto abs_max(mdspan<ElementType, extents<size_t, Extent0, Extent1>, LayoutPolicy, AccessorPolicy> A)
{
const auto ext0 = A.extent(0);
const auto ext1 = A.extent(1);
Expand Down Expand Up @@ -170,8 +170,8 @@ template <typename ElementType1,
typename LayoutPolicy2,
typename AccessorPolicy2>
bool is_same_vector(
mdspan<ElementType1, extents<Extent1>, LayoutPolicy1, AccessorPolicy1> v1,
mdspan<ElementType2, extents<Extent2>, LayoutPolicy2, AccessorPolicy2> v2)
mdspan<ElementType1, extents<size_t, Extent1>, LayoutPolicy1, AccessorPolicy1> v1,
mdspan<ElementType2, extents<size_t, Extent2>, LayoutPolicy2, AccessorPolicy2> v2)
{
const auto size = v1.extent(0);
if (size != v2.extent(0))
Expand All @@ -196,7 +196,7 @@ template <typename ElementType1,
typename AccessorPolicy,
typename ElementType2>
bool is_same_vector(
mdspan<ElementType1, extents<Extent>, LayoutPolicy, AccessorPolicy> v1,
mdspan<ElementType1, extents<size_t, Extent>, LayoutPolicy, AccessorPolicy> v1,
const std::vector<ElementType2> &v2)
{
return is_same_vector(v1, make_mdspan(v2));
Expand All @@ -209,7 +209,7 @@ template <typename ElementType1,
typename ElementType2>
bool is_same_vector(
const std::vector<ElementType1> &v1,
mdspan<ElementType2, extents<Extent>, LayoutPolicy, AccessorPolicy> v2)
mdspan<ElementType2, extents<size_t, Extent>, LayoutPolicy, AccessorPolicy> v2)
{
return is_same_vector(v2, v1);
}
Expand All @@ -231,8 +231,8 @@ template <typename ElementType1,
typename LayoutPolicy2,
typename AccessorPolicy2>
auto vector_abs_diff(
mdspan<ElementType1, extents<Extent1>, LayoutPolicy1, AccessorPolicy1> v1,
mdspan<ElementType2, extents<Extent2>, LayoutPolicy2, AccessorPolicy2> v2)
mdspan<ElementType1, extents<size_t, Extent1>, LayoutPolicy1, AccessorPolicy1> v1,
mdspan<ElementType2, extents<size_t, Extent2>, LayoutPolicy2, AccessorPolicy2> v2)
{
const auto v1_view = KokkosKernelsSTD::Impl::mdspan_to_view(v1);
const auto v2_view = KokkosKernelsSTD::Impl::mdspan_to_view(v2);
Expand Down Expand Up @@ -260,7 +260,7 @@ template <typename ElementType1,
typename AccessorPolicy,
typename ElementType2>
auto vector_abs_diff(
mdspan<ElementType1, extents<Extent>, LayoutPolicy, AccessorPolicy> v1,
mdspan<ElementType1, extents<size_t, Extent>, LayoutPolicy, AccessorPolicy> v1,
const std::vector<ElementType2> &v2)
{
return vector_abs_diff(v1, make_mdspan(v2));
Expand All @@ -273,7 +273,7 @@ template <typename ElementType1,
typename ElementType2>
auto vector_abs_diff(
const std::vector<ElementType1> &v1,
mdspan<ElementType2, extents<Extent>, LayoutPolicy, AccessorPolicy> v2)
mdspan<ElementType2, extents<size_t, Extent>, LayoutPolicy, AccessorPolicy> v2)
{
return vector_abs_diff(v2, v1);
}
Expand All @@ -295,8 +295,8 @@ template <typename ElementType1,
typename LayoutPolicy2,
typename AccessorPolicy2>
auto vector_rel_diff(
mdspan<ElementType1, extents<Extent1>, LayoutPolicy1, AccessorPolicy1> v1,
mdspan<ElementType2, extents<Extent2>, LayoutPolicy2, AccessorPolicy2> v2)
mdspan<ElementType1, extents<size_t, Extent1>, LayoutPolicy1, AccessorPolicy1> v1,
mdspan<ElementType2, extents<size_t, Extent2>, LayoutPolicy2, AccessorPolicy2> v2)
{
using RetType = decltype(std::abs(v1[0] - v2[0]));
const auto size = v1.extent(0);
Expand All @@ -317,7 +317,7 @@ template <typename ElementType1,
typename AccessorPolicy,
typename ElementType2>
auto vector_rel_diff(
mdspan<ElementType1, extents<Extent1>, LayoutPolicy, AccessorPolicy> v1,
mdspan<ElementType1, extents<size_t, Extent1>, LayoutPolicy, AccessorPolicy> v1,
const std::vector<ElementType2> &v2)
{
return vector_rel_diff(v1, make_mdspan(v2));
Expand All @@ -330,7 +330,7 @@ template <typename ElementType1,
typename ElementType2>
auto vector_rel_diff(
const std::vector<ElementType1> &v1,
mdspan<ElementType2, extents<Extent>, LayoutPolicy, AccessorPolicy> v2)
mdspan<ElementType2, extents<size_t, Extent>, LayoutPolicy, AccessorPolicy> v2)
{
return vector_rel_diff(v2, v1);
}
Expand All @@ -355,8 +355,8 @@ template <typename ElementType1,
typename LayoutPolicy2,
typename AccessorPolicy2>
bool is_same_matrix(
mdspan<ElementType1, extents<Extent10, Extent11>, LayoutPolicy1, AccessorPolicy1> A,
mdspan<ElementType2, extents<Extent20, Extent21>, LayoutPolicy2, AccessorPolicy2> B)
mdspan<ElementType1, extents<size_t, Extent10, Extent11>, LayoutPolicy1, AccessorPolicy1> A,
mdspan<ElementType2, extents<size_t, Extent20, Extent21>, LayoutPolicy2, AccessorPolicy2> B)
{
const auto ext0 = A.extent(0);
const auto ext1 = A.extent(1);
Expand Down Expand Up @@ -384,7 +384,7 @@ template <typename ElementType,
typename LayoutPolicy1,
typename AccessorPolicy1>
bool is_same_matrix(
mdspan<ElementType, extents<Extent0, Extent1>, LayoutPolicy1, AccessorPolicy1> A,
mdspan<ElementType, extents<size_t, Extent0, Extent1>, LayoutPolicy1, AccessorPolicy1> A,
const std::vector<ElementType> &B)
{
return is_same_matrix(A, make_mdspan(B.data(), A.extent(0), A.extent(1)));
Expand All @@ -396,7 +396,7 @@ template <typename ElementType,
typename LayoutPolicy1,
typename AccessorPolicy1>
bool is_same_matrix(const std::vector<ElementType> &A,
mdspan<ElementType, extents<Extent0, Extent1>, LayoutPolicy1, AccessorPolicy1> B)
mdspan<ElementType, extents<size_t, Extent0, Extent1>, LayoutPolicy1, AccessorPolicy1> B)
{
return is_same_matrix(make_mdspan(A.data(), B.extent(0), B.extent(1)), B);
}
Expand All @@ -412,8 +412,8 @@ template <typename ElementType1,
typename LayoutPolicy2,
typename AccessorPolicy2>
auto matrix_abs_diff(
mdspan<ElementType1, extents<Extent10, Extent11>, LayoutPolicy1, AccessorPolicy1> A,
mdspan<ElementType2, extents<Extent20, Extent21>, LayoutPolicy2, AccessorPolicy2> B)
mdspan<ElementType1, extents<size_t, Extent10, Extent11>, LayoutPolicy1, AccessorPolicy1> A,
mdspan<ElementType2, extents<size_t, Extent20, Extent21>, LayoutPolicy2, AccessorPolicy2> B)
{
const auto A_view = KokkosKernelsSTD::Impl::mdspan_to_view(A);
const auto B_view = KokkosKernelsSTD::Impl::mdspan_to_view(B);
Expand Down Expand Up @@ -448,8 +448,8 @@ template <typename ElementType,
typename LayoutPolicy2,
typename AccessorPolicy2>
auto matrix_rel_diff(
mdspan<ElementType, extents<Extent10, Extent11>, LayoutPolicy1, AccessorPolicy1> A,
mdspan<ElementType, extents<Extent20, Extent21>, LayoutPolicy2, AccessorPolicy2> B)
mdspan<ElementType, extents<size_t, Extent10, Extent11>, LayoutPolicy1, AccessorPolicy1> A,
mdspan<ElementType, extents<size_t, Extent20, Extent21>, LayoutPolicy2, AccessorPolicy2> B)
{
using RetType = decltype(std::abs(A(0, 0) - B(0, 0)));
const auto ext0 = A.extent(0);
Expand Down
46 changes: 24 additions & 22 deletions tests/kokkos-based/mdspan_to_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@ void expect_shallow_copy(MDSpanType mdsp, KViewType kv)
template<class MDSpanValueType, class KViewValueType = MDSpanValueType>
void mdspan_to_view_test_impl()
{
using std::experimental::mdspan;
using std::experimental::extents;
using std::experimental::dynamic_extent;
using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan;
using MDSPAN_IMPL_STANDARD_NAMESPACE::extents;
using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent;
using MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::dims;

// rank1, non-const
{
std::vector<MDSpanValueType> a(5);
using mdspan_t = mdspan<MDSpanValueType, extents<dynamic_extent>>;
using mdspan_t = mdspan<MDSpanValueType, dims<1>>;
mdspan_t mdsp(a.data(), a.size());

auto kv = KokkosKernelsSTD::Impl::mdspan_to_view(mdsp);
Expand All @@ -32,7 +33,7 @@ void mdspan_to_view_test_impl()
// rank1, const
{
std::vector<MDSpanValueType> a(5);
using mdspan_t = mdspan<const MDSpanValueType, extents<dynamic_extent>>;
using mdspan_t = mdspan<const MDSpanValueType, dims<1>>;
mdspan_t mdsp(a.data(), a.size());

auto kv = KokkosKernelsSTD::Impl::mdspan_to_view(mdsp);
Expand All @@ -46,7 +47,7 @@ void mdspan_to_view_test_impl()
// rank2, non-const
{
std::vector<MDSpanValueType> a(12);
using mdspan_t = mdspan<MDSpanValueType, extents<dynamic_extent, dynamic_extent>>;
using mdspan_t = mdspan<MDSpanValueType, dims<2>>;
mdspan_t mdsp(a.data(), 3, 4);

auto kv = KokkosKernelsSTD::Impl::mdspan_to_view(mdsp);
Expand All @@ -61,7 +62,7 @@ void mdspan_to_view_test_impl()
// rank2, const
{
std::vector<MDSpanValueType> a(12);
using mdspan_t = mdspan<const MDSpanValueType, extents<dynamic_extent, dynamic_extent>>;
using mdspan_t = mdspan<const MDSpanValueType, dims<2>>;
mdspan_t mdsp(a.data(), 3, 4);

auto kv = KokkosKernelsSTD::Impl::mdspan_to_view(mdsp);
Expand Down Expand Up @@ -94,21 +95,22 @@ TEST(mdspan_to_view, for_complex_double){
template<class MDSpanValueType, class KViewValueType = MDSpanValueType>
void transposed_mdspan_to_view_test_impl()
{
using std::experimental::mdspan;
using std::experimental::extents;
using std::experimental::dynamic_extent;
using MDSPAN_IMPL_STANDARD_NAMESPACE::mdspan;
using MDSPAN_IMPL_STANDARD_NAMESPACE::extents;
using MDSPAN_IMPL_STANDARD_NAMESPACE::dynamic_extent;
using MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::dims;

using lr_t = std::experimental::layout_right;
using ll_t = std::experimental::layout_left;
using lr_t = Kokkos::layout_right;
using ll_t = Kokkos::layout_left;

std::vector<MDSpanValueType> a(12);
std::iota(a.begin(), a.end(), 0);

{
// mdspan is layout right
using mdspan_t = mdspan<MDSpanValueType, extents<dynamic_extent, dynamic_extent>, lr_t>;
using mdspan_t = mdspan<MDSpanValueType, dims<2>, lr_t>;
mdspan_t mdsp(a.data(), 3, 4);
auto mdsp_T = std::experimental::linalg::transposed(mdsp);
auto mdsp_T = MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::linalg::transposed(mdsp);

auto kv = KokkosKernelsSTD::Impl::mdspan_to_view(mdsp_T);
using kv_type = decltype(kv);
Expand All @@ -117,9 +119,9 @@ void transposed_mdspan_to_view_test_impl()

// the conversion from transposed() to view basically discards the transposition
// so behaves as if we were tranposing the nested mspan directly
static_assert(std::is_same_v<typename kv_type::array_layout, Kokkos::LayoutRight>);
EXPECT_TRUE(kv.extent(0) == 3);
EXPECT_TRUE(kv.extent(1) == 4);
static_assert(std::is_same_v<typename kv_type::array_layout, Kokkos::LayoutLeft>);
EXPECT_TRUE(kv.extent(0) == 4);
EXPECT_TRUE(kv.extent(1) == 3);
expect_shallow_copy(mdsp, kv);

int count=0;
Expand All @@ -134,9 +136,9 @@ void transposed_mdspan_to_view_test_impl()

{
// mdspan is layout left
using mdspan_t = mdspan<MDSpanValueType, extents<dynamic_extent, dynamic_extent>, ll_t>;
using mdspan_t = mdspan<MDSpanValueType, dims<2>, ll_t>;
mdspan_t mdsp(a.data(), 3, 4);
auto mdsp_T = std::experimental::linalg::transposed(mdsp);
auto mdsp_T = MDSPAN_IMPL_STANDARD_NAMESPACE::MDSPAN_IMPL_PROPOSED_NAMESPACE::linalg::transposed(mdsp);

auto kv = KokkosKernelsSTD::Impl::mdspan_to_view(mdsp_T);
using kv_type = decltype(kv);
Expand All @@ -145,9 +147,9 @@ void transposed_mdspan_to_view_test_impl()

// the conversion from transposed() to view basically discards the transposition
// so behaves as if we were tranposing the nested mspan directly
static_assert(std::is_same_v<typename kv_type::array_layout, Kokkos::LayoutLeft>);
EXPECT_TRUE(kv.extent(0) == 3);
EXPECT_TRUE(kv.extent(1) == 4);
static_assert(std::is_same_v<typename kv_type::array_layout, Kokkos::LayoutRight>);
EXPECT_TRUE(kv.extent(0) == 4);
EXPECT_TRUE(kv.extent(1) == 3);
expect_shallow_copy(mdsp, kv);

int count=0;
Expand Down
4 changes: 0 additions & 4 deletions tests/native/conjugated.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,10 +290,6 @@ namespace {
{
using MDSPAN_IMPL_STANDARD_NAMESPACE :: MDSPAN_IMPL_PROPOSED_NAMESPACE :: linalg::impl::has_conj;

static_assert(! has_conj<int>::value);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just curious -- what was wrong with these static_asserts? Why was this test affected by the kokkos-kernels back-end?

static_assert(! has_conj< ::std::size_t>::value);
static_assert(! has_conj<float>::value);
static_assert(! has_conj<double>::value);
static_assert(! has_conj<nonarithmetic_real>::value);

static_assert(has_conj<std::complex<float>>::value);
Expand Down
Loading