fuchsia / third_party / llvm-test-suite / refs/tags/llvmorg-12.0.1 / . / MultiSource / Benchmarks / SciMark2-C / SparseCompRow.c

/* 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; | |

} | |

} | |

} | |