Package com.github.fommil.netlib

Source Code of com.github.fommil.netlib.Benchmarks

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;
  }
}
TOP

Related Classes of com.github.fommil.netlib.Benchmarks

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.