// 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); }