Skip to content

Commit

Permalink
Adding ArmPL option to spmv perf_test
Browse files Browse the repository at this point in the history
  • Loading branch information
lucbv committed Jul 7, 2021
1 parent dea9924 commit f984f82
Show file tree
Hide file tree
Showing 3 changed files with 213 additions and 6 deletions.
39 changes: 33 additions & 6 deletions perf_test/sparse/KokkosSparse_spmv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include <KokkosKernels_IOUtils.hpp>
#include <KokkosSparse_spmv.hpp>
#include "KokkosKernels_default_types.hpp"
#include <spmv/KokkosKernels_spmv_data.hpp>
#include <spmv/Kokkos_SPMV.hpp>
#include <spmv/Kokkos_SPMV_Inspector.hpp>

Expand All @@ -74,7 +75,11 @@
#include <OpenMPSmartStatic_SPMV.hpp>
#endif

enum {KOKKOS, MKL, CUSPARSE, KK_KERNELS, KK_KERNELS_INSP, KK_INSP, OMP_STATIC, OMP_DYNAMIC, OMP_INSP};
#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL
#include <spmv/ArmPL_SPMV.hpp>
#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;
Expand All @@ -83,9 +88,9 @@ typedef default_size_type Offset;
typedef default_layout Layout;

template<typename AType, typename XType, typename YType>
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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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<Scalar, double>::value || std::is_same<Scalar, float>::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);
Expand Down Expand Up @@ -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);
Expand All @@ -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<loop;i++) {
Kokkos::Timer timer;
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);
Kokkos::fence();
double time = timer.seconds();
ave_time += time;
Expand Down Expand Up @@ -263,7 +288,7 @@ void print_help() {
printf(" omp-dynamic,omp-static (Standard OpenMP)\n");
printf(" omp-insp (OpenMP Structure Inspection)\n");
#endif
printf(" mkl,cusparse (Vendor Libraries)\n\n");
printf(" mkl, armpl,cusparse (Vendor Libraries)\n\n");
printf(" --schedule [SCH]: Set schedule for kk variant (static,dynamic,auto [ default ]).\n");
printf(" -f [file] : Read in Matrix Market formatted text file 'file'.\n");
printf(" -fb [file] : Read in binary Matrix files 'file'.\n");
Expand Down Expand Up @@ -308,6 +333,8 @@ int main(int argc, char **argv)
}
if((strcmp(argv[i],"mkl")==0))
test = MKL;
if((strcmp(argv[i],"armpl")==0))
test = ARMPL;
if((strcmp(argv[i],"kk")==0))
test = KOKKOS;
if((strcmp(argv[i],"cusparse")==0))
Expand Down
83 changes: 83 additions & 0 deletions perf_test/sparse/spmv/ArmPL_SPMV.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
//@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 ARMPL_SPMV_HPP_
#define ARMPL_SPMV_HPP_

#ifdef KOKKOSKERNELS_ENABLE_TPL_ARMPL
#include <armpl.h>

template<typename Scalar>
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<float>(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<double>(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<typename AType, typename XType, typename YType>
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<Scalar>(data->A, x.data(), y.data());
}

#endif // KOKKOSKERNELS_ENABLE_TPL_ARMPL
#endif // ARMPL_SPMV_HPP_
97 changes: 97 additions & 0 deletions perf_test/sparse/spmv/KokkosKernels_spmv_data.hpp
Original file line number Diff line number Diff line change
@@ -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_ */

0 comments on commit f984f82

Please sign in to comment.