Clean up benchmarks; support uarch-specific counters
[riscv-tests.git] / benchmarks / spmv / spmv_main.c
1 //**************************************************************************
2 // Double-precision general matrix multiplication benchmark
3 //--------------------------------------------------------------------------
4
5 #include "util.h"
6
7 //--------------------------------------------------------------------------
8 // Input/Reference Data
9
10 #include "dataset1.h"
11
12 void spmv(int r, const double* val, const int* idx, const double* x,
13 const int* ptr, double* y)
14 {
15 for (int i = 0; i < r; i++)
16 {
17 int k;
18 double yi0 = 0, yi1 = 0, yi2 = 0, yi3 = 0;
19 for (k = ptr[i]; k < ptr[i+1]-3; k+=4)
20 {
21 yi0 += val[k+0]*x[idx[k+0]];
22 yi1 += val[k+1]*x[idx[k+1]];
23 yi2 += val[k+2]*x[idx[k+2]];
24 yi3 += val[k+3]*x[idx[k+3]];
25 }
26 for ( ; k < ptr[i+1]; k++)
27 {
28 yi0 += val[k]*x[idx[k]];
29 }
30 y[i] = (yi0+yi1)+(yi2+yi3);
31 }
32 }
33
34 //--------------------------------------------------------------------------
35 // Main
36
37 int main( int argc, char* argv[] )
38 {
39 double y[R];
40
41 #if PREALLOCATE
42 spmv(R, val, idx, x, ptr, y);
43 #endif
44
45 setStats(1);
46 spmv(R, val, idx, x, ptr, y);
47 setStats(0);
48
49 return verifyDouble(R, y, verify_data);
50 }