[Gsll-devel] small modification to blas2.lisp
Liam Healy
lhealy at common-lisp.net
Wed May 14 21:02:02 UTC 2008
On Wed, May 14, 2008 at 2:23 PM, Mirko Vukovic <mirko.vukovic at gmail.com> wrote:
> Hi,
>
> I was playing with gsll and blas. I modified the cblas-transpose
> definition in blas2.lisp (see top of file) to capture a few more
> values:
>
> Here is the new version:
>
> (cffi:defcenum cblas-transpose
> "CBLAS_TRANSPOSE from /usr/include/gsl/gsl_cblas.h."
> (:notrans 111) (:trans 112) (:conjtrans 113))
I fail to see the difference with what is in there now:
(cffi:defcenum cblas-transpose
"CBLAS_TRANSPOSE from /usr/include/gsl/gsl_cblas.h."
(:notrans 111) :trans :conjtrans)
See http://common-lisp.net/project/cffi/manual/html_node/defcenum.html#defcenum
"If value is omitted its value will either be 0, if it's the first
entry, or it it will continue the progression from the last specified
value."
so :trans gets 112, :conjtrans 113 by default.
>
> I am posting it here because I was not able to download with svn so I
> don't have versioning for gsll.
>
> Also, here is a code snippet that I used to test for tridiagonal
> matrix solving that also uses gsll-s blas2 routine gemv to double
> check that things work.
>
> (in-package :gsll)
> ;; solve a tridiagonal system and then verify result by matrix multiplication
> ;; uses solve-tridiagonal and gemv
> (let* ((dim 6)
> (dim- (- dim 1)))
> (let ((d (make-array dim :element-type 'double-float :initial-element -2.d0))
> (e (make-array dim- :element-type 'double-float :initial-element 0.2d0))
> (f (make-array dim- :element-type 'double-float :initial-element 1.d0))
> (x (make-array dim :element-type 'double-float :initial-element 0.d0))
> (b (make-array dim :element-type 'double-float :initial-element 0.5d0))
> (mat (make-array (list dim dim)
> :element-type 'double-float
> :initial-element 0.d0)))
>
> ;; load matrix
> (loop for i from 0 below dim-
> do (progn
> (setf (aref mat i i) (aref d i))
> (setf (aref mat (+ i 1) i) (aref f i))
> (setf (aref mat i (+ i 1)) (aref e i))))
> (setf (aref mat dim- dim-) (aref d dim-))
>
> ;; gsl operations
> (letm ((d* (vector-double-float d))
> (e* (vector-double-float e))
> (f* (vector-double-float f))
> (x* (vector-double-float x))
> (b* (vector-double-float b))
> (v2* (vector-double-float
> (make-array dim :element-type 'double-float
> :initial-element 0.d0)))
> (mat* (matrix-double-float mat)))
> (solve-tridiagonal d* e* f* b* x*)
> ;; gemv returns the result in the last argument
> (gemv :notrans 1.d0 mat* x* 0.d0 v2*)
> (data v2*))))
>
> I am sure this code betrays my lack of lisp experience. So feel free
> to clean it up if you want it included in the verification part.
>
> Mirko
I might make a few simplifications; #'1- to do decrementing and
I don't think there's a need to make arrays in CL and then remake
them on the foreign side. It is possibly a candidate for
example/ regression tests.
Liam
More information about the gsll-devel
mailing list