30 #define SACADO_VIEW_CUDA_HIERARCHICAL 1
31 #define SACADO_ALIGN_SFAD 1
37 #include "Kokkos_Timer.hpp"
39 template <
typename ViewTypeA,
typename ViewTypeB,
typename ViewTypeC>
42 typedef typename Kokkos::ThreadLocalScalarType<ViewTypeC>::type scalar_type;
43 typedef typename ViewTypeC::execution_space execution_space;
45 #if defined (KOKKOS_ENABLE_CUDA)
47 const unsigned vector_size = is_cuda ? 32 : 1;
48 const unsigned team_size = is_cuda ? 128 / vector_size : 1;
49 #elif defined (KOKKOS_ENABLE_HIP)
51 const unsigned vector_size = is_hip ? 64 : 1;
52 const unsigned team_size = is_hip ? 128 / vector_size : 1;
54 const unsigned vector_size = 1;
55 const unsigned team_size = 1;
58 const int m = A.extent(0);
59 const int n = A.extent(1);
60 const int range = (m+team_size-1)/team_size;
62 typedef Kokkos::TeamPolicy<execution_space> Policy;
64 Policy( range,team_size,vector_size ),
65 KOKKOS_LAMBDA (
const typename Policy::member_type& team) {
66 const int i = team.league_rank()*team.team_size() + team.team_rank();
71 for (
int j=0; j<n; ++j)
78 template <
typename ViewTypeA,
typename ViewTypeB,
typename ViewTypeC>
82 const double tol = 1.0e-14;
83 typedef typename ViewTypeC::value_type value_type;
84 typename ViewTypeC::HostMirror h_c = Kokkos::create_mirror_view(c);
85 Kokkos::deep_copy(h_c, c);
86 const size_t m = A.extent(0);
87 const size_t n = A.extent(1);
88 const size_t p = Kokkos::dimension_scalar(A);
89 for (
size_t i=0;
i<m; ++
i) {
90 for (
size_t j=0; j<
p; ++j) {
91 value_type t = (j == p-1 ? n : 2*n);
93 std::cout <<
"Comparison failed! " <<
i <<
"," << j <<
" : "
94 << h_c(
i).fastAccessDx(j) <<
" , " << t << std::endl;
100 template <
typename FadType,
typename ... ViewArgs>
103 const size_t nloop,
const bool check)
105 typedef Kokkos::View<
FadType**, ViewArgs...> ViewTypeA;
106 typedef Kokkos::View<FadType*, ViewArgs...> ViewTypeB;
107 typedef Kokkos::View<FadType*, ViewArgs...> ViewTypeC;
108 typedef typename ViewTypeA::execution_space execution_space;
110 #if defined (KOKKOS_ENABLE_CUDA)
112 const int FadStride = is_cuda ? 32 : 1;
113 #elif defined (KOKKOS_ENABLE_HIP)
115 const int FadStride = is_hip ? 64 : 1;
117 const int FadStride = 1;
120 #if defined(SACADO_ALIGN_SFAD)
122 const int Nalign = ((N+FadStride-1)/FadStride)*FadStride;
123 const size_t pa = N > 0 ? ((p+FadStride-1)/FadStride)*FadStride :
p;
124 typedef typename FadType::template apply_N<Nalign>::type AlignedFadType;
126 typedef FadType AlignedFadType;
134 typedef Kokkos::View<AlignedFadType**, ConLayoutA, execution_space> ConViewTypeA;
135 typedef Kokkos::View<AlignedFadType*, ConLayoutB, execution_space> ConViewTypeB;
136 typedef Kokkos::View<AlignedFadType*, ConLayoutC, execution_space> ConViewTypeC;
138 ConViewTypeA
A(
"A",m,n,pa+1);
139 ConViewTypeB b(
"B",n,pa+1);
140 ConViewTypeC
c(
"c",m,pa+1);
145 Kokkos::deep_copy(
typename ConViewTypeA::array_type(A), 1.0);
146 Kokkos::deep_copy(
typename ConViewTypeB::array_type(b), 1.0);
148 Kokkos::Timer wall_clock;
153 execution_space().fence();
156 for (
size_t l=0; l<nloop; l++) {
159 execution_space().fence();
161 perf.
time = wall_clock.seconds() / nloop;
175 #define INST_FUNC_FAD_DEV(FAD,DEV) \
176 template Perf do_time_fad_hierarchical< FAD, Kokkos::LayoutLeft, DEV > ( const size_t m, const size_t n, const size_t p, const size_t nloop, const bool check ); \
177 template Perf do_time_fad_hierarchical< FAD, Kokkos::LayoutRight, DEV > ( const size_t m, const size_t n, const size_t p, const size_t nloop, const bool check ); \
178 template Perf do_time_fad_hierarchical< FAD, DEV > ( const size_t m, const size_t n, const size_t p, const size_t nloop, const bool check );
180 #define INST_FUNC_DEV(DEV) \
181 INST_FUNC_FAD_DEV( SFad_type, DEV ) \
182 INST_FUNC_FAD_DEV( SLFad_type, DEV )
184 #ifdef KOKKOS_ENABLE_SERIAL
188 #ifdef KOKKOS_ENABLE_OPENMP
192 #ifdef KOKKOS_ENABLE_THREADS
196 #ifdef KOKKOS_ENABLE_CUDA
200 #ifdef KOKKOS_ENABLE_HIP
std::enable_if< !Kokkos::is_view_fad< View2 >::value, bool >::type check(const View1 &v_gold, const View2 &v, const double tol)
void run_mat_vec_hierarchical(const ViewTypeA &A, const ViewTypeB &b, const ViewTypeC &c)
void check_deriv_hierarchical(const ViewTypeA &A, const ViewTypeB &b, const ViewTypeC &c)
Sacado::Fad::DFad< double > FadType
Base template specification for static size.
#define INST_FUNC_DEV(DEV)
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
Sacado::Fad::SFad< double, SFadSize > SFad_type
Perf do_time_fad_hierarchical(const size_t m, const size_t n, const size_t p, const size_t nloop, const bool check)
expr expr expr fastAccessDx(i)) FAD_UNARYOP_MACRO(exp
Sacado::Fad::SLFad< double, SLFadSize > SLFad_type