Hi all,

I implemented fast matrix multiplication in GroovyLab using OpenBLAS as:

final public Matrix multiply( double[][] that)  {

double [] flmThis = Mat.oneDTransposeDoubleArray(d);   // construct a FloatMatrix for the receiver
double [] flmThat = Mat.oneDTransposeDoubleArray(that);  // construct a FloatMatrix for the argument
int Arows = Nrows(); int Acolumns = Ncols();
int Ccolumns = that.length;
double [] result = new double[Arows*Ccolumns];
double alpha=1.0;
double beta=0.0;
int lda = Arows;
int ldb = Acolumns;
int ldc = Arows;
// perform the multiplication using openblas
cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, Arows, Ccolumns,  Acolumns, alpha, flmThis, lda, flmThat, ldb, beta,
result, ldc);

double [][] rd = new double[Arows][Ccolumns];
int cnt = 0;
int r = 0;
int c = 0;
while (c < Ccolumns) {
r=0;
while (r < Arows ) {
rd[r][c] = result[cnt];
cnt++;
r++;
}
c++;
}
return new Matrix(rd);
}

public Matrix multiply( Matrix that)  {

return multiply(that.d);
}

however, calling it on Matrix objects is slow:

n=2000

x=rand(n,n)

tic()
xx=x*x   // Matrix * Matrix, slow however the method that calls OpenBLAS is called
tm=toc()   // delays a lot!!

but however on double[][] * Matrix is very fast:

n=2000

x=rand(n,n)

tic()
xx=x.d * x   // double[][] * Matrix, is very fast !!
tm=toc()    // very fast, uses OpenBLAS

What can happen here?

Best Regards

Stergios