Files
tssc-hpcg/src/ComputeSPMV_ref.cpp
2026-01-18 20:37:50 +08:00

75 lines
1.8 KiB
C++

//@HEADER
// ***************************************************
//
// HPCG: High Performance Conjugate Gradient Benchmark
//
// Contact:
// Michael A. Heroux ( maherou@sandia.gov)
// Jack Dongarra (dongarra@eecs.utk.edu)
// Piotr Luszczek (luszczek@eecs.utk.edu)
//
// ***************************************************
//@HEADER
/*!
@file ComputeSPMV_ref.cpp
HPCG routine
*/
#include "ComputeSPMV_ref.hpp"
#ifndef HPCG_NO_MPI
#include "ExchangeHalo.hpp"
#endif
#ifndef HPCG_NO_OPENMP
#include <omp.h>
#endif
#include <cassert>
/*!
Routine to compute matrix vector product y = Ax where:
Precondition: First call exchange_externals to get off-processor values of x
This is the reference SPMV implementation. It CANNOT be modified for the
purposes of this benchmark.
@param[in] A the known system matrix
@param[in] x the known vector
@param[out] y the On exit contains the result: Ax.
@return returns 0 upon success and non-zero otherwise
@see ComputeSPMV
*/
int ComputeSPMV_ref(const SparseMatrix& A, Vector& x, Vector& y)
{
assert(x.localLength >= A.localNumberOfColumns); // Test vector lengths
assert(y.localLength >= A.localNumberOfRows);
#ifndef HPCG_NO_MPI
ExchangeHalo(A, x);
#endif
const double* const xv = x.values;
double* const yv = y.values;
const local_int_t nrow = A.localNumberOfRows;
#ifndef HPCG_NO_OPENMP
#pragma omp parallel for
#endif
for (local_int_t i = 0; i < nrow; i++)
{
double sum = 0.0;
const double* const cur_vals = A.matrixValues[i];
const local_int_t* const cur_inds = A.mtxIndL[i];
const int cur_nnz = A.nonzerosInRow[i];
for (int j = 0; j < cur_nnz; j++)
sum += cur_vals[j] * xv[cur_inds[j]];
yv[i] = sum;
}
return 0;
}