blob: 5232f68159a76e7911227e187bca95f64ea06608 [file] [log] [blame]
// See LICENSE for license details.
//**************************************************************************
// Double-precision sparse matrix-vector multiplication benchmark
//--------------------------------------------------------------------------
#include "util.h"
//--------------------------------------------------------------------------
// Input/Reference Data
#include "dataset1.h"
void spmv(int r, const double* val, const int* idx, const double* x,
const int* ptr, double* y)
{
for (int i = 0; i < r; i++)
{
int k;
double yi0 = 0, yi1 = 0, yi2 = 0, yi3 = 0;
for (k = ptr[i]; k < ptr[i+1]-3; k+=4)
{
yi0 += val[k+0]*x[idx[k+0]];
yi1 += val[k+1]*x[idx[k+1]];
yi2 += val[k+2]*x[idx[k+2]];
yi3 += val[k+3]*x[idx[k+3]];
}
for ( ; k < ptr[i+1]; k++)
{
yi0 += val[k]*x[idx[k]];
}
y[i] = (yi0+yi1)+(yi2+yi3);
}
}
//--------------------------------------------------------------------------
// Main
int main( int argc, char* argv[] )
{
double y[R];
#if PREALLOCATE
spmv(R, val, idx, x, ptr, y);
#endif
setStats(1);
spmv(R, val, idx, x, ptr, y);
setStats(0);
return verifyDouble(R, y, verify_data);
}