jnt.scimark2.kernel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scimark Show documentation
Show all versions of scimark Show documentation
SciMark 2.0 is a Java benchmark for scientific and numerical
computing. It measures several computational kernels and reports a composite
score in approximate Mflops (Millions of floating point operations per
second).
The newest version!
package jnt.scimark2;
public class kernel
{
// each measurement returns approx Mflops
public static double measureFFT(int N, double mintime, Random R)
{
// initialize FFT data as complex (N real/img pairs)
double x[] = RandomVector(2*N, R);
double oldx[] = NewVectorCopy(x);
long cycles = 1;
Stopwatch Q = new Stopwatch();
while(true)
{
Q.start();
for (int i=0; i= mintime)
break;
cycles *= 2;
}
// approx Mflops
final double EPS = 1.0e-10;
if ( FFT.test(x) / N > EPS )
return 0.0;
return FFT.num_flops(N)*cycles/ Q.read() * 1.0e-6;
}
public static double measureSOR(int N, double min_time, Random R)
{
double G[][] = RandomMatrix(N, N, R);
Stopwatch Q = new Stopwatch();
int cycles=1;
while(true)
{
Q.start();
SOR.execute(1.25, G, cycles);
Q.stop();
if (Q.read() >= min_time) break;
cycles *= 2;
}
// approx Mflops
return SOR.num_flops(N, N, cycles) / Q.read() * 1.0e-6;
}
public static double measureMonteCarlo(double min_time, Random R)
{
Stopwatch Q = new Stopwatch();
int cycles=1;
while(true)
{
Q.start();
MonteCarlo.integrate(cycles);
Q.stop();
if (Q.read() >= min_time) break;
cycles *= 2;
}
// approx Mflops
return MonteCarlo.num_flops(cycles) / Q.read() * 1.0e-6;
}
public static double measureSparseMatmult(int N, int nz,
double min_time, Random R)
{
// initialize vector multipliers and storage for result
// y = A*y;
double x[] = RandomVector(N, R);
double y[] = new double[N];
// initialize square sparse matrix
//
// for this test, we create a sparse matrix wit M/nz nonzeros
// per row, with spaced-out evenly between the begining of the
// row to the main diagonal. Thus, the resulting pattern looks
// like
// +-----------------+
// +* +
// +*** +
// +* * * +
// +** * * +
// +** * * +
// +* * * * +
// +* * * * +
// +* * * * +
// +-----------------+
//
// (as best reproducible with integer artihmetic)
// Note that the first nr rows will have elements past
// the diagonal.
int nr = nz/N; // average number of nonzeros per row
int anz = nr *N; // _actual_ number of nonzeros
double val[] = RandomVector(anz, R);
int col[] = new int[anz];
int row[] = new int[N+1];
row[0] = 0;
for (int r=0; r= min_time) break;
cycles *= 2;
}
// approx Mflops
return SparseCompRow.num_flops(N, nz, cycles) / Q.read() * 1.0e-6;
}
public static double measureLU(int N, double min_time, Random R)
{
// compute approx Mlfops, or O if LU yields large errors
double A[][] = RandomMatrix(N, N, R);
double lu[][] = new double[N][N];
int pivot[] = new int[N];
Stopwatch Q = new Stopwatch();
int cycles=1;
while(true)
{
Q.start();
for (int i=0; i= min_time) break;
cycles *= 2;
}
// verify that LU is correct
double b[] = RandomVector(N, R);
double x[] = NewVectorCopy(b);
LU.solve(lu, pivot, x);
final double EPS = 1.0e-12;
if ( normabs(b, matvec(A,x)) / N > EPS )
return 0.0;
// else return approx Mflops
//
return LU.num_flops(N) * cycles / Q.read() * 1.0e-6;
}
private static double[] NewVectorCopy(double x[])
{
int N = x.length;
double y[] = new double[N];
for (int i=0; i