1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
//@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 TEST_FUNCTOR_ANALYSIS_HPP
#define TEST_FUNCTOR_ANALYSIS_HPP
#include <gtest/gtest.h>
#include <Kokkos_Core.hpp>
/*--------------------------------------------------------------------------*/
namespace Test {
struct TestFunctorAnalysis_03 {
struct value_type {
double x[2];
};
KOKKOS_INLINE_FUNCTION
void operator()(int, value_type&) const {}
KOKKOS_INLINE_FUNCTION
void join(value_type&, value_type const&) const {}
KOKKOS_INLINE_FUNCTION static void init(value_type&) {}
};
struct TestFunctorAnalysis_04 {
KOKKOS_INLINE_FUNCTION
void operator()(int, float&) const {}
KOKKOS_INLINE_FUNCTION
void join(float&, float const&) const {}
KOKKOS_INLINE_FUNCTION static void init(float&) {}
};
template <class ExecSpace>
void test_functor_analysis() {
//------------------------------
auto c01 = KOKKOS_LAMBDA(int){};
using A01 =
Kokkos::Impl::FunctorAnalysis<Kokkos::Impl::FunctorPatternInterface::FOR,
Kokkos::RangePolicy<ExecSpace>,
decltype(c01), void>;
using R01 = typename A01::Reducer;
static_assert(std::is_void_v<typename A01::value_type>);
static_assert(std::is_void_v<typename A01::pointer_type>);
static_assert(std::is_void_v<typename A01::reference_type>);
static_assert(std::is_same_v<typename R01::functor_type, decltype(c01)>);
static_assert(!A01::has_join_member_function);
static_assert(!A01::has_init_member_function);
static_assert(!A01::has_final_member_function);
static_assert(A01::StaticValueSize == 0);
ASSERT_EQ(R01(c01).length(), 0);
//------------------------------
auto c02 = KOKKOS_LAMBDA(int, double&){};
using A02 = Kokkos::Impl::FunctorAnalysis<
Kokkos::Impl::FunctorPatternInterface::REDUCE,
Kokkos::RangePolicy<ExecSpace>, decltype(c02), void>;
using R02 = typename A02::Reducer;
static_assert(std::is_same_v<typename A02::value_type, double>);
static_assert(std::is_same_v<typename A02::pointer_type, double*>);
static_assert(std::is_same_v<typename A02::reference_type, double&>);
static_assert(std::is_same_v<typename R02::functor_type, decltype(c02)>);
static_assert(!A02::has_join_member_function);
static_assert(!A02::has_init_member_function);
static_assert(!A02::has_final_member_function);
static_assert(A02::StaticValueSize == sizeof(double));
ASSERT_EQ(R02(c02).length(), 1);
//------------------------------
TestFunctorAnalysis_03 c03;
using A03 = Kokkos::Impl::FunctorAnalysis<
Kokkos::Impl::FunctorPatternInterface::REDUCE,
Kokkos::RangePolicy<ExecSpace>, TestFunctorAnalysis_03, void>;
using R03 = typename A03::Reducer;
static_assert(std::is_same_v<typename A03::value_type,
TestFunctorAnalysis_03::value_type>);
static_assert(std::is_same_v<typename A03::pointer_type,
TestFunctorAnalysis_03::value_type*>);
static_assert(std::is_same_v<typename A03::reference_type,
TestFunctorAnalysis_03::value_type&>);
static_assert(
std::is_same_v<typename R03::functor_type, TestFunctorAnalysis_03>);
static_assert(A03::has_join_member_function);
static_assert(A03::has_init_member_function);
static_assert(!A03::has_final_member_function);
static_assert(A03::StaticValueSize ==
sizeof(TestFunctorAnalysis_03::value_type));
ASSERT_EQ(R03(c03).length(), 1);
//------------------------------
TestFunctorAnalysis_04 c04;
using A04 = Kokkos::Impl::FunctorAnalysis<
Kokkos::Impl::FunctorPatternInterface::REDUCE,
Kokkos::RangePolicy<ExecSpace>, TestFunctorAnalysis_04, float>;
using R04 = typename A04::Reducer;
static_assert(std::is_same_v<typename A04::value_type, float>);
static_assert(
std::is_same_v<typename A04::pointer_type, typename A04::value_type*>);
static_assert(
std::is_same_v<typename A04::reference_type, typename A04::value_type&>);
static_assert(
std::is_same_v<typename R04::functor_type, TestFunctorAnalysis_04>);
static_assert(A04::has_join_member_function);
static_assert(A04::has_init_member_function);
static_assert(!A04::has_final_member_function);
static_assert(A04::StaticValueSize == sizeof(typename A04::value_type));
ASSERT_EQ(R04(c04).length(), 1);
}
TEST(TEST_CATEGORY, functor_analysis) {
test_functor_analysis<TEST_EXECSPACE>();
}
} // namespace Test
/*--------------------------------------------------------------------------*/
#endif /* #ifndef TEST_FUNCTOR_ANALYSIS_HPP */
|