Skip to content

Commit 82a010c

Browse files
authored
Merge pull request #210 from NexGenAnalytics/gemv_kokkos_fixes
[ready] gemv kokkos: fix tolerances in test and constraint in impl
2 parents 0804c2e + bd5e8de commit 82a010c

File tree

3 files changed

+18
-14
lines changed

3 files changed

+18
-14
lines changed

tests/kokkos-based/overwriting_matrix_vector_product.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void kokkos_blas_overwriting_gemv_impl(A_t A, x_t x, y_t y)
5151
// check A and y
5252
std::size_t count=0;
5353
for (std::size_t i=0; i<extent0; ++i){
54-
EXPECT_FLOAT_EQ(y(i), y_gold(i));
54+
EXPECT_NEAR(y(i), y_gold(i), 1e-2);
5555
for (std::size_t j=0; j<extent1; ++j){
5656
EXPECT_FLOAT_EQ(A(i,j), A_preKernel[count++]);
5757
}
@@ -67,7 +67,7 @@ void kokkos_blas_overwriting_gemv_impl(A_t A, x_t x, y_t y)
6767
// check A and y
6868
std::size_t count=0;
6969
for (std::size_t i=0; i<extent0; ++i){
70-
EXPECT_DOUBLE_EQ(y(i), y_gold(i));
70+
EXPECT_NEAR(y(i), y_gold(i), 1e-9);
7171
for (std::size_t j=0; j<extent1; ++j){
7272
EXPECT_DOUBLE_EQ(A(i,j), A_preKernel[count++]);
7373
}
@@ -84,8 +84,8 @@ void kokkos_blas_overwriting_gemv_impl(A_t A, x_t x, y_t y)
8484
// check A and y
8585
std::size_t count=0;
8686
for (std::size_t i=0; i<extent0; ++i){
87-
EXPECT_DOUBLE_EQ(y(i).real(), y_gold(i).real());
88-
EXPECT_DOUBLE_EQ(y(i).imag(), y_gold(i).imag());
87+
EXPECT_NEAR(y(i).real(), y_gold(i).real(), 1e-9);
88+
EXPECT_NEAR(y(i).imag(), y_gold(i).imag(), 1e-9);
8989

9090
for (std::size_t j=0; j<extent1; ++j){
9191
EXPECT_DOUBLE_EQ(A(i,j).real(), A_preKernel[count].real());

tests/kokkos-based/updating_matrix_vector_product.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void kokkos_blas_updating_gemv_impl(A_t A, x_t x, y_t y, z_t z)
5252
// check A, z, y
5353
std::size_t count=0;
5454
for (std::size_t i=0; i<extent0; ++i){
55-
EXPECT_FLOAT_EQ(z(i), z_gold(i));
55+
EXPECT_NEAR(z(i), z_gold(i), 1e-2);
5656
EXPECT_FLOAT_EQ(y(i), y_preKernel[i]);
5757
for (std::size_t j=0; j<extent1; ++j){
5858
EXPECT_FLOAT_EQ(A(i,j), A_preKernel[count++]);
@@ -69,8 +69,8 @@ void kokkos_blas_updating_gemv_impl(A_t A, x_t x, y_t y, z_t z)
6969
// check A, y, z
7070
std::size_t count=0;
7171
for (std::size_t i=0; i<extent0; ++i){
72-
EXPECT_FLOAT_EQ(z(i), z_gold(i));
73-
EXPECT_FLOAT_EQ(y(i), y_preKernel[i]);
72+
EXPECT_NEAR(z(i), z_gold(i), 1e-9);
73+
EXPECT_DOUBLE_EQ(y(i), y_preKernel[i]);
7474
for (std::size_t j=0; j<extent1; ++j){
7575
EXPECT_DOUBLE_EQ(A(i,j), A_preKernel[count++]);
7676
}
@@ -87,8 +87,8 @@ void kokkos_blas_updating_gemv_impl(A_t A, x_t x, y_t y, z_t z)
8787
// check A, y, z
8888
std::size_t count=0;
8989
for (std::size_t i=0; i<extent0; ++i){
90-
EXPECT_DOUBLE_EQ(z(i).real(), z_gold(i).real());
91-
EXPECT_DOUBLE_EQ(z(i).imag(), z_gold(i).imag());
90+
EXPECT_NEAR(z(i).real(), z_gold(i).real(), 1e-9);
91+
EXPECT_NEAR(z(i).imag(), z_gold(i).imag(), 1e-9);
9292

9393
EXPECT_DOUBLE_EQ(y(i).real(), y_preKernel[i].real());
9494
EXPECT_DOUBLE_EQ(y(i).imag(), y_preKernel[i].imag());

tpl-implementations/include/experimental/__p1673_bits/kokkos-kernels/blas2_gemv_kk.hpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ T get_scaling_factor(Accessor /*a*/, T /*v*/) {
1515

1616
template<class Accessor, class S, class T>
1717
auto get_scaling_factor(std::experimental::linalg::accessor_scaled<Accessor,S> a,
18-
T /*v*/)
18+
T /*v*/)
1919
{
2020
return T(a.scale_factor());
2121
}
2222

23-
} //end anon namespace
23+
} //end gemv_impl namespace
24+
2425

2526
//
2627
// overwriting gemv: y = Ax
@@ -193,7 +194,10 @@ template<//class ExecSpace,
193194
class ElementType_z,
194195
std::experimental::extents<>::size_type ext_z,
195196
class Layout_z>
196-
void matrix_vector_product(kokkos_exec<>,
197+
std::enable_if_t<
198+
!std::is_same_v< Accessor_y, std::experimental::default_accessor<ElementType_y>>
199+
>
200+
matrix_vector_product(kokkos_exec<>,
197201
std::experimental::mdspan<
198202
ElementType_A,
199203
std::experimental::extents<numRows_A, numCols_A>,
@@ -235,8 +239,8 @@ void matrix_vector_product(kokkos_exec<>,
235239
using yv_t = typename decltype(y)::value_type;
236240
using zv_t = typename decltype(z)::value_type;
237241

238-
// z = alpha1*y
239-
auto alpha1 = gemv_impl::get_scaling_factor(y.accessor(), yv_t{});
242+
// z = alpha1*y, we know from constraint y has non default accessor
243+
auto alpha1 = y.accessor().scale_factor();
240244
constexpr zv_t zero(0);
241245
KokkosBlas::axpby(alpha1, y_view, zero, z_view);
242246

0 commit comments

Comments
 (0)