/* multiple iterations used to make kernel have roughly | |
same granulairty as other Scimark kernels. */ | |
double SparseCompRow_num_flops(int N, int nz, int num_iterations) | |
{ | |
/* Note that if nz does not divide N evenly, then the | |
actual number of nonzeros used is adjusted slightly. | |
*/ | |
int actual_nz = (nz/N) * N; | |
return ((double)actual_nz) * 2.0 * ((double) num_iterations); | |
} | |
/* computes a matrix-vector multiply with a sparse matrix | |
held in compress-row format. If the size of the matrix | |
in MxN with nz nonzeros, then the val[] is the nz nonzeros, | |
with its ith entry in column col[i]. The integer vector row[] | |
is of size M+1 and row[i] points to the begining of the | |
ith row in col[]. | |
*/ | |
void SparseCompRow_matmult( int M, double *y, double *val, int *row, | |
int *col, double *x, int NUM_ITERATIONS) | |
{ | |
int reps; | |
int r; | |
int i; | |
for (reps=0; reps<NUM_ITERATIONS; reps++) | |
{ | |
for (r=0; r<M; r++) | |
{ | |
double sum = 0.0; | |
int rowR = row[r]; | |
int rowRp1 = row[r+1]; | |
for (i=rowR; i<rowRp1; i++) | |
sum += x[ col[i] ] * val[i]; | |
y[r] = sum; | |
} | |
} | |
} | |