On Sunday, 27 December 2015 at 05:43:47 UTC, Charles McAnany
wrote:
On Saturday, 26 December 2015 at 19:57:19 UTC, Ilya Yaroshenko
wrote:
Hi,
I will write GEMM and GEMV families of BLAS for Phobos.
[...]
References:
[1] Anatomy of High-Performance Matrix Multiplication:
http://www.cs.utexas.edu/users/pingali/CS378/2008sp/papers/gotoPaper.pdf
[2] OpenBLAS https://github.com/xianyi/OpenBLAS
Happy New Year!
Ilya
I am absolutely thrilled! I've been using scid
(https://github.com/kyllingstad/scid) and cblas
(https://github.com/DlangScience/cblas) in a project, and I
can't wait to see a smooth integration in the standard library.
Couple questions:
Why will the functions be nothrow? It seems that if you try to
take the determinant of a 3x5 matrix, you should get an
exception.
Determinant is a part of LAPACK API, but not BLAS API. BTW, D
scientific code should not throw exceptions if it is possible,
because it can be integrated with C projects.
By 'tiny generic code', you mean that DGEMM, SSYMM, CTRMM, etc.
all become one function, basically?
No, it is about portability and optimisation. OpenBLAS has huge
code base it is written in assembler for various platforms. I
want to make generalise optimisation logic.
You mention that you'll have GEMM and GEMV in your features, do
you think we'll get a more complete slice of BLAS/LAPACK in the
future, like GESVD and GEES?
LAPACK can be implemented as standalone package. I hope that I
will have a time to work on it. Another way is to define new part
of Phobos with sci.* suffix.
If it's not in the plan, I'd be happy to work on re-tooling
scid and cblas to feel like std.blas. (That is, mimic how you
choose to represent a matrix, throw the same type of
exceptions, etc. But still use external libraries.)
It will be cool to see scid with Matrix type replaced by
Slice!(2, double*) / Slice!(2, float*). I will argue to do not
use any kind of Matrix type, but upcoming Slice
https://github.com/D-Programming-Language/phobos/pull/3397.
Slice!(2, double*) is generalisation of matrix type with two
strides, one for rows and one for columns. std.blas can be
implemented to support this feature out of the box. Slice!(2,
double*) do not need to have transposed flag (transpose operator
only swaps strides and lengths) and fortran_vs_C flag (column
based vs row based) is deprecated rudiment.
Ilya