transposed matrix multiplication (in blas2,3) bugfixes
Liam Healy
lhealy at common-lisp.net
Wed Dec 25 17:23:10 UTC 2013
Thanks for the report, fixed in 1107fc49bc, currently on the
antik-multiple-systems branch but merged into master soon.
Liam
On Wed, Jul 17, 2013 at 2:35 PM, Mirko Vukovic <mirko.vukovic at gmail.com>wrote:
> matrix-product in blas3.lisp calls the gsl_blas gemm routine. It has
> optional parameters TransA and TransB to specify whether the matrices A
> and/or B should be transposed prior to multiplying. These two take values
> :trans or :notrans.
>
> The bug is twofold. matrix-product calls matrix-product-dimensions
> (defined in blas2). To do its job properly, matrix-product-dimensions
> should have TransA and TransB as parameters, and matrix-product should call
> it with those as arguments.
>
> Here is the modified matrix-product-dimensions:
>
> (defun matrix-product-dimensions (a b &optional (TRANSA :NOTRANS) (TRANSB
> :NOTRANS))
> (if (typep b 'grid:matrix)
> (list (funcall (case transa
> (:notrans #'first)
> (:trans #'second)
> (t (error "Invalid tranposition keyword, ~a" transa)))
> (grid:dimensions a))
> (funcall (case transb
> (:notrans #'second)
> (:trans #'first)
> (t (error "Invalid tranposition keyword, ~a" transb)))
> (grid:dimensions b)))
> (first (funcall (case transa
> (:notrans #'first)
> (:trans #'second)
> (t (error "Invalid tranposition keyword, ~a" transa)))
> (grid:dimensions a)))))
>
> This can probably be improved. I applied the same fix to the case when b
> is not a matrix, since matrix-product in blas2 which works on matrix x
> vector, also accepts that TransB argument.
>
> Finally matrix-product has to be fixed. It is defined in both blas2 (for
> matrix vector multiplication) and in blas3 (for matrix matrix
> multiplication). The modifications consist of modifying the call to
> matrix-product-dimensions to include TransA (and TransB)
>
> ;; blas2
> (defmfun matrix-product
> ((A grid:matrix) (x vector)
> &optional
> y
> (alpha 1) (beta 1) (TransA :notrans) TransB
> &aux
> (yarr
> (grid:ensure-foreign-array
> y (matrix-product-dimensions A x TransA) element-type 0)))
> ("gsl_blas_" :type "gemv")
> ((transa cblas-transpose) (alpha :element-c-type) ((mpointer A) :pointer)
> ((mpointer x) :pointer) (beta :element-c-type) ((mpointer yarr)
> :pointer))
> :definition :generic
> :element-types #+fsbv :float-complex #-fsbv :float
> :inputs (A x)
> :outputs (yarr)
> :documentation ; FDL
> "If the second and third arguments are vectors, compute
> the matrix-vector product and sum
> y = alpha op(A) x + beta y, where op(A) = A, A^T, A^H
> for TransA = :notrans, :trans, :conjtrans.
> If the second and third arguments are matrices, compute
> the matrix-matrix product and sum C = alpha
> op(A) op(B) + beta C where op(A) = A, A^T, A^H for TransA =
> :notrans, :trans, :conjtrans and similarly for the
> parameter TransB.")
>
> ;; blas3
> (defmfun matrix-product
> ((A grid:matrix) (B grid:matrix)
> &optional
> C
> (alpha 1) (beta 1) (TransA :notrans) (TransB :notrans)
> &aux
> (Carr
> (or C
> (grid:make-foreign-array element-type :dimensions
> (matrix-product-dimensions A B TransA TransB)
> :initial-element 0))))
> ("gsl_blas_" :type "gemm")
> ((TransA cblas-transpose) (TransB cblas-transpose)
> (alpha :element-c-type) ((mpointer A) :pointer)
> ((mpointer B) :pointer) (beta :element-c-type) ((mpointer Carr)
> :pointer))
> :definition :methods
> :element-types #+fsbv :float-complex #-fsbv :float
> :inputs (A B Carr)
> :outputs (Carr))
>
>
> I did not test this exhaustively, but the modifications did work my a few
> matrix multiplications that I needed.
>
> Mirko
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/gsll-devel/attachments/20131225/36a6abd3/attachment.html>
More information about the gsll-devel
mailing list