diff --git a/perf_test/sparse/KokkosSparse_spmv.cpp b/perf_test/sparse/KokkosSparse_spmv.cpp index bc8a6a173e..57fabcdf69 100644 --- a/perf_test/sparse/KokkosSparse_spmv.cpp +++ b/perf_test/sparse/KokkosSparse_spmv.cpp @@ -57,6 +57,7 @@ #include #include #include "KokkosKernels_default_types.hpp" +#include #include #include @@ -74,7 +75,11 @@ #include #endif -enum {KOKKOS, MKL, CUSPARSE, KK_KERNELS, KK_KERNELS_INSP, KK_INSP, OMP_STATIC, OMP_DYNAMIC, OMP_INSP}; +#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL +#include +#endif + +enum {KOKKOS, MKL, ARMPL, CUSPARSE, KK_KERNELS, KK_KERNELS_INSP, KK_INSP, OMP_STATIC, OMP_DYNAMIC, OMP_INSP}; enum {AUTO, DYNAMIC, STATIC}; typedef default_scalar Scalar; @@ -83,9 +88,9 @@ typedef default_size_type Offset; typedef default_layout Layout; template -void matvec(AType& A, XType x, YType y, Ordinal rows_per_thread, int team_size, int vector_length, int test, int schedule) { +void matvec(AType& A, XType x, YType y, Ordinal rows_per_thread, int team_size, int vector_length, spmv_additional_data* data, int schedule) { - switch(test) { + switch(data->test) { case KOKKOS: if(schedule == AUTO) @@ -125,6 +130,11 @@ void matvec(AType& A, XType x, YType y, Ordinal rows_per_thread, int team_size, case CUSPARSE: cusparse_matvec(A, x, y); break; +#endif +#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL + case ARMPL: + armpl_matvec(A, x, y, data); + break; #endif case KK_KERNELS: KokkosSparse::spmv (KokkosSparse::NoTranspose,1.0,A,x,0.0,y); @@ -160,6 +170,21 @@ int test_crs_matrix_singlevec(Ordinal numRows, Ordinal numCols, int test, const numRows = A.numRows(); numCols = A.numCols(); Offset nnz = A.nnz(); + + spmv_additional_data data(test); + +#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL + if(test == ARMPL) { + if(std::is_same::value || std::is_same::value) { + data.set_armpl_spmat(numRows, numCols, + A.graph.row_map.data(), A.graph.entries.data(), + A.values.data()); + } else { + throw std::runtime_error("Can't use ArmPL mat-vec for scalar types other than double and float."); + } + } +#endif + mv_type x("X", numCols); mv_type y("Y", numRows); h_mv_type h_x = Kokkos::create_mirror_view(x); @@ -201,7 +226,7 @@ int test_crs_matrix_singlevec(Ordinal numRows, Ordinal numCols, int test, const mv_type y1("Y1",numRows); //int nnz_per_row = A.nnz()/A.numRows(); - matvec(A,x1,y1,rows_per_thread,team_size,vector_length,test,schedule); + matvec(A,x1,y1,rows_per_thread,team_size,vector_length,&data,schedule); // Error Check Kokkos::deep_copy(h_y,y1); @@ -226,7 +251,7 @@ int test_crs_matrix_singlevec(Ordinal numRows, Ordinal numCols, int test, const double ave_time = 0.0; for(int i=0;i + +template +void armpl_matvec_wrapper(armpl_spmat_t A, Scalar* x, Scalar* y) +{ + throw std::runtime_error("Can't use ArmPL mat-vec for scalar types other than double and float."); +} + +template<> +void armpl_matvec_wrapper(armpl_spmat_t A, float* x, float* y) +{ + const float alpha = 1.0; + const float beta = 0.0; + armpl_spmv_exec_s(ARMPL_SPARSE_OPERATION_NOTRANS, + alpha, A, x, beta, y); +} + +template<> +void armpl_matvec_wrapper(armpl_spmat_t A, double* x, double* y) +{ + const double alpha = 1.0; + const double beta = 0.0; + armpl_spmv_exec_d(ARMPL_SPARSE_OPERATION_NOTRANS, + alpha, A, x, beta, y); +} + +template +void armpl_matvec(AType /*A*/, XType x, YType y, spmv_additional_data* data) { + using Scalar = typename AType::non_const_value_type; + //Run armpl spmv corresponding to scalar type + armpl_matvec_wrapper(data->A, x.data(), y.data()); +} + +#endif // KOKKOSKERNELS_ENABLE_TPL_ARMPL +#endif // ARMPL_SPMV_HPP_ diff --git a/perf_test/sparse/spmv/KokkosKernels_spmv_data.hpp b/perf_test/sparse/spmv/KokkosKernels_spmv_data.hpp new file mode 100644 index 0000000000..cd2d5e86ad --- /dev/null +++ b/perf_test/sparse/spmv/KokkosKernels_spmv_data.hpp @@ -0,0 +1,97 @@ +/* +//@HEADER +// ************************************************************************ +// +// Kokkos v. 3.0 +// Copyright (2020) 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. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the Corporation nor the names of the +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY NTESS "AS IS" AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NTESS OR THE +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Questions? Contact Luc Berger-Vergiat (lberge@sandia.gov) +// +// ************************************************************************ +//@HEADER +*/ + +#ifndef KOKKOSKERNELS_SPMV_DATA_HPP_ +#define KOKKOSKERNELS_SPMV_DATA_HPP_ + +#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL +#include "armpl.h" +#endif + +struct spmv_additional_data { + int test; + +#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL + armpl_spmat_t A; +#endif + + spmv_additional_data() = default; + + spmv_additional_data(int test_) : test(test_) { } + +#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL + void set_armpl_spmat(int numRows, int numCols, + const int* rowptrs, const int* entries, + const float* values) { + armpl_spmat_create_csr_s(&A, numRows, + numCols, + rowptrs, + entries, + values, + 0); + } + + void set_armpl_spmat(int numRows, int numCols, + const int* rowptrs, const int* entries, + const double* values) { + armpl_spmat_create_csr_d(&A, numRows, + numCols, + rowptrs, + entries, + values, + 0); + } +#endif + + ~spmv_additional_data() { + +#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL + if(test == 2) { + armpl_spmat_destroy(A); + } +#endif + } +}; + +#endif /* KOKKOSKERNELS_SPMV_DATA_HPP_ */