package org.gwtnode.examples.scimark.impl; public class SparseCompRow { /* multiple iterations used to make kernel have roughly same granulairty as other Scimark kernels. */ public static double 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[]. */ public static void matmult( double y[], double val[], int row[], int col[], double x[], int NUM_ITERATIONS) { int M = row.length - 1; for (int reps=0; reps<NUM_ITERATIONS; reps++) { for (int r=0; r<M; r++) { double sum = 0.0; int rowR = row[r]; int rowRp1 = row[r+1]; for (int i=rowR; i<rowRp1; i++) sum += x[ col[i] ] * val[i]; y[r] = sum; } } } }