package com.github.fommil.netlib;
import au.com.bytecode.opencsv.CSVWriter;
import com.google.common.collect.Lists;
import lombok.Cleanup;
import lombok.extern.java.Log;
import java.io.File;
import java.io.FileWriter;
import java.util.List;
import java.util.Random;
import static java.lang.System.getProperty;
/**
* @author Sam Halliday
*/
@Log
public class Benchmarks {
public static void main(String[] args) throws Exception {
int reps = Integer.valueOf(getProperty("perf.reps", "10"));
int sets = Integer.valueOf(getProperty("perf.max", "100"));
// make sure we're all loaded
BLAS.getInstance();
LAPACK.getInstance();
ARPACK.getInstance();
List<Benchmark> benchmarks = Lists.newArrayList();
// benchmarks.add(new Linpack());
List<Benchmark.Parameterised> pBenchmarks = Lists.newArrayList();
pBenchmarks.add(new Ddot());
pBenchmarks.add(new Dgemm());
pBenchmarks.add(new Dgetri());
pBenchmarks.add(new Dsaupd());
for (Benchmark b : benchmarks) {
File file = new File(getTarget(b) + ".csv");
log.info("writing to " + file);
@Cleanup CSVWriter csv = new CSVWriter(new FileWriter(file));
for (int i = 0; i < sets; i++) {
long result = b.benchmark();
csv.writeNext(new String[]{Long.toString(result)});
}
}
double factor = 6 / 100.0;
for (Benchmark.Parameterised b : pBenchmarks) {
File file = new File(getTarget(b) + ".csv");
log.info("writing to " + file);
@Cleanup CSVWriter csv = new CSVWriter(new FileWriter(file));
for (int i = 0; i < reps; i++) {
log.info(file + " rep " + i);
for (int j = sets; j > 0; j--) {
int size = (int) Math.pow(10, factor * j);
if (size < 10) continue;
try {
long result = b.benchmark(size);
csv.writeNext(new String[]{Integer.toString(size), Long.toString(result)});
} catch (IllegalArgumentException e) {
log.info("skipping a datum...");
}
}
}
}
}
private static String getTarget(Object o) {
return (getProperty("os.name") + "-"
+ getProperty("os.arch") + "-"
+ getJvm()
+ o.getClass().getSimpleName() + "-"
+ BLAS.getInstance().getClass().getSimpleName()
).toLowerCase().replace(" ", "_");
}
private static String getJvm() {
if (getProperty("jvm.type") == null) return "";
return getProperty("jvm.type") + "-";
}
// return array of size n with normally distributed elements
public static double[] randomArray(int n) {
assert n > 0;
Random random = new Random();
double[] array = new double[n];
for (int i = 0; i < n; i++) {
array[i] = random.nextGaussian();
}
return array;
}
public static boolean within(double a, double b, double epsilon) {
return ((a - b) <= epsilon);
}
public static boolean isUnit(double[] a, int m, double epsilon) {
for (int i = 0; i < m; i++) {
int diag = m * i + i;
if (!Benchmarks.within(a[diag], 1, epsilon)) {
log.info("bad value (1) != " + a[diag]);
return false;
}
for (int j = 0; j < m; j++)
if (j != i && !Benchmarks.within(a[i * m + j], 0, epsilon)) {
log.info("bad value (0) != " + a[i * m + j]);
return false;
}
}
return true;
}
}