code: package com.github.fommil.netlib;
  
  import com.google.common.base.Stopwatch;
  import lombok.extern.java.Log;
  import org.netlib.util.intW;
  
  import java.util.Arrays;
  import java.util.concurrent.TimeUnit;
  
  /**
   * @author Sam Halliday
   */
  @Log
  public class Dgetri implements Benchmark.Parameterised {
    @Override
    public long benchmark(int size) {
      int m = (int) Math.sqrt(size);
  
      // random matrices are full rank (and can always be inverted if square)
      // http://www.sciencedirect.com/science/article/pii/S0096300306009040
      double[] a = Benchmarks.randomArray(m * m);
      double[] aOrig = Arrays.copyOf(a, a.length);
      double[] b = new double[1];
      int[] p = new int[m];
      intW info = new intW(0);
  
      Stopwatch watch = new Stopwatch();
  
      LAPACK.getInstance().dgetri(m, a, m, p, b, -1, info);
      //log.info(m + " supposedly has optimal work of " + b[0]);
      b = new double[(int)b[0]];
  
      watch.start();
      LAPACK.getInstance().dgetrf(m, m, a, m, p, info);
      if (info.val != 0)
        throw new IllegalArgumentException();
      LAPACK.getInstance().dgetri(m, a, m, p, b, b.length, info);
      if (info.val != 0)
        throw new IllegalArgumentException();
      watch.stop();
  
      // quick check
      double[] c = new double[m * m];
      BLAS.getInstance().dgemm("N", "N", m, m, m, 1, aOrig, m, a, m, 0, c, m);
      if (!Benchmarks.isUnit(c, m, 0.000001)) {
        Dgetri.log.warning("failed to invert matrix");
      }
  
      return watch.elapsed(TimeUnit.NANOSECONDS);
    }
  }
  